(一)
首先先写主函数,将功能放在test();
(1)
int main()
{
test();
return 0;
}
test的内函数
void test()
{
int input =0;
do
{
meum();
printf("输入一个数\n");
scanf("%d",&input);
switch(input)
{
case 0:
printf("结束游戏\n");
break;
case 1:
game();
default:
printf("请重新选择\n");
break;
}
}
while(input);
}
内函数中有一个菜单函数,用来刚开始的说明
void meum()
{
printf("*******************************\n");
printf("*********输0结束 输1开始*******\n");
printf("*******************************\n");
}
运行结果如下
(2)开始完成game()函数
首先先画一个棋盘,我们想让这个棋盘行列都可以改变,所以我们再建一个game.c与其匹配的为game.h
我们可以在game.h中定义行和列,这样方便于改变
这样我们便在test.c中定义出来这个棋盘数组
char board[ROW][COL]={'a'};
我们先将数组的元素初始化,使用‘ ’空格来
这样我们创建一个函数为
Init (board,ROW, COL);
先在game.h中声明函数
void Init(char board[ROW][COL],int row,int col);
再在game.c实现其功能(一下每一个函数都是在game.c中实现,在game.h中声明,在test.c中调用)
void Init(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]=' ';
}
}
}
这样数组就被初始化完成了,接下来我们就可以画棋盘了,使用
display(board,ROW, COL);函数
实现这个函数的功能
void display(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");
}
}
}
运行结果如下
此为5*5的棋盘
可以看出我们先对行进行说明
其实这个棋盘就是由两部分组成的,一部分是‘ 下的棋 ’一共是占3个字节两个空格一个符号
每打完这个在打一个 | ,不过最后一个不用打 | 了 也就是用
```c
if(j<col-1)
{
printf("|");
}
来实现的,打完后记得换行接着在下面再打三个—,后面再接一个|,最后一个不打|。
这样我们就将棋盘画出来了
(3)下一步我们来实现下棋功能,该程序是玩家与电脑来互相下棋
①第一步,我们先来实现玩家下棋
使用 playmove(board,ROW,COL);函数
实现其功能
实质就是在往数组中放数
void playmove(char board[ROW][COL],int row,int col)
{
int x,y;
while(1)
{
printf("请输入坐标:\n");
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");
}
}
}
在放数的过程中不要忘了考虑一下坐标是否超过了棋盘和放的地方有没有东西
一般人不会考虑第一行为第0行,所以我们将他们都减一!
②完成电脑下棋
电脑下棋就是随机的,所以用随机数就行
void computermove(char board[ROW][COL],int row,int col)
{
int x,y;
printf("电脑走\n");
while(1)
{
x=rand() % row;
y=rand() % col;
if(board[x][y]==' ')
{
board[x][y]='@';
break;
}
}
}
x=rand() % row;
y=rand() % col;
这是为了它在范围之内
使用rand之间要现在test()函数中定义 srand 这会引入time所以要包含这两个库
#include <time.h>
#include <stdlib.h>
srand((unsigned int)time(NULL));
这样我们就完成了电脑走了
③最后是判断输赢,一共四种结果,分别是玩家赢(*),电脑赢(@),平局(Q),和继续下(c)
每一次走完都需要判断一下
while(1)
{
playmove(board,ROW,COL);
display(board,ROW, COL);
ret=iswin(board,ROW, COL);
if(ret!='c')
{
if(ret=='*')
{
printf("玩家赢");
break;
}
else if(ret=='@')
{
printf("电脑赢");
break;
}
else
printf("平局");
break;
}
computermove(board,ROW, COL);
display(board,ROW, COL);
ret=iswin(board,ROW, COL);
if(ret!='c')
{
if(ret=='*')
{
printf("玩家赢");
break;
}
else if(ret=='@')
{
printf("电脑赢");
break;
}
else
printf("平局");
break;
}
}
其中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][2]==board[i][1]&&board[i][1]!=' ')
return board[i][0];
}
for(i=0;i<col;i++)
{
if(board[0][i]==board[1][i]&&board[2][i]==board[1][i]&&board[1][i]!=' ')
return board[1][i];
}
for(i=0;i<col-2;i++)
{
if(board[i][i]==board[i+1][i+1]&&board[2+i][i+2]==board[1+i][i+1]&&board[1+i][i+1]!=' ')
return board[1+i][i+1];
}
for(i=0;i<col-2;i++)
{
if(board[i][col-1-i]==board[i+1][col-2-i]&&board[2+i][col-3-i]==board[1+i][i+1]&&board[1+i][i+1]!=' ')
return board[1+i][col-2-i];
}
if(1==isfull(board,ROW,COL))
{
return 'Q';
}
return 'c';
}
这就对应的那四种情况
其中isfull是判断是否棋盘满了,来判断平局的情况
int isfull(char board[ROW][COL],int row,int col)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(board[i][j]==' ')
{
return 0;
}
}
}
return 1;
}
这样就可以完成了
(三)全部代码如下
(1)game.h中主要为函数的声明,将本文中的函数在此声明
(2)game.c中的函数是实现游戏的功能的函数,其中包含
(1)
初始化函数
(2)棋盘展示函数
(3)玩家行动函数
(4)电脑行动
(5)判断棋盘是否满
(6)判断输赢函数
(三)test.c中的函数
test.c 函数是主函数有关的程序,程序在此运行其中包括
(1)game函数
(2)meum、(3)test、和(4)主函数