#include "PointersLibs.h" #define ROWS 3 void RemoveBits(byte *row, unsigned short count) { *row >>= count; } unsigned short CountBits(byte b) { unsigned short counter = ZERO, loop_lenght = sizeof(b) * EIGHT; while (loop_lenght--) { counter += !EvenNumber(b); b >>= ONE; } return (counter); } void PrintGetRow() { printf("Enter row number (1-3): "); } void PrintGetRemoveCount() { printf("Enter many bits: "); } void PrintPlayerWon() { printf("You won!\n"); } void PrintBotWon() { printf("The bot won :(\n"); } unsigned short InputRow() { unsigned short row; scanf("%hu", &row); return (row); } unsigned short InputRemoveCount() { return (InputRow()); } unsigned short SumBits(byte *vec, unsigned short lenght) { unsigned short sum = ZERO; while (lenght--) { sum += CountBits(*(vec++)); } return (sum); } void PrintBits(byte b) { unsigned short lenght = sizeof(b) * EIGHT; while (lenght--) { printf("%hu,", !EvenNumber(b)); b >>= ONE; } } void PrintRows(byte *rows, unsigned short lenght) { while (lenght--) { PrintBits(*(rows++)); printf("\n"); } } byte * MaxBitsRow(byte *rows, unsigned short lenght) { unsigned short max_count = ZERO, temp_count; byte *max_row; while (lenght--) { temp_count = CountBits(*rows); if (temp_count > max_count) { max_count = temp_count; max_row = rows; } rows++; } return (max_row); } byte * OddMaxBitsRow(byte *rows, unsigned short length) { unsigned short max_count = ZERO, temp_count; byte *odd_max_row = MaxBitsRow(rows, length); while (length--) { if (!EvenBits(*rows)) { temp_count = CountBits(*rows); if (temp_count > max_count) { max_count = temp_count; odd_max_row = rows; } } rows++; } return (odd_max_row); } void Bot(byte *rows, unsigned short lenght) { byte *max_row = OddMaxBitsRow(rows, lenght); unsigned short sum_bits = SumBits(rows, lenght); BOOLEAN EvenArea = EvenNumber(sum_bits); unsigned short count_bits = CountBits(*max_row); unsigned short remove_count = EvenNumber(sum_bits - (count_bits / TWO)) ? (count_bits / TWO) : (count_bits / TWO) + ONE; RemoveBits(max_row, remove_count); // EvenArea ? (CountBits(*max_row) / TWO * TWO - ONE) / TWO: (CountBits(*max_row) / TWO * TWO - ONE)); } void main(void) { byte rows[ROWS] = {0x7f, 0x1f, 0x7}; unsigned short row = -ONE, remove_count = ZERO; BOOLEAN player = FALSE; while (SumBits(rows, ROWS) != ONE) { PrintRows(rows, ROWS); printf("\n\n"); row = -ONE; remove_count = ZERO; player = !player; if (player) { while (!(row < ROWS)) { PrintGetRow(); row = InputRow(); } while (!(ZERO < remove_count && remove_count <= CountBits(rows[row]))) { PrintGetRemoveCount(); remove_count = InputRemoveCount(); } RemoveBits(&rows[row], remove_count); } else { printf("Bot:\n"); Bot(rows, ROWS); } } PrintRows(rows, ROWS); printf("\n\n"); if (player) { PrintPlayerWon(); } else { PrintBotWon(); } }