Hello,各位小伙伴们好啊,这篇博客是用C语言实现了三子棋的游戏,感兴趣的友友可以试试玩哦~
咦,当我们以玩家的身份和电脑玩这个游戏的时候,有哪些步骤呢?那么,反过来,我们设计游戏的人应该怎么去设计呢?
接下来就先讲讲几个关键点吧:
(1) 打印棋盘:
为了让玩家玩的开心也让棋盘的格式清晰一点,可以使用函数,循环等方式打印棋盘;
(2)玩家下棋:
打印棋盘----->下棋(这里又分为两种情况,当玩家输入他所要下的棋子的坐标是合法的还是非法的,此时就需要分类讨论)
(3)电脑下棋:
利用随机函数产生一个棋子的坐标
(4)判断输赢:
玩游戏嘛有输有赢很正常,所以可以对玩家赢,电脑赢或者双方打成平局的这几种情况利用所学知识进行分类讨论的设计吆;
接下来,重头戏来啦......
在这种设计游戏的过程中,分文件写代码就显得格外清楚也格外有优势了
这里我们就可以创建三个文件:
一个头文件:game.h 用于声明函数,宏定义等;
一个源文件:game.h 用于实现头文件中所有声明的函数;
一个源文件:test.h 用于控制整个小游戏的整个大轮廓。
(为什么要这么设计呢,就是为了让整个代码整洁,清楚,不啰嗦)
那在刚进入游戏,怎么让玩家进行选择呢?这里我们就可以简单打印一个菜单,小调皮一下哦
void menu()
{
printf("*************************************\n");
printf("************* 1.开始啦 **************\n");
printf("************* 0.退出喽 **************\n");
printf("*************************************\n");
}
完整的游戏代码:
game.h
#pragma once
#include
#include
#include
//这里使用宏定义来定义棋盘的大小,可以大大提高代码的灵活性
#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);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//若玩家赢,打印' * '; 若电脑赢,打印' # ';
//若打成平局,打印"Q";
//若未分胜负,则打印"C";
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印菜单
void menu()
{
printf("*************************************\n");
printf("************* 1.开始啦 **************\n");
printf("************* 0.退出喽 **************\n");
printf("*************************************\n");
}
void game()
{
//定义一个数组
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisPlayBoard(board, ROW, COL);
//开始下棋
char 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);
//判断输赢
ret = IsWin(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;
}
在这个test.c 文件中,我们得完全把整个游戏大概的框架构造出来,可以让整体轮廓走起来。
(1)游戏的进入;
(2)游戏的退出;
(3)游戏的主体;
下面的代码分支就是所有关于游戏主体的每个详细部分啦〰
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h" //在game.h中已经包含了其他头文件,所以在这里只需要引用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)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
int j = 0;
for (j = 0; j < col;j++)
{
printf("%c", board[i][j]);
}
printf("\n");*/
}
玩家下棋:
(1)玩家输入的坐标合法:
a:可以下棋;
b:不可以下棋(当玩家所输入的棋子坐标已被占用时)
(2)玩家输入的坐标不合法:提醒玩家重新输入棋子坐标;
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
//输入要下棋子的坐标
int x = 0;
int y = 0;
printf("请玩家下棋:>\n");
//分情况讨论
while (1)
{
//提示玩家
printf("请输入所要下的棋子的坐标,中间需要使用空格:>\n");
//玩家输入坐标
scanf("%d %d", &x, &y);
//分情况讨论
//坐标合法:
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//满足前面的条件后,如果保证坐标x,y都为空格
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)
{
int x = 0;
int y = 0;
printf("电脑下棋:>\n");
while (1)
{
x = rand() % row;//产生的随机数取 row 的模,得到的结果肯定是0 --- row-1 之间的数;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判断棋盘是否已满 :
//判断棋盘是否已满
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
判断输赢:(由于这个小游戏的规则特殊,我们在玩家和电脑下完棋的每一步都可以调用这个函数从而对比赛结果进行一个判断,确保程序的逻辑)
(1)如果赢了,可分为四种情况:(整行,整列,主对角线,反对角线);
(2)如果双方打成平局;
(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][0] != ' ')
{
return board[i][0];
}
}
//如果是一整列
for (i = 0; i < row; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][1] != ' ')
{
return board[0][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];
}
//如果双方打成平局了
if (IsFull(board, row, col) == 1)
{
return 'Q';
}
//如果未分胜负,继续
return 'C';
}
下面呢,就是这个小游戏简单实现的视频录制,有对的地方,也有刻意输错体现程序的地方哦
http:// https://b23.tv/xo6GwrI
写代码从来不是一鼓作气写成功的,都是在不断的测试中调试代码,不断的测试中优化代码,行百里路半九十九,无论写简单的代码还是较为复杂的代码,不能急促,不能盲目追求结果,一步一个脚印的走,结果肯定不会太差哦。所有人,加油吖!
各位大佬,小伙伴们;若有错误之处,欢迎指点吆~