é para isso que o pessoal está aqui ...
---------
só para curiosidade, uma solução bem mais simples (visto que já tens o teu programa a funcionar):
#include <stdio.h>
#include <string.h>
#define PLAYER1 'X'
#define PLAYER2 'O'
typedef struct {
struct {
char col1, col2, col3;
} line1;
struct {
char col1, col2, col3;
} line2;
struct {
char col1, col2, col3;
} line3;
} Board;
void printBoard (Board board) {
printf(" | | \n" \
" %c | %c | %c \n" \
" | | \n" \
"-------------\n" \
" | | \n" \
" %c | %c | %c \n" \
" | | \n" \
"-------------\n" \
" | | \n" \
" %c | %c | %c \n" \
" | | \n\n",
board.line1.col1, board.line1.col2, board.line1.col3,
board.line2.col1, board.line2.col2, board.line2.col3,
board.line3.col1, board.line3.col2, board.line3.col3);
}
int askPlay (char player) {
int cell = 0;
// no input validation ... this is going to be good
printf("E a vez do %c jogar: \n", player);
scanf(" %d", & cell);
return cell - 1;
}
int validatePlay (Board board, int cell) {
char * aux = (char *) & board;
if (* (aux + (cell)) != ' ') {
printf ("A celula ja se encontra seleccionada\n");
return 0;
}
return 1;
}
// lets not complicate even more by using pointer arguments
Board doPlay (Board board, int cell, char player) {
char * aux = (char *) & board;
* (aux + (cell)) = player;
return board;
}
int checkWin (Board board) {
int aux;
if ( ((aux = board.line1.col1 + board.line1.col2 + board.line1.col3) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line2.col1 + board.line2.col2 + board.line2.col3) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line3.col1 + board.line3.col2 + board.line3.col3) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line1.col1 + board.line2.col1 + board.line3.col1) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line1.col2 + board.line2.col2 + board.line3.col2) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line1.col3 + board.line2.col3 + board.line3.col3) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line1.col1 + board.line2.col2 + board.line3.col3) == PLAYER1 * 3) || (aux == PLAYER2 * 3)
|| ((aux = board.line1.col3 + board.line2.col2 + board.line3.col1) == PLAYER1 * 3) || (aux == PLAYER2 * 3))
return aux / 3;
return 0;
}
int main (void)
{
Board board;
char win = 0, validCells = 9, cell, player = PLAYER1;
memset (& board, ' ', sizeof (board));
while (!win && validCells) {
printBoard (board);
cell = askPlay (player);
if (validatePlay (board, cell)) {
board = doPlay (board, cell, player);
win = checkWin (board);
if (win) {
printBoard (board);
printf ("O jogador %c ganhou ... parabens\n", win);
} else {
--validCells;
player = player == PLAYER1 ? PLAYER2 : PLAYER1;
}
}
}
if (!win) {
printBoard (board);
printf ("... empate ... que seca ...\n");
}
return 0;
}
↧