1、打印游戏菜单界面,判断开始游戏或者结束游戏
2、若选择结束游戏,则直接退出
3、若选择开始游戏,然后选择玩家先下还是电脑先下
4、若选择玩家先下,则玩家输入落子坐标,打印棋盘,判断输、赢、和棋
5、电脑落字(使用随机函数,随机落在无子处),并打印棋盘,判断输、赢、和棋
6、玩家输入落子坐标,打印棋盘,判断输、赢、和棋
7、依次循环,直到出现输、赢、和棋,打印游戏结果,结束本局游戏
8、若选择电脑先下,过程与玩家先下相同,只是顺序不同
9、再次打印游戏菜单界面,开始下一局游戏
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void Menu(int board[ROW][COL]);//游戏菜单
void Init(int board[ROW][COL]);//初始化棋盘
void HumanGame(int board[ROW][COL]);//玩家落棋
void ComputerGame(int board[ROW][COL]);//电脑落棋
void PrintBoard(int board[ROW][COL]);//打印棋盘
int CheckWin(int board[ROW][COL]);//判断输赢
int CheckerBoard[ROW][COL] = { 0 };//定义一个二维数组,作为棋盘
void Game1(int board[ROW][COL]);//玩家先下
void Game2(int board[ROW][COL]);//电脑先下
int CheckEqual(int board[ROW][COL]);//判断和棋
int Game(int board[ROW][COL]);//判断落棋顺序
int Ret = 0;
int ret;
//菜单
void Menu(int board[ROW][COL]) {
while (1) {
Init(board);
printf("*********************************************\n");
printf("*****************三子棋游戏******************\n");
printf("*********************************************\n");
int input1;
int ret=0;
while (1) {
printf("请输入你的选择\n1.开始游戏 0.结束游戏\n");
scanf("%d", &input1);
if (input1 == 1) {
Game(board);
break;
}
if (input1 != 1 && input1 != 0) {
printf("输入内容不合法,请输入1或者0!\n");
continue;
}
if (input1 == 0) {
ret = 'w';
break;
}
}
if (ret == 'w') {
break;
}
if (ret == 'q') {
continue;
}
}
}
int Game(int board[ROW][COL]) {
while (1) {
int input2;
printf("请输入你的选择\n1.玩家先下 0.电脑先下\n");
scanf("%d", &input2);
if (input2 == 1) {
Game1(CheckerBoard);
ret = 'q';
break;
}
if (input2 == 0) {
Game2(CheckerBoard);
ret = 'q';
break;
}
if (input2 != 1 && input2 != 0) {
printf("输入内容不合法,请输入1或者0!\n");
continue;
}
}
}
//初始化棋盘
void Init(int board[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
board[i][j] = ' ';
}
}
}
//打印棋盘
void PrintBoard(int board[ROW][COL]) {
for (int row = 0; row < ROW + 1; row++) {
printf("|-----|-----|-----|\n");
if (row < ROW) {
printf("| %c | %c | %c |\n", board[row][0], board[row][1], board[row][2]);
}
}
printf("\n");
}
//判断输赢
int CheckWin(int board[ROW][COL]) {
//判断列
for (int col = 0; col < COL; col++) {
if (board[ROW - 1][col] == board[ROW - 2][col] && board[ROW - 1][col] == board[ROW - 3][col]) {
if (board[ROW - 1][col] == 'X') {
return 1;
}
if (board[ROW - 1][col] == 'O') {
return 2;
}
}
}
//判断行
for (int row = 0; row < ROW; row++) {
if (board[row][COL - 1] == board[row][COL - 2] && board[row][COL - 1] == board[row][COL - 3]) {
if (board[row][COL - 1] == 'X') {
return 1;
}
if (board[row][COL - 1] == 'O') {
return 2;
}
}
}
//判断斜对角
if (board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
if (board[0][0] == 'X') {
return 1;
}
if (board[0][0] == 'O') {
return 2;
}
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
if (board[0][2] == 'X') {
return 1;
}
if (board[0][2] == 'O') {
return 2;
}
}
return CheckEqual(board);
}
//判断和棋
int CheckEqual(int board[ROW][COL]) {
for (int row = 0; row < ROW; row++) {
for (int col = 0; col < COL; col++) {
if (board[row][col] == ' ') {
return 'w';
}
}
}
return 3;
}
//玩家落子
void HumanGame(int board[ROW][COL]) {
int inputrow = 0;
int inputcol = 0;
while (1) {
//玩家输入坐标
printf("请输入落棋坐标(row,col)\n");
scanf("%d %d", &inputrow, &inputcol);
//判断坐标是否合法
if (inputrow<0 || inputrow>ROW - 1 || inputcol<0 || inputcol>COL - 1) {
printf("您输入的坐标不合法,请重新输入坐标\n");
}
else {
if (board[inputrow][inputcol] == ' ') {
board[inputrow][inputcol] = 'X';
break;
}
else {
printf("该坐标已有棋子,请重新输入坐标\n");
}
}
}
Ret = CheckWin(board);
}
//电脑落子
void ComputerGame(int board[ROW][COL]) {
int row = 0;
int col = 0;
while (1) {
row = rand() % ROW;
col = rand() % COL;
if (board[row][col] == ' ') {
board[row][col] = 'O';
break;
}
}
Ret = CheckWin(board);
}
//玩家先下
void Game1(int board[ROW][COL]) {
while (1) {
HumanGame(board);
PrintBoard(board);
if (Ret == 1) {
printf("恭喜你,赢了!\n");
break;
}
if (Ret == 2) {
printf("你输了!\n");
break;
if (Ret == 3) {
printf("和棋!\n");
break;
}
}
ComputerGame(board);
printf("对手落棋!\n");
PrintBoard(board);
if (Ret == 1) {
printf("恭喜你,赢了!\n");
break;
}
if (Ret == 2) {
printf("你输了!\n");
break;
}
if (Ret == 3) {
printf("和棋!\n");
break;
}
}
}
//电脑先下
void Game2(int board[ROW][COL]) {
while (1) {
ComputerGame(board);
printf("对手落棋!\n");
PrintBoard(board);
if (Ret == 1) {
printf("恭喜你,赢了!\n");
break;
}
if (Ret == 2) {
printf("你输了!\n");
break;
}
if (Ret == 3) {
printf("和棋!\n");
break;
}
HumanGame(board);
PrintBoard(board);
if (Ret == 1) {
printf("恭喜你,赢了!\n");
break;
}
if (Ret == 2) {
printf("你输了!\n");
break;
}
if (Ret == 3) {
printf("和棋!\n");
break;
}
}
}
int main() {
srand((unsigned int)time(0));//重置随机种子不要放在循环内,循环一次时间间隔极小,并且至在程序启动的时候设置一次
Menu(CheckerBoard);
system("pause");
return 0;
}