首先确立各个函数所需要完成的内容
始化棋盘的函数IniBoard
打印棋盘的函数DisplayBoard
玩家下棋的函数PlayerMove
电脑下棋的函数ComputerMove
判断输赢的函数Iswin
遍历棋盘的函数IsFull
运用这些函数来分模块完成这个游戏
1.在此之前我们假设建立一个3*3大小的棋盘,并初始化一个对应的数组
#define ROW 3//行
#define COL 3//列
char board[ROW][COL]={0};
2.初始化棋盘,我们先构建一个棋盘,并且将棋盘的值保存在数组中
void IniBoard(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]=' ';
}
}
}
3.在玩家或者电脑下棋之后为了更加方便的下棋,我们决定在每次下棋之后都打印一次棋盘
void DisplayBoard(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)//分割行 打印第二行
{
int j=0;
for(j=0;j<col;j++)
{
printf("---");
if(j<col-1)//
printf("|");
}
printf("\n");
}
}
}
4.建立一个函数,完成玩家下棋这一个步骤,我们规定玩家用'*',电脑用'#'
void PlayerMove(char board[ROW][COL],int row,int col)//玩家下棋
{
int x=0;
int y=0;
while(1)
{
printf("玩家下棋->\n");
printf("请输入坐标->");
scanf("%d%d",&x,&y);
if(x<=row&&x>=1&&y>=1&&y<=col)//坐标范围合法的判断
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='*';
break;
}
else
{
printf("坐标被占用\n");
}
}
else
{
printf("输入的坐标为无效坐标,请重新输入:\n");
}
}
}
5.电脑下棋,函数rand可以生成随机数,我们给其模上三,可以产生0---2之间的数,用于模拟电脑下棋,其头文件为#include<stdlib.h>6
void ComputerMove(char board[ROW][COL],int row,int col)//电脑下棋
{
printf("电脑下棋->\n");
int x=0;
int y=0;
while(1)
{
x=rand()%row;//任意数模3的结果为0--2
y=rand()%col; //获取随机数
if(board[x][y]==' ')
{
board[x][y]='#';
break;
}
6.建立一个函数来为输赢规定条件
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];
}
}
int j=0;
for(j=0;j<row;j++)//列的判断
{
if(board[0][j]==board[1][j]&&board[1][j]==board[2][j]&&board[1][j]!=' ')
{
return board[1][j];
}
}
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(IsFull(board,row,col))
{
return 'q';//平局
}
return 'j';//继续
}
其中函数IsFull用于遍历整个棋盘
nt IsFull(char board[ROW][COL],int row,int col)//满返回1,不满返回0
{
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;
}
最后用一个函数将以上连成串
void game()
{
char board[ROW][COL]={0};
char ret=0;
IniBoard(board,ROW,COL);//初始化棋盘
DisplayBoard(board,ROW,COL);//打印棋盘
while(1)
{
PlayerMove(board,ROW,COL); //玩家下棋
ret=Iswin(board,ROW,COL);//ret接受返回值
if(ret!='j')//21分
{
break;
}
DisplayBoard(board,ROW,COL);//打印棋盘
ComputerMove(board,ROW,COL);//电脑下棋
ret=Iswin(board,ROW,COL);
if(ret!='j')
{
break;
}
DisplayBoard(board,ROW,COL);//打印棋盘
if(ret=='#')
{
printf("电脑赢了\n");
}
else if(ret=='*')
{
printf("玩家赢了\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board,ROW,COL);
}
}
为了代码的可阅读性更高,我们可以给出提示的函数
void menu()
{
printf("**********************************\n");
printf("********1.开始 0.退出 *******\n");
printf("**********************************\n");
}
在完善一下main函数即可
int main()
{
srand((unsigned int)time(NULL));//设置随机数的起点
int i=0;
do
{
menu();//菜单
printf("请选择->");
scanf("%d",&i);
switch(i)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("无效选择\n");
break;
}
}while(i);
return 0;
}
别忘了头文件#include<stdlib.h>
#include<time.h>