建立一个井字棋盘,玩家与电脑分别下棋,三个棋子能连成一条线就获胜。
玩家和电脑每次落子之后,都打印出棋盘的情况,并将其储存。
建立game.h头文件,text.c文件, game.c文件。
game.h头文件用于声明函数,text.c文件用于编写游戏流程,game.c文件用于编写函数内容
在text.c内进行操作:
引入自定义头文件用#include “game.h”,不同于引入C语言自带的头文件用< >,引入自定义的头文件要用" "。
设主函数:
int main()
{
text();
return 0;
}
设text函数:(因为需要游戏可以重复玩,所有使用do…while语句,在菜单内输入1进行游戏,输入0退出游戏,输入其他数字,提示错误)
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);
}
设立菜单menu函数:
void menu()
{
printf("********************************\n");
printf("*********1.play 0.exit**********\n");
printf("********************************\n");
}
输出的结果如下图:
棋盘为一个3*3而且没有边框的井字形状,需要用到设置数组board[ ][ ]代表坐标。
在game.h头文件进行定义,定义ROW 为行,并且值为3,COL为列,值也为3。
#define ROW 3
#define COL 3
定义函数DispalyBoard 打印棋盘
i代表行,j代表列。第一行先打印(空格)%c(空格) 说明玩家输入坐标或者电脑进行随机填空时,输入的一个字符*或者#,之后打印 | 进行竖分割,但只打印两个竖分割符号。之后进行换行打印- - -进行横分割,之后打印 | 进行竖分割。
void DispalyBoard (char board[ROW][COL],int row ,int col)
{
int i = 0;
for(i = 0; i<row; i++)
{
int j = 0;
for(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");
}
}
}
打印出来的结果如下:
玩家下棋
让玩家输入X,Y坐标,并在棋盘上显示,用“*”。因为数组的下标是从0开始,当时输入坐标是1~3,所以需要在设计数组时,需要进行-1操作。如果输入的坐标上已有值,提示“该坐标已经有棋子”,并重新输入。如果输入超过3的值,则提醒:“坐标非法,请重新输入!”
自定义函数PlayerMove ( )
void PlayerMove(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");
}
}
}
电脑下棋
电脑下棋使用srand函数以时间来调用rand函数:srand((unsigned) time(NULL));
在test函数内调用srand函数,用“#”代表电脑下棋
自定义ComputerMove函数:
void ComputerMove(char board[ROW][COL],int row ,int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while(1)
{
x = rand() %row;
y = rand() %col;
if(board[x][y]== ' ')
{
board[x][y] = '#';
break;
}
}
}
X= rand()%row,说明X的取值范围就在1~ 3。同理,Y的取值范围也是1~ 3。
设置好玩家与电脑的下棋步骤之后,需要在每次玩家或者电脑落棋之后,打印出棋盘情况,需要在函数下,加入打印棋盘函数DispalyBoard()即:
PlayerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ComputerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
游戏分别有以下三种情况:
由于获胜条件需要在每一方落子之后,进行判断。所以在PlayMove函数和ComputerMove函数加入IsWin函数,用于判断游戏情况。
char IsWin(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][1];//判断横向是否有三子相等,而且不是空格子,若相等,返回表达赢家的值
}
}
for(i= 0; i<col; i++)
{
if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i] != ' ' )
{
return board[1][i];//判断纵向是否有三子相等,而且不是空格子,若相等,返回表达赢家的值
}
}
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2] != ' ' )
{
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ' )
{
return board[1][1];//判断斜对角线是否有三子相等,而且不是空格子,若相等,返回表达赢家的值
设定IsFull()函数判断上述没有出现获胜情况,并且格子已满。
int IsFull(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++)
{
if(board[i][j] ==' ')
{
return 0;
}
}
}
return 1;
}
...
if (1 == IsFull(board,ROW,COL))
{
return 'Q';
}
当上述两种情况都没有发生时,游戏依然处于进行当中。所以需要在IsWin函数最后加入return ‘c’;代表游戏继续。
此时游戏可以正常运行:
完整代码为:
game.h文件下:
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL],int row, int col);
void DispalyBoard (char board[ROW][COL],int row ,int col);
void PlayerMove(char board[ROW][COL],int row ,int col);
void ComputerMove(char board[ROW][COL],int row ,int col);
char IsWin(char board[ROW][COL],int row ,int col);
int IsFull(char board[ROW][COL],int row ,int col);
game.c文件下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
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 DispalyBoard (char board[ROW][COL],int row ,int col)
{
int i = 0;
for(i = 0; i<row; i++)
{
int j = 0;
for(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 PlayerMove(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 ComputerMove(char board[ROW][COL],int row ,int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while(1)
{
x = rand() %row;
y = rand() %col;
if(board[x][y]== ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(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++)
{
if(board[i][j] ==' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(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][1];
}
}
for(i= 0; i<col; i++)
{
if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i] != ' ' )
{
return board[1][i];
}
}
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2] != ' ' )
{
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ' )
{
return board[1][1];
}
if (1 == IsFull(board,ROW,COL))
{
return 'Q';
}
return 'c';
}
text.c文件下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("********************************\n");
printf("*********1.play 0.exit**********\n");
printf("********************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL]={0};
InitBoard(board,ROW,COL);
DispalyBoard(board,ROW,COL);
while(1)
{
PlayerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ret = IsWin(board,ROW,COL);
if(ret != 'c')
{
break;
}
ComputerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ret = IsWin(board,ROW,COL);
if(ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
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;
}
缺点就是电脑下棋都是随机的,只要带着脑子玩这个游戏,基本不会输。我也想写出有脑子的电脑,奈何我还不会 ╮(╯_╰)╭
文章目录 1.初识SpringBoot 1.1 SpringBoot的特性? 1.2 SpringBoot四大核心? 2....
准备学习VS2015环境下的数据库编程,在网上找了个实例,链接如下: VS2017调用My...
5大隔离级别 使用后端数据库事务默认的隔离级别 读未提交 允许读取尚未提交的数...
为了减少由于单个请求挂掉而拖垮整站的情况发生,给所有请求做统计是一个不错的...
我们先来看一下运行图 下面我们来看源代码: php//抓取抖音的接口数据global $nCo...
本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发、....
自我介绍 本人是一名普通的二本院校大一学生专业是计算机科学与技术。 虽然说我...
一 动态配置 1. 环境准备 2.新建配置 3.导入配置 4.配置客户端 5. 修改配置信息 ...
12月15日消息 外媒 Windows Latest 报道,在下一次功能更新中,Windows 10 设置...
"^/d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-/d+)(0...