目录
整段代码
主函数(程序思路)
用随机函数产生的随机值来充当电脑下棋的坐标(用时间作为随机函数的变量)。
我们首先定义一个二位数组,用来存放棋盘。一个变量a来接受玩家的选择。
使用do-while循环来实现多次对局(不然只能玩一次就结束了)。
使用switch搭配a来实现菜单的选择。选择1,进行游戏。选择0,退出。输入其他选项,提示用户选择正确的选项。
生成棋盘。后打印棋盘(生成棋盘函数)。
玩家下棋环节(玩家行动函数)。
显示玩家\电脑活动后的棋盘(显示棋盘函数)。
判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。
电脑下棋环节(电脑行动函数)。
显示玩家\电脑活动后的棋盘(显示棋盘函数)。
判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。
所用函数?
菜单函数
生成棋盘函数
显示棋盘函数?
玩家下棋函数
电脑下棋函数
判断输赢函数
显示赢家函数?
整段代码
废话不多说直接上整段代码!!!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
int winner(char ret)
{
if (ret == '*')
{
return 1;
}
if (ret == '#')
{
return 2;
}
if (ret == 'p')
{
return 3;
}
}
void menu()
{
printf("**********************\n");
printf("*****1.开始游戏*******\n");
printf("*****0.退出 ***\n");
printf("**********************\n");
}
void bord(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void dis_bord(char arr[ROW][COL], int row, int col)
{
int i, j;
j = 0;
for (i = 0; i < row; i++)
{
printf(" %c| %c| %c\n", arr[i][0], arr[i][1], arr[i][2]);
if (j < col - 1)
{
printf("--|--|--\n");
j++;
}
}
}
void player_move(char arr[ROW][COL], int row, int col)//玩家下棋的函数
{
int x, y;
printf("请输入要下棋子坐标(行 列)\n");
scanf("%d%d", &x, &y);
while (1)//用while循环不断判断玩家是否输入了正确的坐标
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;//如果输入了正确的坐标,则跳出循环
}
else//否则提示重新输入正确坐标后再一次进入循环
{
printf("请输入正确的坐标\n");
scanf("%d%d", &x, &y);
continue;
}
}
}
void computer_move(char arr[ROW][COL], int row, int col)//电脑下棋的函数
{
printf("电脑下\n");
int i, j;
while (1)//判断电脑下棋的坐标是否正确
{
int i, j;
i = rand() % row;//用了随机函数,将获得的随机值跟棋盘大小取余,就能将值的范围控制在0~(棋盘大小-1,此处是0~2)
j = rand() % col;
//判断占用
if (arr[i][j] == ' ')//判断电脑下的位置是否有棋子占用
{
arr[i][j] = '#';
break;
}
}
}
char wether_win(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
int i = 0, j = 0;
while (1)//此处的while好像没有什么作用
{
for (i = 0; i < row; i++)//用for循环实现行(hang)的扫描
{
if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '*')//如果一行中有三个*则返回*
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
break;
}
return 0;
}
int main()
{
srand((unsigned int)time(NULL));
int a; int ret = 0; int ret1 = 0;
char arr[ROW][COL]={0};//定义一个二维数组
do
{
menu();//打印一个菜单
scanf("%d", &a);//输入选项
switch (a)//选择结构
{
case 1://开始游戏选项
bord(arr, ROW, COL);//棋盘初始化
dis_bord(arr, ROW, COL);//打印一个棋盘
while (1)//下棋环节
{
player_move(arr, ROW, COL);
dis_bord(arr, ROW, COL);
char ret= wether_win(arr, ROW, COL);
ret1=winner(ret);
computer_move(arr, ROW, COL);
dis_bord(arr, ROW, COL);
ret=wether_win(arr,ROW,COL);
ret1 = winner(ret);
if (ret1 == 1)
{
printf("玩家获胜\n");
break;
}
if (ret1 == 2)
{
printf("电脑获胜\n");
break;
}
if (ret1 == 3)
{
printf("平局");
}
}
break;
case 0://退出选项
printf("拜拜\n");
break;
default:
printf("请选择正确的选项\n");//提示用户输入正确的值
break;
}
} while (a);
return 0;
}
主函数(程序思路)
用随机函数产生的随机值来充当电脑下棋的坐标(用时间作为随机函数的变量)。
我们首先定义一个二位数组,用来存放棋盘。一个变量a来接受玩家的选择。
使用do-while循环来实现多次对局(不然只能玩一次就结束了)。
使用switch搭配a来实现菜单的选择。选择1,进行游戏。选择0,退出。输入其他选项,提示用户选择正确的选项。
生成棋盘。后打印棋盘(生成棋盘函数)。
玩家下棋环节(玩家行动函数)。
显示玩家\电脑活动后的棋盘(显示棋盘函数)。
判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。
电脑下棋环节(电脑行动函数)。
显示玩家\电脑活动后的棋盘(显示棋盘函数)。
判断是否出现胜利者。若是,则显示获胜者消息,否则继续(判断输赢函数)。
int main()
{
srand((unsigned int)time(NULL));
int a; int ret = 0; int ret1 = 0;
char arr[ROW][COL]={0};//定义一个二维数组
do
{
menu();//打印一个菜单
scanf("%d", &a);//输入选项
switch (a)//选择结构
{
case 1://开始游戏选项
bord(arr, ROW, COL);//棋盘初始化
dis_bord(arr, ROW, COL);//打印一个棋盘
while (1)//下棋环节
{
player_move(arr, ROW, COL);
dis_bord(arr, ROW, COL);
char ret= wether_win(arr, ROW, COL);
ret1=winner(ret);
computer_move(arr, ROW, COL);
dis_bord(arr, ROW, COL);
ret=wether_win(arr,ROW,COL);
ret1 = winner(ret);
if (ret1 == 1)
{
printf("玩家获胜\n");
break;
}
if (ret1 == 2)
{
printf("电脑获胜\n");
break;
}
if (ret1 == 3)
{
printf("平局");
}
}
break;
case 0://退出选项
printf("拜拜\n");
break;
default:
printf("请选择正确的选项\n");//提示用户输入正确的值
break;
}
} while (a);
return 0;
}
所用函数?
菜单函数
用printf就完事了,不多废话。
void menu()
{
printf("**********************\n");
printf("*****1.开始游戏*******\n");
printf("*****0.退出 ***\n");
printf("**********************\n");
}
生成棋盘函数
这里的ROW和COL是#define 定义的标识符常量。
用两层for循环实现数组的初始化。
将数组的元素赋值成空格字符。
void bord(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
显示棋盘函数?
?我们想要的棋盘样式
?这里使用的是行打印,将数组的元素放入棋盘中。%c| %c| %c
为了实现上面的棋盘,我们发现,%c| %c| %c要打印三次,--|--|--只需要两次。所以加了个if语句限制
void dis_bord(char arr[ROW][COL], int row, int col)
{
int i, j;
j = 0;
for (i = 0; i < row; i++,j++)
{
printf(" %c| %c| %c\n", arr[i][0], arr[i][1], arr[i][2]);
if (j < col - 1)
{
printf("--|--|--\n");
}
}
}
玩家下棋函数
用while循环不断判断玩家是否输入了正确的坐标,如果输入了正确的坐标,则跳出循环,否则提示重新输入正确坐标后再一次进入循环。
void player_move(char arr[ROW][COL], int row, int col)//玩家下棋的函数
{
int x, y;
printf("请输入要下棋子坐标(行 列)\n");
scanf("%d%d", &x, &y);
while (1)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("请输入正确的坐标\n");
scanf("%d%d", &x, &y);
continue;
}
}
}
电脑下棋函数
用while循环不断判断电脑下棋的坐标是否正确,用了随机函数,将获得的随机值跟棋盘大小取余,就能将值的范围控制在0~2(棋盘大小减一1)
void computer_move(char arr[ROW][COL], int row, int col)
{
printf("电脑下\n");
int i, j;
while (1)
{
int i, j;
i = rand() % row;
j = rand() % col;
if (arr[i][j] == ' ')
{
arr[i][j] = '#';
break;
}
}
}
判断输赢函数
虽然很长,但逻辑很简单,就是遍历棋盘,寻找三点一线的棋子,并且返回这个棋子的棋子类型。
char wether_win(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
int i = 0, j = 0;
while (1)//此处的while好像没有什么作用
{
for (i = 0; i < row; i++)//用for循环实现行(hang)的扫描
{
if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '*')//如果一行中有三个*则返回*
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '*')
{
return'*';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][0] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[2][j] == arr[1][j] && arr[0][j] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
}
if (arr[0][0] == arr[1][1] && arr[2][2] == arr[1][1] && arr[0][0] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
if (arr[0][2] == arr[1][1] && arr[2][0] == arr[1][1] && arr[0][2] == '#')
{
return'#';
break;
}
else
{
if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ')
if (arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ')
if (arr[2][0] != ' ' && arr[2][1] != ' ' && arr[2][2] != ' ')
{
return 'p';
}
}
break;
}
return 0;
}
显示赢家函数?
返回1就打印玩家获胜,返回2就打印电脑获胜,返回3就打印平局。
int winner(char ret)
{
if (ret == '*')
{
return 1;
}
if (ret == '#')
{
return 2;
}
if (ret == 'p')
{
return 3;
}
}
|