184 lines
3.6 KiB
C
184 lines
3.6 KiB
C
#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();
|
|
}
|
|
}
|