规则
玩家和电脑在3*3的九宫格里面下棋
当行或列或对角线有三个连续相同的棋子、或者棋盘满的时候,游戏结束
游戏实现
棋盘
棋盘的实现的实现是一个二维数组,这个跟扫雷那里不一样,我们只需要限定玩家和电脑只能在9*9的格子里下棋就可以了。
看一下效果:
初始化棋盘
初始化其实很简单,因为我们棋盘实际上是一个二维数组,给它赋值,如上图所示,需要下棋的位置最开始我们赋值成空格,方便棋盘的展示。
代码如下
void BoardInit(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
打印棋盘
棋盘的打印,我们需要加上一些分割符,将棋盘展现出来,方便下棋。
|
|
|
代码如下
void BoradDisplay(char board[ROW][COL], int row, int col)
{
for (int i = 0; i <= col;i++)//打印行标
{
if (i == 0)
printf(" ");//开头空出两个空格
else
{
printf("%d ", i);//打印一个数字然后是两个空格
}
}
printf("\n");//记得换行
for (int i = 0; i < row; i++)
{
printf("%d", i + 1);//打印每一行之前,打印行标
for (int j = 0; j < col;j++)
{
printf(" %c ", board[i][j]);//数组中的元素
if (j < col - 1)//小于col-1的意思是每行只用打印两次,最后一个格子后边不用打印了
printf("|");//打印分隔符
}
printf("\n");//换行
for (int j = 0; j < col; j++)
{
if (i < row - 1)
{
if (j==0)
{
printf(" ---");//空格加上三个-
//原因是,上一行的格子那里是, 空格棋子空格分隔符,是四个字符
//别忘了前面还有一个行标让整体后移了一个字符,这个空格的作用就是为了
//保证分隔符和上一行的对齐
}
else
{
printf("---");//正常打印分隔符
}
if (j < col - 1)//正常打印分隔符
printf("|");
}
}
printf("\n");//棋盘打印后打一个换行
}
}
棋盘的打印工作只是为了方便展示,这些空格啊,分隔符啊,慢慢研究一下,对齐即可,可以看一下代码中的注释,方便理解。
下棋
玩家下棋
玩家输入一个坐标,在该位置落子
注意:
保证输入的坐标只能在九个格子内部
已落子的格子不能重复下棋
代码如下
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋\n");
printf("请输入坐标:>");
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");
}
}
else//坐标不合法
{
printf("坐标输入错误,请重新输入!!\n");
}
}
}
注意,玩家看到的是行列都是1到3,但实际上数组的下标是从0开始,所以落子的时候,我们要对玩家输入坐标的行和列减去1,才能找到正确的位置。
电脑下棋
电脑的下棋很简单,只需要生成一个合理的坐标即可。
代码如下
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
//产生合法坐标
printf("电脑下棋\n");
while (1)
{
x = rand() % 3;//产生0~2的数字
y = rand() % 3;//产生0~2的数字
if (board[x][y] == ' ')//该位置没有棋子
{
board[x][y] = '#';
break;//下完之后,退出循环
}
}
}
判断输赢
判断输赢后,有四种状态,对于不同状态我们给出不同的返回值
玩家赢------------------‘*’
电脑赢------------------‘#’
平局 ------------------‘Q’
继续游戏----------------‘C’
输赢的判断
根据三子棋的规则,我们只需要判断三行、三列和两条对角线上是否有三个连续相同的棋子(不能是三个连续的空格哦)即可
平局的判断
我们只需要判断棋盘是否已经满了
继续游戏的判断
排除上面三种情况,就是继续游戏
代码如下
三子棋的棋盘比较小,所以我们直接依次判断就好了。
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断三行
for (i = 0; i < col; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][2]!=' ')
return board[i][0];
}
//判断三列
for (j = 0; j < row; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j]&&board[2][j]!=' ')
return board[0][j];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[2][2]!=' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&&board[2][0]!=' ')
return board[0][2];
//判断是否平局
if (IsFull(board, row, col))
return 'Q';//平局
else
return 'C';//继续
}
以上就是三子棋相关函数的代码,接下来看一下头文件和主函数内部的内容吧
总结
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void BoardInit(char board[ROW][COL], int row, int col);
void BoradDisplay(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);
主函数
#include"game.h"
void menu()
{
printf("*************************\n");
printf("********* 1.play ******\n");
printf("********* 0.exit ******\n");
printf("*************************\n");
}
void game()
{
char board[ROW][COL];//棋盘
BoardInit(board, ROW, COL);//初始化棋盘
BoradDisplay(board, ROW, COL);//打印棋盘
char temp;
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
temp=IsWin(board, ROW, COL);//判断输赢
if (temp != 'C')
break;
system("cls");//玩家下完棋后把之前打印的棋盘清理掉
BoradDisplay(board, ROW, COL);//打印棋盘
ComputerMove(board, ROW, COL);//电脑下棋
temp = IsWin(board, ROW, COL);//判断输赢
if (temp != 'C')
break;
BoradDisplay(board, ROW, COL);//打印棋盘
}
BoradDisplay(board, ROW, COL);//打印棋盘
if (temp == '*')
printf("玩家赢\n");
else if (temp == '#')
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退出游戏\n");
break;
default:
printf("选择错误,请重新输入选项\n");
break;
}
} while (input);
return 0;
}
以上就是这个三子棋小游戏的全部实现了,整体来讲是比较简单的,但代码还是要自己敲一敲才能更好理解其中的逻辑、熟悉知识点的。
需要源文件的家人们,可以关注一下博主的Gitee仓库,自取哦~~
仓库链接:(点一下就找到了哦~)
game1_三子棋_1_14/game1_三子棋_1_14 · 琦琦爱敲代码/C语言练习 - 码云 - 开源中国 (gitee.com)
我们下一期再见~~
文章介绍了如何使用C语言实现一个简单的三子棋游戏。游戏棋盘由二维数组表示,初始化为空格。玩家和电脑轮流在3*3的棋盘上下棋,当行、列或对角线出现三个连续相同棋子时,游戏结束。代码包括棋盘初始化、打印、玩家与电脑的移动以及判断输赢的函数。最后,文章提供了游戏的主函数流程和头文件内容。
988

被折叠的 条评论
为什么被折叠?



