C语言学习1——n子棋的实现
一 、前言
本次的游戏基于二维数组,使用二维数组实现棋盘内棋子信息的存储。游戏界面如下:
游戏实现代码附在文末~
二、三子棋
2.1 大体构想过程
1.进入游戏
首先在测试文档中构想出大体框架:
int cho = 0; //记录用户的选择
do{
menu();
scanf("%d",&cho);
switch (cho){
case 0:break; //退出游戏
case 1:game();break; //开始游戏
default:printf("wrong! please scanf again");break;
}
}while(cho);
首先打印游戏菜单,然后根据玩家的选择进入相应函数。
2.选择开始游戏
选择开始游戏后的流程构想我是一步一步完善的:
- 首先想到要在游戏开始前为玩家打印一下棋盘,于是编写了pri_chess() 棋盘打印函数
- 后来在打印的时候发现需要对棋盘数组进行初始化,于是编写了init_chess() 棋盘初始化函数
- 打印完棋盘后就开始下棋啦,在这里设置的是玩家先手,所以首先编写了peo_do() 玩家下棋函数。随后编写了com_do() 电脑端下棋函数。
- 在下棋的过程中要判断棋盘是否下满了,所以编写了check_chess() 棋盘检查函数
- 最后,下棋的时候肯定要判断输赢啦,所以编写了win_chess() 判断输赢函数
3.选择退出游戏
直接break 结束函数运行。
2.2具体代码实现
以上就是整个项目实现的流程了,下面看具体的函数实现叭~
1.棋盘初始化函数
void init_chess(char arr[ROW][COL],char c,int row,int col)
{
//在这个函数中传入字符c,可以在调用时自己选择初始化数组内容
int i = 0,j = 0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
arr[i][j] = c;
}
2.棋盘打印函数
void pri_chess(char arr[ROW][COL],int row,int col)
{
int i = 0,j = 0,k = 0;
for(i=0;i<ROW;i++)
{
printf(" ");
for(j=0;j<COL;j++)
{
printf("%c",arr[i][j]);
if(j != COL-1)
printf("|");
}
printf("\n");
if(i != ROW-1)
{
for(k=0;k<=row;k++)
printf("—");
printf("\n");
}
}
}
3.棋盘检查函数
int check_chess(char arr[ROW][COL],int row,int col)
{//检查是否下满
int i = 0,j = 0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
if(arr[i][j] == ' ')
return 1;
return 0;
}
4.玩家下棋函数
void peo_do(char arr[ROW][COL],int row,int col)
{
int i = 0,j = 0;
do{
printf("请输入落子行列->");
scanf("%d %d",&i,&j);
if(i > row | j > col|arr[i-1][j-1] != ' ')
printf("wrong!\n");
}while(i > row | j > col);
arr[i-1][j-1] = '*';
}
5.电脑端下棋函数
void com_do(char arr[ROW][COL],int row,int col)
{
int i = rand()%row;
int j = rand()%col;
while(arr[i][j] != ' ')
{
i = rand()%row;
j = rand()%col;
}
arr[i][j] = '#';
}
6.判断输赢函数
int win_chess(char arr[ROW][COL],int row,int col)
{
int i = 0,j = 0;
//判断每行是否相等
for(i=0;i<row;i++)
{
for(j=0;j<col-1;j++)
if(arr[i][j] != arr[i][j+1])
break;
if(arr[i][j] != ' '&j==row-1)
return (int)arr[i][j];
}
//判断每列是否相等
for(j=0;j<col;j++)
{
for(i=0;i<row-1;i++)
if(arr[i][j] != arr[i+1][j])
break;
if(arr[i][j] != ' '&i==row-1)
return (int)arr[i][j];
}
//判断对角
for(i=0,j=0;i<row-1,j<col-1;i++,j++)
{
if(arr[i][j] != arr[i+1][j+1])
break;
if(arr[i][j] != ' '&i==row-2)
return (int)arr[i][j];
}
for(i=0,j=col-1;i<row-1,j>0;i++,j--)
{
if(arr[i][j] != arr[i+1][j-1])
break;
if(arr[i][j] != ' '&i==row-2)
return (int)arr[i][j];
}
return 0;
}
三、有感
今天尝试编写了三子棋(井字棋),后来又对其进行了扩展,实现了n子棋。
在这次练习中进一步了解了
- #define 用法的印象~
- 随机函数 srand() 的使用
- 二维数组的使用
该游戏的实现还存在以下不足:
- 游戏界面简陋
- 电脑端下棋的算法粗糙,有待改进