?????????? 今天学习的是一个三子棋游戏的编程,学习过程有些困难,在模仿编程时出现了小错误,花了一个多小时才找到并解决。希望未来能够仔细编程,认真看好每一步,找bug时也要冷静不能急!
三子棋游戏代码如下:
//头文件
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//声明
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);
char IsWin(char board[ROW][COL],int row,int col);
//主函数文件
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("*********** 1.play ***************\n");
printf("*********** 0.exit ***************\n");
printf("**********************************\n");
}
void game()
{
char ret=0;
//数组-存放走出的棋盘信息
char board[ROW][COL]={'a'};
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
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("玩家赢\n");
}
else if(ret=='#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
int main()
{
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);
return 0;
}
//自定义函数文件
#include"game.h"
void InitBoard(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++)
{
board[i][j]= ' ';
}
}
}
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");
}
}
}
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);
//判断xy坐标的合法性
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)
{
printf("电脑走\n");
while(1)
{
int x=rand()%row;
int y=rand()%col;
if(board[x][y]==' ')
{
board[x][y]='#';
break;
}
}
}
//返回1表示棋盘满了
//返回0表示棋盘没满
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;
int ret;
//横三列
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[0][2] && board[1][1]!=' ')
{
return board[1][1];
}
//判断是否平局
ret=IsFull(board,row,col);
if(ret==1)
{
return 'Q';//Q代表平局
}
return 'C';//C代表继续
}
|