目录
一.前言
二.主体框架
三.游戏内容的实现
四.结语
一.前言
想必大家在小时候或多或少的都接触过井字棋吧,那么今天我就来带大家了解如何在编程中实现这一游戏吧。
二.主体框架
#include
void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}
int main()//要运行游戏我们先创建一个主函数
{
int input = 0;
do
{
menu();//在游戏开始前先给出一个优美的游戏界面
printf("欢迎来到三子棋游戏,请选择:\n");
printf("输入1开始游戏,输入0结束游戏\n");//提示玩家如何开始游戏
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();//游戏主体
break;//当输入1时,玩家就会开始游戏,在游戏进行完后跳出循环
case 0:
printf("游戏已退出\n");
break;//当输入0时,玩家退出
default:
printf("输入错误,请重新输入\n");//输入其他值时,返回输入阶段
}
}while (input);//当输入为0(假)时循环结束,当输入非0(真)时循环再次进行
}
在主体执行逻辑完成后我们再对具体的游戏主体再做设计。
三.游戏内容的实现
井字棋的游戏步骤大致为下
#include
#define ROW 3
#define COL 3
//在这里使用宏定义可以方便之后对数据进行修改,不用再对后面的多个地方进行改动
void game()
{
char board[ROW][COL];//生成棋盘
ini_board(board, ROW, COL);//1.初始化棋盘
printf_board(board, ROW, COL);//2.打印棋盘
while(1)//玩家和电脑下棋步骤
{
player_move(board, ROW, COL);//3.玩家下棋
printf_board(board, ROW, COL);
char ret = is_win(board, ROW, COL);//5.判断是否有人胜出
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);//4.电脑下棋
printf_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
char ret = is_win(board, ROW, COL);
judge(ret);//6.判定游戏结果
}
在这之中我们将具体化各个步骤,设计出相应的函数
1.初始化棋盘
void ini_board(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] = ' ';//对每一元素进行操作,使他们的内容都为一个' '空字符
}
}
}
2.打印棋盘
void printf_board( char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//对每行元素进行操作
{
printf(" | | \n");
//一行仅有三个元素将其一一包围在由' '形成的九宫格正中,且不同元素间用'|'间隔开来
printf(" %c | %c | %c \n", board[i][0],board[i][1],board[i][2]);
printf(" | | \n");
if(i < col-1)//每行元素间以'-'与'|'分割,且最后一行之后无需再做分割
{
printf("---|---|---\n");
}
}
}
运行到此处时的效果如下
3.玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("请输入下棋位置:");
while (1)//万一玩家输入错误,可以不断循环,直到玩家输入正确
{
scanf("%d %d", &x, &y);//输入玩家想下的坐标
if (x <= 3 && y <= 3 && x >= 1 && y >= 1)
{
//玩家是不知道数组元素的下标是从0开始的,因此在输入时需要判定输入值是否在1-3之间
//而不是在0-2之间
if (board[x - 1][y - 1] == ' ')
//只有在此元素未是' '时,才准许玩家下在此处
{
board[x - 1][y - 1] = '*';//玩家下棋使对应元素被*占据
break;//在玩家输入正确后退出循环
}
else
{
printf("坐标已被占用,请重新输入:");//此时玩家所输入的坐标已被*或#占用
}
}
else
{
printf("坐标非法,请重新输入:");//此时玩家所输入的坐标不在1-3这个范围内
}
}
}
运行起来如下图
4.电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
srand((unsigned int)time(NULL));//通过时间戳来获取伪随机值
printf("电脑下棋\n");
while (1)
{
int x = rand() % 3;//获得0-2的随机数
int y = rand() % 3;
if (board[x][y] == ' ')//只有当对应元素为' '时才进行落子替换
{
board[x][y] = '#';//将' '替换成#
break;//结束循环
}
}
}
5.判断结果
在这里我们规定根据不同情况返回不同的值(表示不同含义)
//* - 玩家获胜 //# - 电脑获胜 //Q - 平局 //C - 没有输赢游戏继续
char is_win(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];
//对每列是否有三个元素相同且连成一条线
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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
}
//判定是否所有元素都被占据,即判断是否还有元素为' '
//若还有的话说明棋局还未结束
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'C';
}
}
//以上条件均不满足时,说明所有位置均被占据且没有赢家,即平局
return 'Q';
}
void judge(int ret)
{
if (ret == '*')
printf("玩家获胜\n");
if (ret == '#')
printf("电脑获胜\n");
if (ret == 'Q')
printf("平局\n");
}
至此我们便完成了井字棋的制作(虽然电脑看起来不是很聪明的样子)。
四.结语
此次我们研究了井字棋的运行方式,希望读者能从中获取到一定知识。