首先我们先来了解三字棋是什么,三字棋俗称井字棋,三颗棋子为一条线连起来即可胜利。而井字棋的格子为3X3的棋盘,如果棋盘中棋子满了即为平局。
需要创建三个文件,我创建的是Game.h Game.c main.c 三个文件,方便我们查看代码,使整个代码的观赏性会好很多。 然后我们需要思考整个游戏的代码思维,先把步骤想好然后去实施
首先我们需要先制定一个游戏的菜单页面进行选择开始游戏,或者是退出游戏,我们需要两个选择一个是进入,一个是退出 当我们游戏菜单写好之后我们需要选择菜单中的选项,选择是否游戏,所以我们需要定义一个数来选择游戏菜单栏中的选项 这里我们使用一个dowhile循环来包含这个switch语句,如果0为假即可退出循环,如果为真,循环将继续
void menu()
{
printf("**************************************\n");
printf("********* 0.exit *******\n");
printf("********* 1.enter *******\n");
printf("**************************************\n");
}
int main()
{
int import = 0;
do
{
menu();
printf("Please Choose:>>>>>>>>>>>>>>");//这里我们可以提示一下输入你想要输入的内容
scanf("%d", &import);
switch(import)//使用switch语句
{
case 0:
printf("program is quiting\n");//为退出该循环
break;
case 1:
// printf("start the Game\n");//开始游戏选项,为我们后续制定调用游戏的函数做铺垫
break;
default:
printf("Please Choose all over again\n");//输入错误,重新输入
break;
}
} while (import);
return 0;
}
这个步骤做完之后我们需要运行一下看一下代码是否可以运行成功
将case 1中的printf替换掉换为Game函数,Game函数为游戏的入口进行调用 main.c文件
// 2.1 当我们的菜单栏已经设置成功之后我们就可以写进入游戏后的棋盘初始化和生成棋盘的代码了。
char board[ROW][COL] = {0};//2.2首先我们可以先创建一个二维数组,这个数组中的数我们可以在Game.h 中定义define
//define定义之后的数可以进行少量操作就可以修改棋盘本身的大小
Init_board(board, ROW, COL);//2.3初始化棋盘
Display_board(board, ROW, COL); // 2.4打印初始化的棋盘让其显示在棋盘中
Game.h文件
void Init_board(char board[ROW][COL],int row,int col);
void Display_board(char board[ROW][COL],int row,int col);
Game.c文件
#include"Game.h"
void Init_board(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] = ' ';//将二维数组中的3x3初始化为空格;
}
}
}
void Display_board(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++)
{
printf(" %c ", board[i][j]);
if(j<col-1)//这里我们的|只需要打印两列,因为井字棋只需要两列即可3x3
printf("|");//这个为每个坐标隔开 | 打印三次,
}
printf("\n");//记得换一下行,打印下一行
if(i<row-1)//我们的行也只需要两行
{
for (j = 0; j < col;j++)
{
printf("---");//打印行
if(j<col-1)
{
printf("|");//打印列 打印两次
}
}
printf("\n");//换行
}
}
//第二步骤完成,运行代码看是否可以运行
}
接下来玩家下棋,我们需要给玩家设置坐标,坐标的范围,如果超出坐标会怎么样,在坐标范围内被占用坐标怎么办,都需要想明白,下棋需要进行一个循环 main.c文件
while(1)
{
Player_Move(board, ROW, COL);//3.1 这里我们写一个玩家下棋的代码
Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while
}
Game.h文件
void Player_Move(char board[ROW][COL],int row,int col);
Game.c文件
void Player_Move(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;//设置两个变量,为我们的x轴和y轴
while(1)
{
printf("Please enter coordinates:>>>>>>>>>>");
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("The coordinate was used\n");//不为空格,即被占用
}
}
else
{
printf("Out of range, re-select");//不满足,超出范围,重新选择
}
}
//第三步骤完成,打印查看效果
电脑下棋相对来说简单一些,我们只需要调用一个库函数让其产生随机值,随机值%坐标来随机下棋 main.c文件
srand((unsigned)time(NULL));//在main主函数中
Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
Display_board(board, ROW, COL);
Game.h文件
void Computer_board(char board[ROW][COL],int row,int col);
Game.c文件
void Computer_board(char board[ROW][COL],int row,int col)
{
int x, y;
while(1)//记得循环
{
x = rand() % row;//rand为随机数,取模%row/col中的数不能超过他的本身为0~2
y = rand() % col;
if(board[x][y]==' ')
{
board[x][y] = '#';
break;//跳出
}
}
//第四步完成,运行查看
}
游戏玩家下棋和电脑下棋我们都已经布置好,这里我们就需要判断输赢以及平局 当然我们需要判断几种条件,在当前条件下,井字棋的游戏条件只有三中,1.玩家赢/2.电脑赢/3.平局 main.c文件
void Game()
{
char rec = 0;
char board[ROW][COL] = {0};
Init_board(board, ROW, COL);
Display_board(board, ROW, COL);
while(1)
{
Player_Move(board, ROW, COL);
rec = Is_win(board, ROW, COL);//这里我们需要定义一个函数并用rec来接收这个返回的结果。
if(rec!='c')
{
break;//如果返回的结果不为‘c'则跳出循环
}
Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while
Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
rec = Is_win(board, ROW, COL);
if(rec!='c')
{
break;
}
Display_board(board, ROW, COL);
}
Game.h
char Is_win(char board[ROW][COL],int row,int col);
Game.c
char Is_win(char board[ROW][COL],int row,int col)//判断
{
int x = 0;
int y = 0;
//这里我们需要判断赢棋的几种方式,首先是横竖三列赢棋,其次的两个斜边赢棋
for (x = 0; x < row;++x)//横坐标赢棋
{
if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][2] != ' ')//下标-1
{
return board[x][1];
}
}
for (y = 0; y < row;++y)//纵坐标赢棋
{
if (board[0][y] == board[1][y] && board[1][y] == board[2][y] && board[2][y] != ' ')
{
return board[1][y];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[1][1];
}
这里我们已经完成了赢棋的返回结果
如果棋盘满了的话我们可以调用函数Is_FULL
if(Is_FULL(board,x,y))
{
return 'y';//如果满了返回y值,即为平局
}
else
{
return 'c';
}
}
char Is_FULL(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;
}
这样我们的第五步骤就完成了,然后我们可以运行游戏。
main.c
#include"Game.c"
void Game()
{
char rec = 0;
// 2.2 当我们的菜单栏已经设置成功之后我们就可以写进入游戏后的棋盘初始化和生成棋盘的代码了。
char board[ROW][COL] = {0};//2.3首先我们可以先创建一个二维数组,这个数组中的数我们可以在Game.h 中定义define
//define定义之后的数可以进行少量操作就可以修改棋盘本身的大小
Init_board(board, ROW, COL);//2.4初始化棋盘
Display_board(board, ROW, COL); // 2.5打印初始化的棋盘让其显示在棋盘中
while(1)
{
Player_Move(board, ROW, COL);//3.1 这里我们写一个玩家下棋的代码
//5.1 游戏玩家下棋和电脑下棋我们都已经布置好,这里我们就需要判断输赢以及平局
//当然我们需要判断几种条件,在当前条件下,井字棋的游戏条件只有三中,1.玩家赢/2.电脑赢/3.平局
rec = Is_win(board, ROW, COL);//这里我们需要定义一个函数并用rec来接收这个返回的结果。
if(rec!='c')
{
break;//如果返回的结果不为‘c'则跳出循环
}
Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while
Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
rec = Is_win(board, ROW, COL);
if(rec!='c')
{
break;
}
Display_board(board, ROW, COL);
}
//跳出循环直接进行判断
if(rec=='*')
{
printf("Player is win\n");
}
else if (rec=='#')
{
printf("Computer is win\n");
}
else
{
printf("Dead heat\n");
}
}
void menu()
{
printf("**************************************\n");
printf("********* 0.exit *******\n");
printf("********* 1.enter *******\n");
printf("**************************************\n");
}
int main()
{
srand((unsigned)time(NULL));//为4.1电脑随机下棋步骤
int import = 0;
do
{
menu();
printf("Please Choose:>>>>>>>>>>>>>>");//这里我们可以提示一下输入你想要输入的内容
scanf("%d", &import);
switch(import)//使用switch语句
{
case 0:
printf("program is quiting\n");//为退出该循环
break;
case 1:
// printf("start the Game\n");//开始游戏选项,为我们后续制定调用游戏的函数做铺垫
Game();//2.1 将printf替换掉,调用Game函数,这是游戏的入口
break;
default:
printf("Please Choose all over again\n");//输入错误,重新输入
break;
}
} while (import);
return 0;
}
Game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void Init_board(char board[ROW][COL],int row,int col);
void Display_board(char board[ROW][COL],int row,int col);
void Player_Move(char board[ROW][COL],int row,int col);
void Computer_board(char board[ROW][COL],int row,int col);
char Is_win(char board[ROW][COL],int row,int col);
Game.c
#include"Game.h"
void Init_board(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] = ' ';//将二维数组中的3x3初始化为空格;
}
}
}
void Display_board(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++)
{
printf(" %c ", board[i][j]);
if(j<col-1)//这里我们的|只需要打印两列,因为井字棋只需要两列即可3x3
printf("|");//这个为每个坐标隔开 | 打印三次,
}
printf("\n");//记得换一下行,打印下一行
if(i<row-1)//我们的行也只需要两行
{
for (j = 0; j < col;j++)
{
printf("---");//打印行
if(j<col-1)
{
printf("|");//打印列 打印两次
}
}
printf("\n");//换行
}
}
//第二步骤完成,运行代码看是否可以运行
}
void Player_Move(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;//设置两个变量,为我们的x轴和y轴
while(1)
{
printf("Please enter coordinates:>>>>>>>>>>");
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("The coordinate was used\n");//不为空格,即被占用
}
}
else
{
printf("Out of range, re-select");//不满足,超出范围,重新选择
}
}
//第三步骤完成,打印查看效果
}
void Computer_board(char board[ROW][COL],int row,int col)
{
int x, y;
while(1)//记得循环
{
x = rand() % row;//rand为随机数,取模%row/col中的数不能超过他的本身为0~2
y = rand() % col;
if(board[x][y]==' ')
{
board[x][y] = '#';
break;//跳出
}
}
//第四步完成,运行查看
}
char Is_FULL(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 Is_win(char board[ROW][COL],int row,int col)//判断
{
int x = 0;
int y = 0;
//5.2这里我们需要判断赢棋的几种方式,首先是横竖三列赢棋,其次的两个斜边赢棋
for (x = 0; x < row;++x)//横坐标赢棋
{
if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][2] != ' ')//下标-1
{
return board[x][1];
}
}
for (y = 0; y < row;++y)//纵坐标赢棋
{
if (board[0][y] == board[1][y] && board[1][y] == board[2][y] && board[2][y] != ' ')
{
return board[1][y];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[1][1];
}
if(Is_FULL(board,x,y))
{
return 'y';//如果满了返回y值,即为平局
}
else
{
return 'c';
}
//第五步骤完成,运行程序看是否可以运行
}