I'm new to C programming and I recently challenged myself to writing a Tic-Tac-Toe program. I found that my code becomes lengthy very quickly with so many if statements. This code works as is (and I still wish to add more features). I just think there's probably a more neat/efficient way to program this. Any ideas on how to trim this?
#include <stdio.h> #include <stdlib.h> typedef int bool; #define true 1 #define false 0 int main() { playGame(); return 0; } int playGame() { char scanned[3]; printf("Do you wish to play tick-tack-toe?\n"); scanf("%s", scanned); if(strcasecmp(scanned,"yes")==0) startGame(); else { if (strcmp(scanned,"no")==0 || strcmp(scanned,"nah")==0 || strcmp(scanned,"naw")==0) { printf("That's too bad!/nThis program will now end."); return 1; } printf("Not valid input!/nThis program will now end."); return 1; } } int startGame() { //Sets up board for values 1-9; char board[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} }; bool winner = false; printf("\n\nHere is your playing board. Player One is Os and Player Two is Xs\n"); printf("Entering a number 1-9 (then pushing enter) as shown below will use\nthe current Player's turn in that location.\n"); printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); int x=0; int j=0; int turn[9]; while (j<sizeof(turn)/sizeof(turn[0]) && winner == false) { scanf("%d",&turn[j]); //turn[j] = x; if (j%2==0) { if (turn[j]==1) { board[0][0] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==2) { board[0][1] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==3) { board[0][2] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==4) { board[1][0] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==5) { board[1][1] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==6) { board[1][2] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==7) { board[2][0] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==8) { board[2][1] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } } if (turn[j]==9) { board[2][2] = 'O'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (j%2!=0) { if (turn[j]==1) { board[0][0] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==2) { board[0][1] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==3) { board[0][2] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==4) { board[1][0] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==5) { board[1][1] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==6) { board[1][2] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==7) { board[2][0] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==8) { board[2][1] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } if (turn[j]==9) { board[2][2] = 'X'; printf("\n\n"); printf(" %c | %c | %c\n", board[0][0], board[0][1], board[0][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[1][0], board[1][1], board[1][2]); printf("-----------\n"); printf(" %c | %c | %c\n", board[2][0], board[2][1], board[2][2]); } } j++; } } Edit One:
Thank you everyone for all of your responses and suggestions. All of you have been very helpful! I'm in the midst of redoing the program and incorporating many of the suggestions posted. I will make another edit to my post with the updated code soon!