Skip to content

Instantly share code, notes, and snippets.

@NoodleSushi
Last active March 16, 2023 08:21
Show Gist options
  • Save NoodleSushi/96b537acca998ba939109ca6f6e6b6d9 to your computer and use it in GitHub Desktop.
Save NoodleSushi/96b537acca998ba939109ca6f6e6b6d9 to your computer and use it in GitHub Desktop.
Tic-Tac-Toe game written in C
#include <stdio.h>
void DrawBoard(int pieceMask, int playerMask);
int CheckWinner(int pieceMask, int playerMask);
int GetPlayerInput();
char Bit2OX(int bit);
void main()
{
int boardPieceMask = 0, boardPlayerMask = 0;
int player = 0;
int winner = 0;
while (!winner)
{
DrawBoard(boardPieceMask, boardPlayerMask);
printf("It is %c's turn!\n", Bit2OX(player));
int input = -1;
while (input == -1)
{
input = GetPlayerInput();
if (input != -1 && (boardPieceMask >> input) & 1)
{
printf("area is populated\n");
input = -1;
}
}
boardPieceMask |= 0b1 << input;
if (player)
boardPlayerMask |= 0b1 << input;
player = !player;
winner = CheckWinner(boardPieceMask, boardPlayerMask);
printf("\n\n");
}
DrawBoard(boardPieceMask, boardPlayerMask);
printf("%c WINS!!!", Bit2OX(winner >> 1));
}
void DrawBoard(int pieceMask, int playerMask)
{
int y, x;
printf(" a b c\n");
for (y = 0; y < 7; y++)
{
if (y % 2 == 0)
{
printf(" ");
for (x = 0; x < 13; x++)
printf("-");
}
else
{
printf("%d ", y/2 + 1);
for (x = 0; x < 7; x++)
{
if (x % 2 == 0)
printf("| ");
else
{
char piece = ' ';
int bitOffset = x / 2 + y / 2 * 3;
if ((pieceMask >> bitOffset) & 1)
piece = Bit2OX((playerMask >> bitOffset) & 1);
printf("%c ", piece);
}
}
}
printf("\n");
}
}
char Bit2OX(int bit)
{
return bit ? 'O' : 'X';
}
int GetPlayerInput()
{
char inX, inY;
int coordIdx = -1;
scanf(" %c%c", &inX, &inY);
if (inX >= '1' && inX <= '3')
{
char temp = inX;
inX = inY;
inY = temp;
}
if (inX >= 'a' && inX <= 'c' && inY >= '1' && inY <= '3')
coordIdx = inX - 'a' + (inY - '1') * 3;
return coordIdx;
}
int CheckWinner(int piece_mask, int player_mask)
{
const int WIN_CONDITIONS[8] = {
0b001001001,
0b010010010,
0b100100100,
0b000000111,
0b000111000,
0b111000000,
0b100010001,
0b001010100,
};
int i, result = 0;
for (i = 0; !result && i < 8; i++)
{
int hasWon = (WIN_CONDITIONS[i] & piece_mask) == WIN_CONDITIONS[i];
int winningPlayer = ((WIN_CONDITIONS[i] & player_mask) > 0);
result = hasWon << winningPlayer;
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment