利用C语言巧妙实现棋类游戏——三子棋

article/2025/9/20 16:13:03

小游戏:三子棋用C语言实现

在这里插入图片描述

你是否学完了C语言的函数、数组、选择结构、循环结构苦于没有实战小项目巩固自己所学的知识呢,今天小程序猿就给大家带来了一个游戏的小游戏——三子棋,利用C语言实现的,希望对大家能有所帮助。


我们大家大多都接触过棋类游戏,最常见的就是五子棋啦,今天我们简化游戏,只涉及到三子棋,两者思路是相同的,如果大家有兴趣在可以在接下来的思路上尝试实现五子棋。

文章目录

  • 小游戏:三子棋用C语言实现
  • 一、游戏规则:
  • 二、实现的思路
  • 三、代码讲解
    • 1.头文件
    • 2.调试部分
    • 3.游戏功能的具体实现


一、游戏规则:

三字棋的规则如下:
我们这里只谈论三子棋,依照这个思路也可以实现五子棋等多种棋类游戏 三子棋规则如下:游戏人和电脑轮流下棋,谁先让自己的三颗棋子连成一条直线获胜,如果棋盘下满则双方平局。


二、实现的思路

提到三子棋就必须要有棋盘,棋盘可以用一个二维数组来实现,因为我们将来数组所存储的内容将是我们的棋子,所以我们定义一个char型数组,下棋的位置可以输入坐标来决定,如果几个坐标对应数组元素的内容一样就表示哪一方获胜,其中涉及了选择分支语句和循环语句,具体实现如下:

三、代码讲解

1.头文件

头文件我们命名为game.h
众所周知,头文件中存放的内容是函数的声明,涉及到的库函数以及宏定义;
我所编写的头文件如下:

#pragma once
#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_move(char board[ROW][COL], int row, int col);
//判断游戏的进行情况
char is_win(char board[ROW][COL], int row, int col);

这里唯一要注意的就是在宏定义#define ROW 3 后面一定没有分号。

2.调试部分

我们将主函数放在调试部分,命名给test.c,主要是程序的框架,不包含游戏主要功能的具体实现;
代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include "game.h"
void menu()
{printf("*********************************\n");printf("********      1. play    ********\n");printf("********      0. exit    ********\n");printf("*********************************\n");
}
void game()
{char ret = 0;char board[ROW][COL] = { 0 };init_board(board, ROW, COL);display_board(board, ROW, COL);while (1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else if (ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}
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;
}

既然是游戏就应该有菜单可供玩家选择,我们简单设计一个菜单;菜单只需要打印内容即可,所以菜单函数设计成void即可;
菜单模块如下;

void menu()
{printf("*********************************\n");printf("********      1. play    ********\n");printf("********      0. exit    ********\n");printf("*********************************\n");
}

游戏部分直接调用我们设计的函数,假设玩家棋子是*,电脑棋子是#,r变量ret表示游戏的进程,*表示玩家获胜,#表示电脑获胜,Q表示平局,c表示游戏继续;
代码如下:

void game()
{char ret = 0;char board[ROW][COL] = { 0 };init_board(board, ROW, COL);display_board(board, ROW, COL);//玩游戏while (1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家获胜\n");}else if (ret == '#'){printf("电脑获胜\n");}else if (ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}

3.游戏功能的具体实现

游戏功能涉及到棋盘的初始化,棋盘的打印,玩家下棋,电脑下棋,棋盘是否占满的判断,游戏结果的判断六大功能,下面分模块进行讲解:

1.棋盘的初始化

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] = ' ';}}
}

此处利用一个二维数组char board[ ][ ]实现对棋盘位置的存储,利用循环将每一个位置都初始化为空格。

2.棋盘的打印

void display_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++){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");}}
}

此处将棋盘按照一种标准格式打印,利用循环打印出棋盘的轮廓,
效果图如下:

在这里插入图片描述

3.玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入要下棋的坐标:>");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("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}
}

玩家下棋的功能就是利用x和y两个变量作为数组的下标,将对应数组的内容替换成玩家的棋子,同时玩家不能在已经有棋子的地方下棋,所以利用了判断语句,判断对应数组存放的内容是否是空格,如果是空格则表示可以在此处下棋,否则就表示坐标被占用了请玩家重新输入,同时如果输入的下标导致数组越界就提示坐标非法,重新输入。

4.电脑下棋

void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");//0~32726//%3-->0~2while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

电脑下棋我们采用rand函数,但是rand函数使用前要定义一个随机入口,就必须用到srand函数,srand函数参数要是一个无符号整型数据,我们用时间戳来作为它的参数,rand函数随机生成0~32726之间的数据,我们对rand函数取模%,就可以让变量x和y的范围锁定在0 ~2之间,如果数组对应的内容为空格则表示可以下棋,用#替换数组的内容。

5.棋盘是否占满的判断

static int is_full(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,不满,返回0

6.结果的判断

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][0] != ' '){return board[i][0];}}for (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[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 (is_full(board, row, col) == 1){return 'Q';}//继续return 'C';
}

如果每一行每一列或者两个对角线上的元素都相同则表示一方获胜,如果都没有则表示平局,棋盘没有下满游戏继续。

7.游戏功能实现部分完整代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#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] = ' ';}}
}
void display_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++){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");}}
}void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入要下棋的坐标:>");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("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}
}
void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
static int is_full(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;
}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][0] != ' '){return board[i][0];}}for (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[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 (is_full(board, row, col) == 1){return 'Q';}//继续return 'C';
}

以上便是三子棋所有功能实现的思路以及代码,希望对大家有所帮助,欢迎大家随时私信,如果对大家有帮助的话可以关注加三连,以后可以互相学习进步~


http://chatgpt.dhexx.cn/article/n04knrCN.shtml

相关文章

基于C#的五子棋游戏设计

目 录 一、 毕业设计内容 3 二、 毕业设计目的 3 三、 工具/准备工作 3 四、 设计步骤和方法 3 &#xff08;一&#xff09; 总体设计 3 1&#xff0e; 总体设计思路及设计图 3 2&#xff0e; 界面设计 4 3&#xff0e; 全局变量设计 4 &#xff08;二&#xff09; 详细设计 5 …

【Unity连载】斗兽棋-棋类游戏开发演示(2)

第四章 游戏操作与指令 如同养育一个婴儿&#xff0c;父母总会一步步引领孩子成长&#xff0c;从蹒跚学步到来去如风&#xff1b;我们对游戏功能的开发&#xff0c;也无疑应当从走出第一步棋开始。现在&#xff0c;我们已经构建出了棋盘、棋子等基本的游戏逻辑对象&#xff1b…

Java游戏开发——中国象棋联机版

游戏介绍&#xff1a; 中国象棋是起源于中国的一种棋戏&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于规则简单&#xff0c;趣味性强&#xff0c;成为流行极为广泛的棋类游戏。 中国象棋使用方形格状棋盘及红黑二色圆形棋子进行对弈&#xff0c…

【论文】word中三线表的快速简单制作

【论文】word中三线表的快速简单制作 首先&#xff0c;打开word点击插入→表格&#xff0c;选择需要插入表格的行列数&#xff0c;行列数没有关系&#xff0c;因为你插入后可以随意添加行列。 则插入了一下表格&#xff1a; 把你所需要的数据放进去&#xff1a; 之后&#…

如何在word中制作线宽不同的三线表

在word中难免会插入特定的三线表&#xff0c;那就现场给给大家演示一遍 1、打开word&#xff0c;点击插入&#xff0c;点击表格&#xff0c;至于插入几行几列看自己的需求哈。 2、右键点击表格&#xff0c;然后点击表格属性 3、点击边框和底纹&#xff0c;对表格去除相关边线 …

论文中的三线表绘制(word)

步骤 1、选中表格&#xff08;点击下图中的红框部分选中&#xff09; 2、右击表格选择“表格属性” 3、点击边框和底纹&#xff0c;再选择无边框&#xff08;先不要点确定&#xff09; 4、设置三线表的上下边框&#xff08;1.5磅&#xff09;&#xff0c;完成下图之后点击确定-…

word三线表标题两条线之间如何出现空白间隔(论文必备)

为了写论文&#xff0c;我需要把以上的标题转换成下图所示的样子 所实现的步骤如下&#xff1a; 1、把标题内容回车 放在下一行 2、加一条绘制表格的线 3、选中第一行对应位置的两格&#xff0c;合并单元格 并填入内容 可以看到单纯的加上边框&#xff0c;两条线之间是没有空…

Word 2016表格三线表制作

1、打开word&#xff0c;点击插入&#xff0c;插入一个表格。 2、选中表格&#xff0c;点击设计&#xff0c;在边框中的笔画粗细选择1.5磅&#xff0c;然后在边框下拉框先选择无框线&#xff0c;再选择上框线和下框线。然后笔画粗细选择0.5磅&#xff0c;选中第一行后&#x…

三线表的制作

目录 前言参考过程 前言 最近在写些东西的时候&#xff0c;需要用到三线表&#xff0c;上网查了一下&#xff0c;将方法记录下来。 参考 三分钟快速制作论文三线表 过程 (1) 先插入一个表格&#xff0c;然后新建一个表格样式 (2) 如下图所示更改 (3) 点击第二步中的格式&a…

word表格跨页多出一根线(三线表)

在word中做三线表&#xff0c;表格跨页了自动在页底部加一横线&#xff0c;下一页页首加一横线这个怎么去掉么 首先感谢上方在知乎给出解决方案的博主&#xff0c; 接着&#xff1a;文中描述大概操作如下&#xff1a; 如果还是不行&#xff0c;那么就拿来dou一个三线表

Word插入三线表

在Word中插入一个三线表&#xff0c;方法如下所示&#xff1a; 一、先插入一个正常的表格&#xff0c;并输入好相应的数据 二、单击表格的左上角按钮&#xff0c;选中整个表格 选中表格之后&#xff0c;【右键】-【表格属性】&#xff0c;在弹出的表格属性对话框中单击【边框与…

在Word文档中插入三线表

在Word文档中插入三线表 ①插入一个适合你的文字安排的表格 例如&#xff0c;我要如下情况的示例; 则插入一个五行两列的表格并输入数据; 输完数据之后可以全选表格设置字体 全选表格——边框——边框和底纹&#xff1a; 然后按照下列设置&#xff1a; 结果如下; 然后再…

word 三线表 中间辅助线即行线如何断开?

达到如下图的目的&#xff1a; http://www.dxy.cn/bbs/topic/20891892#opennewwindow http://muchong.com/t-4447061-1 总而言之&#xff0c;最简单易行的方法就是多插入一列&#xff0c;然后去掉该列的边框即可&#xff01;

新建论文三线表模板,一键格式刷

论文三线表模板 写在最前面①表设计&#xff0c;新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤 写在最前面 论文写完啦&#xff0c;准备调整格式 之前建模也是三线表&#xff0c;但只能基于该文档模板&#xff0c;所以重新设置一下。 …

针对跨页三线表,在Word2016及以上版本中设置表标题和表头在下一页重复以及解决表格跨页处没有下框线的问题

一、在Word2016及以上版本中设置表标题和表头在下一页重复 技巧1&#xff1a;把标题写在表格里&#xff0c;而不是把标题写在表格外&#xff0c;这样表标题也可以跨页重复啦 操作1&#xff1a;选中上述前两行——右击鼠标——选择“表格属性”——选择“行”——勾选“在各页顶…

【办公】word中实现三线表(跨页,续表)

文章目录 前言三线表生成一张表格设置标题和交叉引用设置三线表选中表格的全部设置边框与底纹 设置跨页分割成两个表设置标题行重复 ⭐ 设置续表标识巧妙用文本框 END 前言 在办公中&#xff0c;一些场景需要将普遍表格设设置为三线表(如&#xff1a;论文) 而很多朋友不知道怎…

如何设置三线表线条的粗细

通常编写学生在编写毕业论文时&#xff0c;常用到三线表&#xff0c;而且三线表的线条粗细需要进行设置&#xff0c;使用word进行线条粗细设置时&#xff0c;经常会出现线条粗细不变的情况&#xff0c;以下使用图文形式说明设置过程。 将word的显示调整为100%&#xff0c;如图…

word制作三线表及保存模板

制作三线表 插入---表格 delete删除表格内容 backspace删除表格 开始菜单下选择有无框线 选中表格---布局---查看网格线&#xff08;无框线下显示表格形状&#xff09; 点击表格---表设计---调整磅数---边框刷刷需要更改的边线 上下1.5磅&#xff0c;中间0.5磅 使行间距…

Word三线表创建

三线表是论文写作中经常使用到的表格格式 自定义三线表 “插入”-->“表格”&#xff0c;随便插入一个表格&#xff0c;然后将光标移动到表格内 “表设计”-->“其他”-->“新建表格样式” 修改模板名称为“三线表”&#xff0c;方便下次直接套用 首先设置标题行【…

【软件使用】Word、WPS如何制作三线表

以下教程为在WPS中演示&#xff0c;Word的操作会有细节上的不同 三线表制作教程 1 插入表格2 内容调整3 三线表制作 1 插入表格 插入表格&#xff0c;输入表格内的数据 2 内容调整 可以看到表格中的文字没有居中对齐&#xff0c;接下来对文字进行简单的调整。 &#xff08;1…