bioinf-2023-2024-introducti.../ex0-tictactoe/tictactoe.c

126 lines
3.5 KiB
C
Raw Normal View History

/*
============================================================================
Name : tictactoe.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
/*
* 0 - nobody wins
* 1 - circles win
* 2 - crosses win
*/
int testForWin(int* board) {
// TODO make the code clean
// circles horizontal
if (board[0] == 1 && board[1] == 1 && board[2] == 1)
return 1; // circles in 1st line
if (board[3] == 1 && board[4] == 1 && board[5] == 1)
return 1; // circles in 2nd line
if (board[6] == 1 && board[7] == 1 && board[8] == 1)
return 1; // circles in 3rd line
// circle vertical
if (board[0] == 1 && board[3] == 1 && board[6] == 1)
return 1; // circles in 1st line
if (board[1] == 1 && board[4] == 1 && board[7] == 1)
return 1; // circles in 2nd line
if (board[2] == 1 && board[5] == 1 && board[8] == 1)
return 1; // circles in 3rd line
// circle diagonal
if (board[0] == 1 && board[4] == 1 && board[8] == 1)
return 1; // circles in 1st line
if (board[2] == 1 && board[4] == 1 && board[6] == 1)
return 1; // circles in 2nd line
// crosses horizontal
if (board[0] == 2 && board[1] == 2 && board[2] == 2)
return 2; // crosses in 1st line
if (board[3] == 2 && board[4] == 2 && board[5] == 2)
return 2; // crosses in 2nd line
if (board[6] == 2 && board[7] == 2 && board[8] == 2)
return 2; // crosses in 3rd line
// crosses vertical
if (board[0] == 2 && board[3] == 2 && board[6] == 2)
return 2; // crosses in 1st line
if (board[1] == 2 && board[4] == 2 && board[7] == 2)
return 2; // crosses in 2nd line
if (board[2] == 2 && board[5] == 2 && board[8] == 2)
return 2; // crosses in 3rd line
// crosses diagonal
if (board[0] == 2 && board[4] == 2 && board[8] == 2)
return 2; // crosses in 1st line
if (board[2] == 2 && board[4] == 2 && board[6] == 2)
return 2; // crosses in 2nd line
return 0;
}
void printBoard(int* board) {
// TODO make this function smaller, and clean
printf("%c | %c | %c\n",
board[0] == 1 ? 'O' : (board[0] == 2 ? 'X' : ' '),
board[1] == 1 ? 'O' : (board[1] == 2 ? 'X' : ' '),
board[2] == 1 ? 'O' : (board[2] == 2 ? 'X' : ' '));
printf("------------\n");
printf("%c | %c | %c\n",
board[3] == 1 ? 'O' : (board[3] == 2 ? 'X' : ' '),
board[4] == 1 ? 'O' : (board[4] == 2 ? 'X' : ' '),
board[5] == 1 ? 'O' : (board[5] == 2 ? 'X' : ' '));
printf("------------\n");
printf("%c | %c | %c\n",
board[6] == 1 ? 'O' : (board[6] == 2 ? 'X' : ' '),
board[7] == 1 ? 'O' : (board[7] == 2 ? 'X' : ' '),
board[8] == 1 ? 'O' : (board[8] == 2 ? 'X' : ' '));
}
int main(void) {
int board[9];
for (int i = 0; i < 9; i++)
board[i] = 0;
board[0] = 1;
board[4] = 1;
board[8] = 1;
// clean board
printBoard(board);
// logic
while (1) {
2024-03-22 09:19:56 +01:00
// TODO REMARK, if there is no reading an input
// from the user there will be here inf loop
// 1. TODO ask user for the move
// TODO validate the move (field has to be empty)
// TODO check if user wins, then print and exit
// the loop
// 2. TODO computer makes the move
2024-03-22 09:19:56 +01:00
// TODO the computer's move does not have to
// clever, but it has to be correct
// 3. TODO print the board
// 4. check if there is a winner, if there is a
// winner then exit the loop
int result = testForWin(board);
if (result != 0) {
printf("%s WINS!\n", result == 1 ? "circles" : "crosses");
break;
}
}
puts("TicTacToe finished");
return EXIT_SUCCESS;
}