目录
一.问题描述
二.基本流程
三.具体步骤
1.环境配置
2.打印菜单
3.进出游戏
4.创建棋盘
5.初始化数组
6.打印数组
7.玩家下棋
8.电脑下棋
9.生成随机数
10.判断输赢
11.头文件定义
12.游戏函数
四.人工智能
1.电脑判断自己会赢
2.电脑拦截玩家
3.添加到电脑下棋中
五.代码
1.game.h
2.game.c
3.test.c
五.结束语
三子棋:也是我们的井字棋,我们一步步分析,从头到尾,都是细节
用C语言实现三子棋
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'Q’表示和棋。
6.电脑落子(随机位置落子) ,'#’表示电脑落子。
7.判定胜负关系。
首先在test.c源文件中创建菜单函数
void menu()
{
printf("<########################>\n");
printf("<++++++++++++++++++++++++>\n");
printf("<++ 1.play ++>\n");
printf("<++ ++>\n");
printf("<++ 0.exit ++>\n");
printf("<++++++++++++++++++++++++>\n");
printf("<########################>\n");
}
在test.c源文件中创建进出游戏的函数
因为我们要重复玩这个衣服,然后我们就把我们写的菜单函数放到里面,实现打印
下面我们写switch函数,去选择玩还是退出,还是输入错误,所以我们需要一个循环,当进入的时候,就用break打破
我们里面写的游戏函数,先不管他,我们一步一步按思路来
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("欢迎下次再来!\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
我们三子棋,我们想想是不是就是一个3x3的数组,然后用线分割一下,里面放上我们的棋子,
所以我们先实现一个3x3数组,我们直接放在头文件里,这样就不用频繁使用了,而且改值也方便
就是行和列
#define ROW 3
#define COL 3
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
我们关于游戏的就放在game.c中
我们就把我们数组里面全部为空格,然后方便等会接收我们的棋子
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j]=' ';
}
}
}
我们要大概打印一个像井的棋盘,这里有点复杂,我们好好分析一下
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
if(i
这样虽然能打印,但是代码里面逻辑不是很明确
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
这个逻辑很清晰,但是不好理解,我们一步一步来分析
我们更改的这个就是把我们上面的才开来改写,我们拿下来对比分析,外面大循环还是一样的,然后外面改写里面对应的,因为外面的大循环是一行一行来打印,所以我们第一次循环,就是第一行,然后开始打印列
下面就是对应行里面列的打印,对应的是一个字符一个竖杠,然后最后一个不打印,我们就加一个判断就好啦
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
然后我们这一个打印了,但是字符下面还需要一个分割,我们加上,也是对应的拆开
第一个判断是为了防止行多打印最后一行,然后进入里面的循环,就是打印列,就是字符下面的分割行,我们打印,然后也是一样的道理,最后一个不打印,所以我们判断一下,然后再到大循环里面继续打印
if(i
注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。4.这里之所以x,y要从1开始循环是因为这样更符合生活场景
所以我们要判断两次,用if去判断,第一次是判断是否在棋盘里面,第二次是判断这个地方还空着没,我们xy是我们输入的坐标,我们数组里面要用下标,记得从0开始,所以减一,然后在里面放*
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入要下棋的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("已占据,请重新下棋\n");
}
}
else
{
printf("非法输入\n");
}
}
}
放完后,我们break打破循环就好啦,然后下面,如果已经占据就再循环,非法输入也再循环
注意:
1.要在主函数中使用srand((unsigned int)time(NULL))
将时间作为随机数种子,确保得到的行列坐标是真随机。2.生成的坐标符合棋盘
3.要在棋盘上空的地方下棋。
这里我们调用rand函数,来生成随机数,因为我们坐标,是在数组里面的下标,三子棋的时候范围行和列都是0~2,然后我们生成的随机数去取余row,col,得到的数就是0~2的范围,如果我们变成五子棋,我们再取余,得到的数就是0~4的范围,就是我们合理的下标了
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
然后我们就只用一个if去判断这个位置空不空,然后放上#,打破循环,如果被占用了,我们就循环再来一次,这里注意,x y生成的随机数要放在循环里面,不然每次生成的数值一样
我们第8步,需要生成随机的坐标给电脑用,rand函数需要srand调用,这里我们就调用一次,生成的数比较随机,我们就放在test函数中
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("欢迎下次再来!\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
此处约定返回结果的含义:
(1)‘*’ 表示玩家获胜
(2)‘#’ 表示电脑获胜
(3)’ Q’ 表示胜负未分
(4) ‘C’ 表示和棋用*和#很方便,因为我们输入的玩家是*,电脑是#
先来判断棋盘是不是满的——和棋,我们先写个判断满不满的函数
很简单,如果里面满了就返回1,不满就返回0
int is_full(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
if (is_full(board, row, col) != 0)
{
return 'Q';
}
return 'C';
}
这里面都很好理解,最后调用我们写的判断满不满的函数来判断,然后就返回对应的值就好啦
需要注意的是
行的判断:后面要写清楚,这一行的三个都相同,也不能为空格,都要判断清楚
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][0];
}
}
列的也一样:后面要写清楚,这一行的三个都相同,也不能为空格,都要判断清楚
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[0][i];
}
}
意思就是我们里面if的判断要写清楚,不能连着等于,一个一个写,别忘了判断不是空格
因为我们写了头文件,所以我们要在里面定义一下,我们在game.c声明调用就好啦
我们的5~10写的函数都是要放到game.c中的
game .h 里面去定义一下
#include
#include
#include
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
我们两个源文件里面用 #include "game.h"调用就好啦
最后来实现我们的游戏函数,放在test.c中
第一步
1.定义数组
2.初始化数组
3.打印数组
然后我们玩家还要电脑开始下棋
1.玩家下棋
2.打印数组
判断棋盘是否满
3.电脑下棋
4.打印数组
判断棋盘是否满
因为要多次的下,每一次下完,无论是玩家还是电脑都要打印,也要判断是否满了,不满,我继续循环,如果满了就break打破循环,看看ret返回的值,下面就判断ret返回的值,打印结束
1.返回*就是玩家赢
2.返回#就是电脑赢
3.返回Q就是和棋
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("恭喜你,你赢了!\n");
}
else if (ret == '#')
{
printf("很抱歉,你输了!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
就是对三行三列还有对角线去判断,是否有两个相连的棋子,如果有而且第三个位置是空格就落棋
//电脑检查自己是否会赢
//约定如果在函数内部成功判断就返回1
//判断失败则返回0
int check_computer(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断每一行是否有两个相连的棋子,如果有,且第三个棋格为空,则落棋
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ')
{
board[i][2] = '#';
return 1; //成功判断,返回1
}
if (board[i][0] == board[i][2] && board[i][0] == '#' && board[i][1] == ' ')
{
board[i][1] = '#';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ')
{
board[i][0] = '#';
return 1;
}
}
//判断每一列是否有两个相连的棋子,如果有,且第三个棋格为空,则落棋
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[0][j] == '#' && board[2][j] == ' ')
{
board[2][j] = '#';
return 1;
}
if (board[0][j] == board[2][j] && board[0][j] == '#' && board[1][j] == ' ')
{
board[1][j] = '#';
return 1;
}if (board[1][j] == board[2][j] && board[1][j] == '#' && board[0][j] == ' ')
{
board[0][j] = '#';
return 1;
}
}
//判断两条对角线是否有两个相连的棋子,如果有,且第三个棋格为空,则落棋
{
//第一条
if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
//第二条
if (board[0][2] == board[1][1] && board[0][2] == '#' && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[0][2] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
//如果上面都没返回,说明不符合赢的条件,返回0
return 0;
}
}
就是对三行三列还有对角线,判断玩家是否有两个相连的棋子,而且是三个地方是空格,就下棋
//电脑检查玩家是否会赢(逻辑和CheckComputer完全相同)
//约定成功拦截返回1
//无需拦截或者拦截不了返回0
int check_player(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断每一行是否有两个相连的棋子,如果有,且第三个棋格为空,则拦截
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ')
{
board[i][2] = '#';
return 1; //成功拦截,返回1
}
if (board[i][0] == board[i][2] && board[i][0] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ')
{
board[i][0] = '#';
return 1;
}
}
//判断每一列是否有两个相连的棋子,如果有,且第三个棋格为空,则拦截
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[0][j] == '*' && board[2][j] == ' ')
{
board[2][j] = '#';
return 1;
}
if (board[0][j] == board[2][j] && board[0][j] == '*' && board[1][j] == ' ')
{
board[1][j] = '#';
return 1;
}if (board[1][j] == board[2][j] && board[1][j] == '*' && board[0][j] == ' ')
{
board[0][j] = '#';
return 1;
}
}
//判断两条对角线是否有两个相连的棋子,如果有,且第三个棋格为空,则拦截
{
//第一条
if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
//第二条
if (board[0][2] == board[1][1] && board[0][2] == '*' && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[0][2] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
//如果上面都没返回,说明不符合拦截的条件,返回0
return 0;
}
}
我们在写上面两个代码得时候,成立得时候就返回得1,不成立就返回0,方便我们这里判断
判断电脑自己赢和围堵玩家,我们需要加个判断,利用上面两个函数得返回值,看看是否成立,成立了,我们上面的函数已经下棋了,不成立,进入下一个判断,两个都不成立,就随机下棋。
我们肯定先去判断有没有赢得地方,如果没有赢得地方,我们再去判断玩家得棋子要不要去围堵,如果要围堵,就围堵,如果这俩判断都不成立,我们还是随机去下棋
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
//定义两个标识符变量来接收两个判断函数的返回值
int flag1 = 0;
int flag2 = 0;
flag1 = check_computer(board, row, col);
//如果flag1 == 0 时才进行flag2 的判断,避免当二者都为1时下两步棋(易错)
if (flag1 == 0)
{
flag2 = check_player(board, row, col);
}
if (flag1 == 0 && flag2 == 0) //当CheckComputer和CheckPlayer都没落棋时,就随机下
{
while (1)
{
//在主函数生成种子srand
//随机生成范围内的坐标
int x = rand() % row;
int y = rand() % col;
//判断坐标是否被占用
if (board[x][y] == ' ')
{
board[x][y] = '#'; //假设电脑为#号
break;
}
}
}
}
#pragma once
#define ROW 3
#define COL 3
#include
#include
#include
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);
int check_computer(char board[ROW][COL], int row, int col);
int check_player(char board[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while (1)
{
printf("请输入要下棋的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("已占据,请重新下棋\n");
}
}
else
{
printf("非法输入\n");
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int flag1 = 0;
int flag2 = 0;
flag1 = check_computer(board, row, col);
if (flag1 == 0)
{
flag2 = check_player(board, row, col);
}
if (flag1 == 0 && flag2 == 0)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
int is_full(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
if (is_full(board, row, col) != 0)
{
return 'Q';
}
return 'C';
}
int check_computer(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ')
{
board[i][2] = '#';
return 1;
}
if (board[i][0] == board[i][2] && board[i][0] == '#' && board[i][1] == ' ')
{
board[i][1] = '#';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ')
{
board[i][0] = '#';
return 1;
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[0][j] == '#' && board[2][j] == ' ')
{
board[2][j] = '#';
return 1;
}
if (board[0][j] == board[2][j] && board[0][j] == '#' && board[1][j] == ' ')
{
board[1][j] = '#';
return 1;
}if (board[1][j] == board[2][j] && board[1][j] == '#' && board[0][j] == ' ')
{
board[0][j] = '#';
return 1;
}
}
{
if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
if (board[0][2] == board[1][1] && board[0][2] == '#' && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[0][2] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
return 0;
}
}
int check_player(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ')
{
board[i][2] = '#';
return 1;
}
if (board[i][0] == board[i][2] && board[i][0] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
return 1;
}
if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ')
{
board[i][0] = '#';
return 1;
}
}
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[0][j] == '*' && board[2][j] == ' ')
{
board[2][j] = '#';
return 1;
}
if (board[0][j] == board[2][j] && board[0][j] == '*' && board[1][j] == ' ')
{
board[1][j] = '#';
return 1;
}if (board[1][j] == board[2][j] && board[1][j] == '*' && board[0][j] == ' ')
{
board[0][j] = '#';
return 1;
}
}
{
if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
if (board[0][2] == board[1][1] && board[0][2] == '*' && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[0][2] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
return 0;
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("<########################>\n");
printf("<++++++++++++++++++++++++>\n");
printf("<++ 1.play ++>\n");
printf("<++ ++>\n");
printf("<++ 0.exit ++>\n");
printf("<++++++++++++++++++++++++>\n");
printf("<########################>\n");
}
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("恭喜你,你赢了!\n");
}
else if (ret == '#')
{
printf("很抱歉,你输了!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("欢迎下次再来!\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
要分析好思路,一步一步来,写好自己的框架,然后去写,不要从头到尾的写,我需要什么就去写什么,加油!!!