你好,我是L-may
-
游戏介绍
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。
-
成品展示
短暂加载后,进入游戏菜单
选择1进入游戏,选择0退出游戏
玩家输入合适的坐标,选择落子,随后电脑落子
直到一方获胜
不过瘾选择1,再来一把,选择0推出游戏
-
制作
1.设计思路
-
创建一个二维数组,用于存放每个坐标的子,无子设置为 ' '(空格),玩家落子为’x’,电脑落子为 'o'。
-
打印9*9棋盘
-
玩家落子,电脑随机落子
-
判断胜负
-
包装,打印菜单
2.步骤详解
一个好的项目,往往是由多个源文件,头文件组合而成
这样的项目,就有分块管理、隐私性的好处。
- 首先我们先创建
Test.c (用于存放各个模块)
game.c (用于存放游戏的主体)
game.h (用来存放声明)
(1).定义宏 设置棋盘的长*宽,并且包含需要的头文件
#define ROW 3
#define COL 3
不建议使用全局变量,因为全局变量在任何时候都有可能被修改。
(2).初始化函数,将数组的每个元素初始化为 ‘ ’ 空格。
void InitBoard(char board[ROW][COL], int row, int col)
{
memset(board, ' ', sizeof(char) * row * col);
}
利用初始化函数 memset
memset(void *s, int ch ,size_t n )三个参数分别为 指针对象,初始化内容,初始化的大小
注意:要调用头文件 cstring
(3).打印棋盘(难点)
思路:
分成俩部分
第一部分: 空格 字符 空格 前俩个有| 最后一个没有
第二部分: --- 前俩个有 | 最后一个没有
每次打印完一部分换行 打印三次第一部分 两次第二部分
void ShowBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 1;
printf("***三子棋***\n");
for (i = 0; i < row; i++)
{
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");
}
}
(4).玩家落子
- 玩家落子标志为 ' x '
- 每次落子需要检查落子的合法性,不能超出边界,不能下在有子的格子上
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家落子\n");
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:>");
scanf("%d%d", &x, &y);
if (x <= col && x >= 1 && y <= row && y >= 1)
{
if (board[y - 1][x - 1] == ' ')
{
board[y - 1][x - 1] = 'x';
break;
}
else
{
printf("已经落子\n");
}
}
else
printf("坐标非法\n");
}
}
(5).电脑落子
电脑随机落子,生成随机数
- 生成随机数的方法,调用rand函数,调用rand函数要先定义srand
- srand((unsigned int)time(NULL))
电脑落子为 ‘ o ',落子要检查为空 ’ ’,才能落子
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑落子o\n");
while (1)
{
int x = rand() % col;
int y = rand() % row;
if (board[y][x] == ' ')
{
board[y][x] = 'o';
printf("电脑落子(%d,%d)\n", x + 1, y + 1);
break;
}
}
}
(6).判断输、赢、平局、继续
定义:
- 返回 ‘x’ 玩家赢
- 返回 'o' 电脑赢
- 返回‘C'平局
- 返回'Q' 继续
赢&输:
- 8种情况
- 列全相同
- 行全相同
- 主对角线相同
- 副对角线相同
平局:
棋盘上没有空子
int IsFull(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int k = 0; k < col; k++) { if (board[i][k] == ' ') return 0; } } return 1; }
继续游戏:
不是赢或输或平局
char IsWin(char board[ROW][COL], int row, int col)
{
//判断列三子
for (int 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 (int i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] &&
board[1][i] == board[2][i] &&
board[0][i] != ' ')
return board[0][i];
}
//判断主对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
return board[0][0];
//判断副对角线
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' ')
return board[2][0];
//判断是否平局
if (IsFull(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
到这里游戏的主体就完成
(7).简单写个菜单完善一下
void menu()
{
//设置加载
char a1[] = "*********************";
char a2[] = " loading.......**";
for (int i = 0; i < strlen(a1); i++)
{
a1[i] = a2[i];
printf("%s", a1);
Sleep(100);
system("cls");
}
//打印菜单
printf("****************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("****************************\n");
}
备注:
Sleep函数表示静止
system("cls”)表示清屏
最后一步,将各个部分完善一下
每次先打印菜单,供玩家选择,然后展示棋盘,玩家选择落子,落完子判断输赢,平局,进行游戏
电脑落子,落完子判断输赢,平局,进行游戏
————编程没有捷径