头文件 game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3 //直接通过头文件修改行 列 数
void InitBoard(char board[ROW][COL],int row,int col);
void DisplayBoard(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);
//告诉四种状态
//电脑赢 ---'#'
//玩家赢 ---'*'
//平局 ---'Q'
//继续 ---'c'
char Iswin(char board[ROW][COL],int row,int col);
game.c 文件---函数定义
清空棋盘函数定义
#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 DisplayBoard(char board[ROW][COL],int row,int col)//打印棋盘
{
int i = 0;
for(i = 0;i <row;i++)
/* {
//打印一行数据
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//打印分割行
printf("---|---|---\n");//棋盘如图一
}*/
/*{
//打印一行数据
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//打印分割行
if(i<row-1)
printf("---|---|---\n");//棋盘如图二
}*/
}//该画棋盘方式不合适,只适合三行三列,
优化如下
图一: 图二
绘制棋盘函数定义---- DisplayBoard
// DisplayBoard函数优化
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)
{
for(j = 0;j <col;j++)
{
printf("---");
if(j < col-1)
printf("|");
}
printf("\n");
}
}
}
玩家操作函数定义---Playermove
void Playermove(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
printf("玩家走:>");
scanf("%d%d",&x,&y);
//判断x y 坐标的合法性
while(1)
{
printf("请输入目标坐标:>");
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");
}
}
}
电脑操作函数定义--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;
}
}
}
判断棋盘是否满了的函数定义--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;//满了
}
判断输赢的函数定义---Iswin
这里的判断存在缺陷,只能判断 3×3 棋盘的输赢
//这里的判断存在缺陷,只能判断 3×3 棋盘的输赢
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[1][1] != ' ')
{
return board[1][1];
}
if(board[2][0] == board[1][1]&&board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断是否平局
if(1 == Isfull(board,ROW,COL))
{
return 'Q';
}
}
test.c 文件
#include"game.h" //用双引号引用自己的头文件
void menu()
{
printf("********************\n");
printf("******1.play********\n");
printf("******0.quit********\n");
printf("********************\n");
}
void game()//采用二维数组记录位置
{
//数组——存放走出的棋盘信息
char board[ROW][COL] = {0};//利用头文件决定行列数
//刚开始全部空格,初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
int ret = 0;
while(1)
{
//玩家下棋
Playermove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断玩家是否赢
ret = Iswin(board,ROW,COL);
if(ret != 'c')
{
break;
}
//电脑下棋
Computermove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断电脑是否赢
if(ret != 'c')
{
break;
}
}
if(ret =='*')
{
printf("玩家赢");
}
else if(ret == '#')
{
printf("电脑赢");
}
else
{
printf("平局");
}
}
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("退出游戏>:");
break;
default:
printf("选择错误,请重新选择>:");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}