在编写三子棋时最好采用图片中创建项目方式,将源文件和头文件分开创建
以后头文件放在game.h中就可以在其他源文件直接调用game.h头文件就行
game.h中放的代码如下:
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define ROW 3
#define COL 3
enum ED
{
Easy = 1,
Diff
};
void InitBoard(char board[ROW][COL],int row,int col);//初始化棋盘函数
void DisplayBoard(char board[ROW][COL],int row,int col);//打印棋盘函数
void CompeterEasy(char board[ROW][COL],int row,int col);//简单电脑走函数
int CompeterDiff(char board[ROW][COL],int row,int col);//困难电脑走函数
void CompeterStartMove(char board[ROW][COL],int row,int col,int input2);//电脑先走函数
void PlayerMove(char board[ROW][COL],int row,int col,int input2);//人先走函数
void CompeterSelect(char board[ROW][COL],int row,int col,int input2);//电脑选择模式函数
char Iswin(char board[ROW][COL],int row,int col); //判断谁赢函数
#endif
game.c中主要放的是游戏中所需要的的功能
#define _CRT_SECURE_NO_WARNINGS 1
#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]);
if(i < ROW - 1)
{
printf("---|---|---\n");
}
}
}
static 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;
char ret = 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[2][2]==board[1][1])&&(board[1][1]!=' '))//左对角三个棋子相等
{
return board[1][1];
}
else if((board[0][2]==board[1][1])&&(board[2][0]==board[1][1])&&(board[1][1]!=' '))//右对角三个棋子相等
{
return board[1][1];
}
if(Isfull(board,row,col))//判断棋盘是否为满
{
return 'q';
}
else
{
return '#';
}
}
void CompeterEasy(char board[ROW][COL],int row,int col)//电脑简单模式
{
int x = 0;
int y = 0;
while(1)
{
x = rand()%3;
y = rand()%3;
if(board[x][y] == ' ')
{
board[x][y] = 'D';
break;
}
}
}
int CompeterDiff(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][0]!=' ')
{
board[i][2] ='D';
return 1;
}
if((board[i][0]==board[i][2])&&(board[i][1]==' ')&&board[i][2]!=' ')
{
board[i][1] ='D';
return 1;
}
if((board[i][2]==board[i][1])&&(board[i][0]==' ')&&board[i][1]!=' ')
{
board[i][0] ='D';
return 1;
}
}
for(i = 0;i < col;i++) //判断每一列上是否有两个相同的棋子
{
if((board[0][i]==board[1][i])&&(board[2][i]==' ')&&board[0][i]!=' ')
{
board[2][i] ='D';
return 1;
}
if((board[0][i]==board[2][i])&&(board[1][i]==' ')&&board[2][i]!=' ')
{
board[1][i] ='D';
return 1;
}
if((board[2][i]==board[1][i])&&(board[0][i]==' ')&&board[1][i]!=' ')
{
board[0][i] ='D';
return 1;
}
}
//判断主对角线上是否有两个相同的棋子
if((board[0][0]==board[1][1])&&(board[2][2]==' ')&&(board[0][0]!=' '))
{
board[2][2]='D';
return 1;
}
if((board[2][2]==board[1][1])&&(board[0][0]==' ')&&(board[1][1]!=' ')) //做对角线
{
board[0][0]='D';
return 1;
}
if((board[0][0]==board[2][2])&&(board[1][1]==' ')&&(board[2][2]!=' ')) //做对角线
{
board[1][1]='D';
return 1;
}
//判断副对角线上是否有两个相同的棋子
if((board[0][2]==board[2][0])&&(board[1][1]==' ')&&(board[0][2]!=' '))
{
board[1][1]='D';
return 1;
}
if((board[0][2]==board[1][1])&&(board[2][0]==' ')&&(board[1][1]!=' ')) //做对角线
{
board[2][0]='D';
return 1;
}
if((board[2][0]==board[2][2])&&(board[0][2]==' ')&&(board[2][2]!=' ')) //做对角线
{
board[0][2]='D';
return 1;
}
return 0;
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while(1)
{
printf("请输入->(x,y)");
fflush(stdin);
scanf("%d,%d",&x,&y);
if(x>=1 && x<=3 && y>=1 && y<=3)
{
if(board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("坐标被占,请重新输入\n");
continue;
}
}
else
{
printf("输入坐标不在棋盘内\n");
continue;
}
}
}
void CompeterStartMove(char board[ROW][COL],int row,int col,int input2)
{
char ret;
InitBoard(board,row,col);//初始化
DisplayBoard(board,row,col);//打印棋盘
do
{
CompeterSelect(board,row,col,input2);//电脑走
DisplayBoard(board,row,col);//打印棋盘
ret = Iswin(board,row,col);//判断是否赢了
if(ret != '#')
{
break;
}
PlayerMove(board,row,col);//玩家走
DisplayBoard(board,row,col);
ret = Iswin(board,row,col);
if(ret != '#')
{
break;
}
}while(ret == '#');
if(ret == 'D')
{
printf("你真弱,电脑赢了,好好练练吧\n");
}
else if(ret == '*')
{
printf("恭喜你,赢了\n");
}
else if(ret == 'q')
{
printf("平局\n");
}
}
void PlayerStartMove(char board[ROW][COL],int row,int col,int input2)
{
char ret = 0;
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 != '#')
{
break;
}
}
CompeterSelect(board,row,col,input2);
DisplayBoard(board,row,col);
ret = Iswin(board,row,col);
{
if(ret != '#')
{
break;
}
}
}
if('*'==ret)
{
printf("恭喜你,赢了\n");
}
else if('D' == ret)
{
printf("你真弱,电脑赢了,好好练练吧\n");
}
else if('q'== ret)
{
printf("平局\n");
}
}
void CompeterSelect(char board[ROW][COL],int row,int col,int input2)//选择电脑简单还是困难模式
{
int ret=0;
printf("电脑走\n");
if(Easy == input2)
{
CompeterEasy(board,row,col);
}
if(Diff == input2)
{
ret = CompeterDiff(board,row,col);
if(0 == ret) //电脑无法给出最优位置,则随机给值
{
CompeterEasy(board,row,col);
}
}
}
test.c中放的是main函数以及菜单的打印和调用game.c中功能的函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu1()
{
printf("******************************\n");
printf("**** 欢迎来到三子棋游戏 ****\n");
printf("**** 1.玩游戏 0.退出 ****\n");
printf("******************************\n");
}
void menu2()
{
printf("*****************************\n");
printf("**** 1.简单模式 ****\n");
printf("**** 2.困难模式 ****\n");
printf("*****************************\n");
}
void menu3()
{
printf("******************************\n");
printf("**** 1.玩家先走 ****\n");
printf("**** 2.电脑先走 ****\n");
printf("******************************\n");
}
void game()
{
int input2 = 0;
int input3 = 0;
char board[ROW][COL]= {0};
menu2();
fflush(stdin);
printf("请选择模式\n");
scanf("%d",&input2);
system("cls");
menu3();
fflush(stdin);
printf("请选择谁先手\n");
scanf("%d",&input3);
switch(input3)
{
case 1:
PlayerStartMove(board,ROW,COL,input2);
break;
case 2:
CompeterStartMove(board,ROW,COL,input2);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
void test()
{
int input1 = 0;
srand((unsigned int)time(NULL));
do
{
menu1();
printf("请输入:");
fflush(stdin);
scanf("%d",&input1);
system("cls");
switch(input1)
{
case 0:
exit(0);
break;
case 1:
game();
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(input1);
}
int main()
{
test();
system("pause");
return 0;
}
在编写这个程序时我出现的问题有:
1.每行相等时==写成了=,这样判断值一直有问题;
2.在返回return 'q ' 时,我多给q后面打了一个空格,然后就会出现逻辑错误;
ret = Iswin(board,ROW,COL);
{
if(re t!= ' ' ) // 这里就会接收' ',而不是q,所以当我棋满是就会卡死
{
break;
}
}
3.每次打印棋盘都是要判断是否有人获胜
4.在你编写游戏时,你要一步一步编写,一个功能实现后再加另一个功能,有错误了慢慢调试