C Noughts and Crosses

C Noughts and Crosses

Advertisemen


#include <stdio.h>
#include <stdlib.h>

#define bool unsigned char
#define true 1
#define false 0

char **createBoard()
{
       int i;
       char** Board;
       Board = (char**) malloc (sizeof(char*)*3);
       for (i=0;i<3;i++)
              Board[i] = (char*) malloc (sizeof(char)*3);

       return Board;
}

void initBoard(char ***Board)
{
       int x,y;
       for (y=0;y<3;y++)
              for (x=0;x<3;x++)
                     (*Board)[y][x] = '.';
}

void printBoard(const char **Board)
{
       int x,y;
       printf("\n");
       for (y=0;y<3;y++)
       {
              for (x=0;x<3;x++)
                     printf("%c",Board[y][x]);
              printf("\n");
       }
       printf("\n");
}

void addPosition(char ***Board, char ascx, char ascy, char turn)
{
       int x,y;

       x = ascx - 48;
       y = ascy - 48;

       (*Board)[y][x] = turn;
}

void changeTurn(char *turn)
{
       if (*turn == 'O')
              *turn = 'X';
       else *turn = 'O';
}
lass="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; text-autospace: none;">char checkGameWon(char **Board)
{
       char symbol;
       //check centre first
       if (Board[1][1] != '.')
       {
              symbol = Board[1][1];
              //check top left diagonal and bottom right diagonal
              if (Board[0][0] == symbol && Board[2][2] == symbol)
                     return symbol;
             
              if (Board[0][2] == symbol && Board[2][0] == symbol)
                     return symbol;

              if (Board[0][1] == symbol && Board[2][1] == symbol)
                     return symbol;

              if (Board[1][0] == symbol && Board[1][2] == symbol)
                     return symbol;
       }

       //check top straights
       if (Board[0][0] != '.')
       {
              symbol = Board[0][0];
              if (Board[0][1] == symbol && Board[0][2] == symbol)
                     return symbol;

              if (Board[1][0] == symbol && Board[2][0] == symbol)
                     return symbol;
       }

       //check bottom diagonal
       if (Board[2][2] != '.')
       {
              symbol = Board[2][2];
              if (Board[2][1] == symbol && Board[2][0] == symbol)
                     return symbol;

              if (Board[1][2] == symbol && Board[0][2] == symbol)
                     return symbol;
       }

       return '.';

}

void deleteBoard(char ***Board)
{
       int i;
       for (i=0;i<3;i++)
              free((*Board)[i]);
       free(*Board);
}

bool winRoutine(char **Board)
{
       bool won = checkGameWon(Board);
       if (won != '.')
       {
              printf("\n~~~%c wins!~~~\n",won);
              return true;
       }
       return false;
}

bool isValidChar(char c)
{
       return c>=48&&c<=50;
}

bool isValidInput(char input[3], char **Board)
{
       if (!isValidChar(input[0]) || !isValidChar(input[1]))
              return false;

       //positioned char
       if (Board[input[1]-48][input[0]-48] != '.')
              return false;

       return true;
}

int main()
{
       char **Board;
       char turn = 'O';
       char won;

       Board = createBoard();
       initBoard(&Board);

       while (!winRoutine(Board))
       {
              char buffer[3];

              printBoard(Board);

              do scanf("%s",&buffer);
              while (!isValidInput(buffer,Board));

              addPosition(&Board,buffer[0],buffer[1],turn);

              changeTurn(&turn);

              while (getchar() != '\n');
       }

       deleteBoard(&Board);

       scanf("%c",&won);

       return 0;
}

Advertisemen

Disclaimer: Gambar, artikel ataupun video yang ada di web ini terkadang berasal dari berbagai sumber media lain. Hak Cipta sepenuhnya dipegang oleh sumber tersebut. Jika ada masalah terkait hal ini, Anda dapat menghubungi kami disini.

Tidak ada komentar:

Posting Komentar

© Copyright 2017 Game Engine Tutorial