C语言实现三子棋(通过数组)
须要蕴含的头文件
include <stdio.h>
include <stdlib.h>
include <time.h>
创立一个全局数组
因为如果数组大小变动,游戏规则和实现思路都会有很大的变动,所以不进行宏定义常量来定义数组
char board3;
设计主程序框架
game()函数为游戏过程框架
int main()
{
do{ int i = 0; printf("1.Start the game\n"); printf("2.Quit the game\n"); printf("Please enter your options->"); scanf("%d", &i); switch (i) { case 1: game(); //game()函数为游戏过程框架 break; case 2: return 0; default: printf("Input error,please enter again!\n"); break; }} while(1);
}
设计游戏过程框架
void game()
{
initBoard();srand((unsigned)time(NULL)); //生成随机种子,前面须要生成随机坐标char temp = ' '; //定义一个字符变量,用于接管前面判断函数返回值,用于决定游戏输赢do{ printBoard(); //打印棋盘的函数 userPlay(); //玩家下棋的函数 temp = judge(); //判断游戏是否分出输赢 if (temp != ' ') break; robotPlay(); //电脑下棋的函数 temp = judge();} while (temp == ' ');printBoard();switch (temp){ case '@': printf("User WIN!\n"); break; case '$': printf("Bobot WIN!\n"); break; case '*': printf("Dogfall !\n"); break; dafault: break;}
}
设计棋盘款式
有趣味的能够搞的更加花里胡哨,这里草草了事,呸,简略设计一下 哈
//##########
// | |
//_|_|_
// | |
//_|_|_
// | |
//##########
打印棋盘
重点就在这了,棋盘设计的再牛逼,也得能打印进去才行
这里棋盘设计的比拟繁难,打印起来也比较简单,要害是思路要清晰
void printBoard()
{
printf("##########\n");int i = 0,j = 0;for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) { if (j != 2) { printf("%c|",board[i][j]); } else printf("%c\n",board[i][j]); } if (i != 2) printf("_|_|_\n");}printf("##########\n");
}
玩家下棋
自己习惯用界面编程的坐标系示意坐标,因而上面赋值时横坐标和纵坐标倒过去了
void userPlay()
{
printf("Please enter coordinates->");int x = 0,y = 0;while(1){ scanf("%d %d", &x, &y); if (x > 0 && x < 4 && y > 0 && y < 4) { if (board[y - 1][x - 1] == ' ') { board[y - 1][x - 1] = '@'; break; } else printf("There are chess pieces here,please enter again!->"); } else printf("Input error,please enter again!->");}
}
电脑下棋
这里要害是 要生成可行的坐标,以及随机数的生成
void robotPlay()
{
int i = 0, j = 0;while (1){ i = rand() % 3; j = rand() % 3; if (board[i][j] == ' ') { board[i][j] = '$'; break; }}
}
判断游戏输赢
这里就到了最难剖析的一部分了
废话不多说,间接看代码
char judge()
{
int i = 0, j = 0; //判断两条对角线 对i j 的值不做带动,所以放在后面if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ') return board[i][j];if (board[i][j + 2] == board[i + 1][j + 1] && board[i][j + 2] == board[i + 2][j] && board[i][j] != ' ') return board[i][j + 2]; //顺次判断三行、三列for (i = 0,j = 0; j < 3; j++){ if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] != ' ') return board[i][j];}for (i = 0,j = 0; i < 3; i++){ if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] != ' ') return board[i][j];} //判断棋盘是否满了(平局)for (i = 0; i < 3; i++){ for (j = 0;j < 3; j++) { if (board[i][j] == ' ') return board[i][j]; }} //如果没呈现以上状况,轻易返回一个不同符号,使游戏持续进行return '*';
}