【C语言】三子棋游戏的实现(玩家VS玩家 or 玩家VS电脑)

article/2025/9/20 15:59:28

目    录

一、三子棋游戏介绍

二、游戏功能函数分析

1 菜单显示函数

2 菜单选择函数

3 选择确认函数

4 显示当前棋盘状态函数

5 棋盘初始化函数        

6 玩家下棋函数

7 电脑下棋函数

8 棋局状态判断函数

三、游戏功能函数的整合

四、三子棋游戏的实现

五、游戏过程截图


一、三子棋游戏介绍

        大多数人应该都玩过三子棋游戏,随便拿张纸,在上边横竖各画两条线形成一个九宫格,即使一个简单的棋盘,横着数、竖着数、沿着正反对角线数,谁率先用自己的三个棋子在这些方向上连成一条线,谁就是赢家。接下来文中就将用C语言实现三子棋游戏

二、游戏功能函数分析

1 菜单显示函数

        虽然只是一个简单的小游戏,但有个菜单界面还是必要的,这个界面一般用printf()函数调整输出自己喜欢的样式就可以了。以下是函数具体的代码实现:

//显示游戏菜单功能
void Menu() {printf("\n                三 子 棋                \n\n\n");printf("                 菜  单                 \n\n");printf("************   1 游戏开始   ************\n");printf("************   0 退出游戏   ************\n");
}

2 菜单选择函数

        既然有了菜单,那就针对菜单做一个进行选择的功能吧,可以看见菜单里目前就是1\0两种选择,那么在这个函数里我们要实现的主要两个点是:提醒玩家进行选择并进行返回;在返回玩家的选择之前确认其输入是1\0两个值之间的一个,如果不是,提醒玩家重新输入选择。以下是函数具体的代码实现:

//选择功能
int MenuSelect() {int select = 0;while (1) {printf("请选择(1\\0):>");scanf("%d", &select);getchar(); //清理换行符'\n'if ((select == 1) || (select == 0)) {return select;}else {printf("选择无效,请重新选择!\n");}}
}

3 选择确认函数

        当玩家选择退出游戏时,这里为了避免玩家不小心选择错误的可能,设置了进行选择确认的函数,确认玩家是否真的要退出游戏,如果是选择Y,否选择N(不区分大小写)并返回选择值。以下是函数具体的代码实现:

//选择确认功能
char SelectConfirm() {char select = 'Y';while (1) {printf("请确认是否退出游戏(Y\\N):>");scanf("%c", &select);getchar(); //清理换行符'\n'if ((select >= 'a') && (select <= 'z')) {select = 'A' + (select - 'a');}if ((select == 'Y') || (select == 'N')) {return select;}else {printf("选择无效,请重新选择!\n");}}}

4 显示当前棋盘状态函数

        下棋首先得有棋盘,三子棋的棋盘是一个九宫格的形状,具体想用什么符号搭建出这样一个棋盘看自己的喜好。即是棋盘,自然也要显示出棋盘上的棋子,每次落子后,都显示出当前棋盘,可以及时观察到游戏进行状态。以下是函数具体的代码实现:

//显示当前棋盘状态功能
void ChessBoard() {int i = 0;int j = 0;printf("\n当前棋盘:\n");for (i = 0; i < ROW; i++) {printf("\t  ");for (j = 0; j < COL; j++) {printf(" %c ", board[i][j]);if (j < COL - 1) {printf("|");}}printf("\n");if (i < ROW - 1) {printf("\t  ");for (j = 0; j < COL; j++) {printf("---");if (j < COL - 1) {printf("|");}}}printf("\n");}
}

5 棋盘初始化函数        

        下棋前还需要确保棋盘上是空的,这里以二维数组来表示棋盘上对应位置的棋子,用空格通过循环对棋盘进行初始化。以下是函数具体的代码实现:

//棋盘初始化功能
void ChessBoard_Initial() {int i = 0;int j = 0; for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {board[i][j] = ' ';}}
}

6 玩家下棋函数

        有了棋盘就可以开始下棋了,下棋首先要确定所执的棋子以及落子的位置,这里设置函数的参数为代表棋子的符号以确定下棋方,落子前要确认落子的位置是否合理,如果玩家选择的落子位置超出了棋盘范围或者该位置上已有棋子,则有必要提醒玩家重新选择位置。以下是函数具体的代码实现:

//下棋功能
void PlayChess(char chess) {int row = 1;int col = 1;while (1) {printf("玩家:请输入下棋位置(行 列):>");scanf("%d %d", &row, &col);getchar(); //清理换行符'\n'if (((row >= 1) && (row <= ROW)) && ((col >= 1) && (col <= ROW))) {if (board[row - 1][col - 1] == ' ') {board[row - 1][col - 1] = chess;break;}else {printf("\n此处已有棋子,请重新下棋!\n");}}else {printf("\n输入不合法,请重新输入!\n");}}
}

7 电脑下棋函数

        下棋是对弈游戏,需要两个游戏玩家,如果只有一个人时,则可以与电脑进行游戏,这里通过时间戳产生随机数,通过随机数来随机生成电脑方的在棋盘范围内的落子位置。同样,落子前要确认落子的位置是否合理,如果电脑随机生成的落子位置上已有棋子,则通过循环重新选择位置。以下是函数具体的代码实现:

//电脑下棋功能
void ComputerPlay(char chess) {srand((unsigned int)time(NULL));int row = 0;int col = 0;while (1) {row = rand() % 3;col = rand() % 3;if (board[row][col] == ' ') {board[row][col] = chess;break;}}printf("电脑:下棋位置(行 列):>%d %d\n", row, col);
}

8 棋局状态判断函数

        在下棋的过程中需要随时判断棋局状态以确定接下来是否还要继续进行当局游戏,根据三子棋游戏输赢的判定规则,依此访问横、竖、对角线上的落子情况:若有一方棋子可连成一线,则返回赢方棋子符号,标志游戏结束;若无胜方,且棋盘上仍有空位,则返回空格表示游戏继续;若无胜方,且棋盘已满,则返回'\0'符号表示游戏结束,双方平局。以下是函数具体的代码实现:

//判断当前棋局,确认是否结束游戏,并返回获胜棋子
char Judge(char chess1, char chess2) {int count1 = 0;  //棋子1计数int count2 = 0;  //棋子2计数int count3 = 0;  //空格计数int i = 0;int j = 0;//行判断for (i = 0; i < ROW; i++) {count1 = 0;count2 = 0;for (j = 0; j < COL; j++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}else {count3++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}}if (count3 == 0) {return '\0';   //表示棋盘已满,游戏结束}//列判断for (j = 0; j < COL; j++) {count1 = 0;count2 = 0;for (i = 0; i < ROW; i++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}}//正对角判断count1 = 0;count2 = 0;for (i = 0, j = 0; (i < ROW) && (j < COL); i++, j++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}//反对角判断count1 = 0;count2 = 0;for (i = 0, j = COL - 1; (i < ROW) && (j >= 0); i++, j--) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}return ' ';  //表示游戏继续
}

三、游戏功能函数的整合

        将上述函数整合进game.c文件中,并在相应的game.h头文件中对各个函数进行声明,同时在game.c文件中包含头文件game.h。具体实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//以二维数组表示棋盘
char board[ROW][COL] = {0};//显示游戏菜单功能
void Menu() {printf("\n                三 子 棋                \n\n\n");printf("                 菜  单                 \n\n");printf("************   1 游戏开始   ************\n");printf("************   0 退出游戏   ************\n");
}//选择功能
int MenuSelect() {int select = 0;while (1) {printf("请选择(1\\0):>");scanf("%d", &select);getchar(); //清理换行符'\n'if ((select == 1) || (select == 0)) {return select;}else {printf("选择无效,请重新选择!\n");}}
}//选择确认功能
char SelectConfirm() {char select = 'Y';while (1) {printf("请确认是否退出游戏(Y\\N):>");scanf("%c", &select);getchar(); //清理换行符'\n'if ((select >= 'a') && (select <= 'z')) {select = 'A' + (select - 'a');}if ((select == 'Y') || (select == 'N')) {return select;}else {printf("选择无效,请重新选择!\n");}}}//棋盘初始化功能
void ChessBoard_Initial() {int i = 0;int j = 0; for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {board[i][j] = ' ';}}
}//显示当前棋盘状态功能
void ChessBoard() {int i = 0;int j = 0;printf("\n当前棋盘:\n");for (i = 0; i < ROW; i++) {printf("\t  ");for (j = 0; j < COL; j++) {printf(" %c ", board[i][j]);if (j < COL - 1) {printf("|");}}printf("\n");if (i < ROW - 1) {printf("\t  ");for (j = 0; j < COL; j++) {printf("---");if (j < COL - 1) {printf("|");}}}printf("\n");}
}//下棋功能
void PlayChess(char chess) {int row = 1;int col = 1;while (1) {printf("玩家:请输入下棋位置(行 列):>");scanf("%d %d", &row, &col);getchar(); //清理换行符'\n'if (((row >= 1) && (row <= ROW)) && ((col >= 1) && (col <= ROW))) {if (board[row - 1][col - 1] == ' ') {board[row - 1][col - 1] = chess;break;}else {printf("\n此处已有棋子,请重新下棋!\n");}}else {printf("\n输入不合法,请重新输入!\n");}}
}//电脑下棋功能
void ComputerPlay(char chess) {srand((unsigned int)time(NULL));int row = 0;int col = 0;while (1) {row = rand() % 3;col = rand() % 3;if (board[row][col] == ' ') {board[row][col] = chess;break;}}printf("电脑:下棋位置(行 列):>%d %d\n", row, col);
}//判断当前棋局,确认是否结束游戏,并返回获胜棋子
char Judge(char chess1, char chess2) {int count1 = 0;  //棋子1计数int count2 = 0;  //棋子2计数int count3 = 0;  //空格计数int i = 0;int j = 0;//行判断for (i = 0; i < ROW; i++) {count1 = 0;count2 = 0;for (j = 0; j < COL; j++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}else {count3++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}}if (count3 == 0) {return '\0';   //表示棋盘已满,游戏结束}//列判断for (j = 0; j < COL; j++) {count1 = 0;count2 = 0;for (i = 0; i < ROW; i++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}}//正对角判断count1 = 0;count2 = 0;for (i = 0, j = 0; (i < ROW) && (j < COL); i++, j++) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}//反对角判断count1 = 0;count2 = 0;for (i = 0, j = COL - 1; (i < ROW) && (j >= 0); i++, j--) {if (board[i][j] == chess1) {count1++;}else if (board[i][j] == chess2) {count2++;}}if (count1 == 3) {return chess1;}else if (count2 == 3) {return chess2;}return ' ';  //表示游戏继续
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>#define ROW 3
#define COL 3//显示游戏菜单功能
void Menu();//选择功能
int MenuSelect();//选择确认功能
char SelectConfirm();//棋盘初始化功能
void ChessBoard_Initial();//显示当前棋盘状态功能
void ChessBoard();//下棋功能
void PlayChess();//电脑下棋功能
void ComputerPlay();//判断当前棋局,确认是否结束游戏
char Judge();

四、三子棋游戏的实现

        编辑源文件test01.c,根据三子棋游戏的流程:1.菜单显示;2.玩家选择进入游戏后进行模式选择(玩家VS玩家(1) or 玩家VS电脑(0));3.模式选择完成后,由玩家选择自己想使用的棋子符号;4.完成上述选择后,开始游戏,先进行棋盘的初始化,显示出当前棋盘。如果选择模式1,由玩家双方交替下棋(虽然是两个玩家,但仍是在同一台电脑上操作),如果选择模式0,由玩家和电脑交替下棋,并在每次落子后进行棋局判断;5.一局游戏结束由玩家进行选择是否需要返回主菜单界面,若是则返回并进入下次循环中,若否则退出游戏。在游戏的过程中,为界面显示更加干净简洁,使用system("cls")函数进行界面清理,使用Sleep()延时函数设置合适的延时时长显示电脑落子选择后进行界面清理。以下是具体的代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//游戏测试
int main() {int select = 0;char selectConfirm = 'Y';char gameConfirm = ' ';  //确认游戏状态char chess1 = 0;char chess2 = 0;while (1) {Menu();select = MenuSelect();if (select == 1) {system("cls");printf("游戏模式(玩家VS玩家(1) or 玩家VS电脑(0)),");select = MenuSelect();printf("请选择玩家1棋子符号:>");scanf("%c", &chess1);getchar();printf("请选择玩家2(电脑)棋子符号:>");scanf("%c", &chess2);getchar();system("cls");printf("\n游戏开始!\n");ChessBoard_Initial();ChessBoard();while (1) {PlayChess(chess1);system("cls");ChessBoard();gameConfirm = Judge(chess1, chess2);if (gameConfirm == ' ') {;}else if (gameConfirm == '\0') {printf("游戏结束,双方平局!\n");break;}else {printf("游戏结束,执%c棋方获胜!\n", gameConfirm);break;}if (select == 1) {PlayChess(chess2);system("cls");ChessBoard();}else {ComputerPlay(chess2);Sleep(800);system("cls");ChessBoard();}gameConfirm = Judge(chess1, chess2);if (gameConfirm == ' ') {continue;}else if (gameConfirm == '\0') {printf("游戏结束,双方平局!\n");break;}else {printf("游戏结束,执%c棋方获胜!\n", gameConfirm);break;}}printf("返回菜单或直接退出游戏,");select = MenuSelect();if (select == 0) {selectConfirm = SelectConfirm();if (selectConfirm == 'Y') {printf("退出游戏!\n");break;}}}else {selectConfirm = SelectConfirm();if (selectConfirm == 'Y') {printf("退出游戏!\n");break;}}	system("cls");}return 0;
}

五、游戏过程截图

以下为游戏过程部分截图:

  

 


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

相关文章

安卓做的棋类游戏

大方大斜 前言一、直接上图二、游戏主要代码1.界面绘制代码2.游戏触摸事件代码 最后 前言 安卓制作棋类游戏&#xff0c;小时候和发小在地上画棋盘&#xff0c;有树叶或者树枝做棋子。 一、直接上图 二、游戏主要代码 1.界面绘制代码 双人界面绘制&#xff0c;主要代码代码如…

基于java的五子棋游戏设计

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网迅速的发展&#xff0c;网络游戏已经成为人们普遍生活中不可或缺的一部分&#xff0c;它不仅能使人娱乐&#xff0c;也能够开发人的智力&#xff0c;就像本文所主要讲的五子棋游戏一样能挖掘人们聪明的才干与脑袋的机灵程…

自己设计的棋类游戏

1、构思&#xff1a; 象棋、国际象棋、井字棋等 我一开始的设计是这个样的&#xff1a;一个5x5的棋盘&#xff08;之后变成7x7&#xff09;&#xff0c;所有棋子摆成一个井字 棋子有两种&#xff0c;一种兵一种王&#xff0c;中间用中立的棋子&#xff0c;就叫box来隔开他们 …

Java围棋游戏的设计与实现

技术&#xff1a;Java等 摘要&#xff1a; 围棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为…

【国际象棋】棋盘游戏-微信小程序开发流程详解

与中国象棋类似的&#xff0c;还有国际象棋&#xff0c;知道有人爱玩&#xff0c;于是凭着好奇心&#xff0c;网上研究了一下&#xff0c;跟中国象棋有相似之处&#xff0c;玩法是有些许不一样&#xff0c;不知道象棋最早出于谁之手呢&#xff0c;抽空做一做&#xff0c;最终完…

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

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

基于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;所以重新设置一下。 …