初学者的三子棋游戏

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

摘要:相信每个人都有一个设计游戏的梦想,都曾玩过王者农药,cf等许多游戏,对之充满好奇,好奇他是怎样做出来的呢。

目录

摘要:相信每个人都有一个设计游戏的梦想,都曾玩过王者农药,cf等许多游戏,对之充满好奇,好奇他是怎样做出来的呢。

一、设计游戏

1.游戏的基本流程

2.打印游戏菜单

3.规划

二、游戏划分

1.设计棋盘

2.打印棋盘

3.玩家下棋

4.电脑下棋

5.判断输赢

三、整个游戏代码

test.c

 game.c

 game.h


一、设计游戏

1.游戏的基本流程

首先一个代码的执行要现有main()函数

2.打印游戏菜单

可以通过函数的方法来使主函数变得简洁一些,写一个test()函数用来打印菜单,可以采用do—while循环来写,这样写可以先打印菜单,再判断玩家是否进行游戏。

创建一个整型变量,利用switch语句来判断是否进行下一步。

void test()
{int input = 0;do{//打印菜单printf("************\n");printf("***1.开始***\n");printf("***0.退出***\n");printf("************\n");//判断玩家的选择scanf("%d", &input);switch (input){//选择1则执行游戏程序case 1:game();break;//选择0退出游戏case 0:break;//输入其他的数default:printf("请重新选择\n");}} while (input);
}

3.规划

将每个部分分开

创建一个game.c文件将函数体部分放进game.c里。

创建一个game.h文件用来声明函数。

创建一个test.c文件写游戏的的主体部分

这样做可以合理规划,方便调试。

二、游戏划分

1.设计棋盘

要下棋得先有一个棋盘才能开始啊

首先棋盘3*3的大小

便采用#define来定义常量,也可以方便日后的棋盘大小的更改。

 棋盘的样子也想好了,那便定义一个二维数组用来当作棋盘。

接下就是初始化棋盘,并将其盘打印出来。

2.打印棋盘

要打印棋盘可以先将二维数组初始化为空格,编写一个函数    initialize_board(board, ROW, COL);

在game.c文件里编写函数体,进行二维数组的初始化。

//初始化棋盘
void initialize_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] = ' ';}}
}

当然要在game.h文件里声明该函数。

初始化后便可以将棋盘整体打印出来。

//打印棋盘
void printf_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++){printf(" %c ", board[i][j]);//打印出二维数组的内容if (j < col - 1)//限制打印 | 的次数printf("|");}printf("\n");//打印分割行if (i < row - 1)//这里来限制分割行的次数,重用打印2行---{for (j = 0; j < col; j++)//用来打印每列的---{printf("---");if (j < col - 1)//与上面一样,限制打印 | 的次数printf("|");}printf("\n");}}
}

效果如下

我们来分析这一段代码,首先可以将棋盘分为三行三列,用 | 来隔离每个字符,分割行则利用 --- 来处理;

有2点需要注意:

第2列后不用打 | ,这时便需要限制他的打印次数,可以利用if语句的效果做到限制,编写出  if (j < col - 1)  用来限制打印 | 的次数。

第2行后不用打印 --- ,同样利用上面的if语句  if (i < row - 1)   来限制分割行的次数,只用打印2行分割行  ---   。

3.玩家下棋

棋盘已将打印出来,接下来便是游戏的开始了,这时就要往棋盘里下棋。

//玩家下棋
void play_game(char board[ROW][COL], int row, int col)
{//定义2个整型常量,来存放玩家输入的坐标位置int x = 0;int y = 0;printf("玩家下棋\n");printf("请输入坐标\n");while (1){scanf("%d %d", &x, &y);//判断玩家输入的坐标是否在范围内if (x > 0 && x <= row && y > 0 && y <= col){//判断坐标是否被占用if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("坐标已被占用,请重新输入坐标。\n");}}elseprintf("坐标非法\n");}
}

4.电脑下棋

玩家下完棋,就该电脑下了,那电脑该怎么下棋呢?

这是要利用到库函数   rand()函数;来生成一个随机数。

//电脑下棋
void computer_game(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){x = rand() % row;//生成0~2的数字y = rand() % col;//生成0~2的数字if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

这里的x = rand() % row; 很重要,%row可以将生成的数字保持在0~2之间,y也是一样。

其中使用rand()是需先引用srand((unsigned int)time(NULL));    //随机产生一个数

5.判断输赢

双方都下过棋了,就需要判断谁赢谁输,还是平局。

可以采用函数的返回类型来进行判断,C——继续,Q——平局,*——玩家赢,#——电脑赢。

//判断输赢
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][1] != ' '){return board[i][0];}}//判断三列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[0][i];}}//判断正对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[0][0];}//判断副对角线if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[0][2];}//判断平局//以上4种情况都不满足时if (1 == board_full(board, row, col)){return 'Q';}//继续return 'C';
}

在判断出没有人赢时,在利用  board_full(board, row, col)  函数进行检测棋盘是否下满,下满则返回1,否之返回0;

//判断
int board_full(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++){if (board[i][j] == ' ')//判断游戏是否继续进行return 0;}}//棋盘以下满,返回1;return 1;
}

所以game.c里的函数体也就结束了,剩下的便是在test.c文件中来接受返回的字符。

		//判断if ('C' != is_win(board, ROW, COL)){if ('*' == is_win(board, ROW, COL)){printf("玩家赢\n");break;}if ('#' == is_win(board, ROW, COL)){printf("电脑赢\n");break;}if ('Q' == is_win(board, ROW, COL)){printf("平局\n");break;}}

记得在判断谁赢了后加上break;来终止循环。

在test.c文件中的game()函数中调用的函数有以下这些,这样写的好处是代码简单明了。方便检查错误。有很大的便利。

void game()
{//定义一个二维数组char board[ROW][COL] = { 0 };//初始化棋盘initialize_board(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);while (1){//玩家下棋play_game(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);//判断if ('C' != is_win(board, ROW, COL)){if ('*' == is_win(board, ROW, COL)){printf("玩家赢\n");break;}if ('#' == is_win(board, ROW, COL)){printf("电脑赢\n");break;}if ('Q' == is_win(board, ROW, COL)){printf("平局\n");break;}}//电脑下棋computer_game(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);//判断if ('C' != is_win(board, ROW, COL)){if ('*' != is_win(board, ROW, COL))printf("玩家赢\n");if ('#' != is_win(board, ROW, COL))printf("电脑赢\n");if ('Q' != is_win(board, ROW, COL))printf("平局\n");}}
}

至此,整个游戏也便可以运行了。

快去试试写出自己的三子棋游戏。

三、整个游戏代码

test.c

#include"game.h"void game()
{//定义一个二维数组char board[ROW][COL] = { 0 };//初始化棋盘initialize_board(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);while (1){//玩家下棋play_game(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);//判断if ('C' != is_win(board, ROW, COL)){if ('*' == is_win(board, ROW, COL)){printf("玩家赢\n");break;}if ('#' == is_win(board, ROW, COL)){printf("电脑赢\n");break;}if ('Q' == is_win(board, ROW, COL)){printf("平局\n");break;}}//电脑下棋computer_game(board, ROW, COL);//打印棋盘printf_board(board, ROW, COL);//判断if ('C' != is_win(board, ROW, COL)){if ('*' != is_win(board, ROW, COL))printf("玩家赢\n");if ('#' != is_win(board, ROW, COL))printf("电脑赢\n");if ('Q' != is_win(board, ROW, COL))printf("平局\n");}}
}
void meau()
{//打印菜单printf("************\n");printf("***1.开始***\n");printf("***0.退出***\n");printf("************\n");
}
void test()
{int input = 0;srand((unsigned int)time(NULL));//随机产生一个数do{meau();printf("请选择\n");//判断玩家的选择scanf("%d", &input);switch (input){//选择1则执行游戏程序case 1:game();break;//选择0退出游戏case 0:break;//输入其他的数default:printf("请重新选择\n");break;}} while (input);
}
int main()
{test();return 0;
}

 game.c

#include"game.h"//初始化棋盘
void initialize_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 printf_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++){printf(" %c ", board[i][j]);//打印出二维数组的内容if (j < col - 1)//限制打印 | 的次数printf("|");}printf("\n");//打印分割行if (i < row - 1)//这里来限制分割行的次数,只用打印2行---{for (j = 0; j < col; j++)//用来打印每列的---{printf("---");if (j < col - 1)//与上面一样,限制打印 | 的次数printf("|");}printf("\n");}}
}//玩家下棋
void play_game(char board[ROW][COL], int row, int col)
{//定义2个整型常量,来存放玩家输入的坐标位置int x = 0;int y = 0;printf("玩家下棋\n");printf("请输入坐标\n");while (1){scanf("%d %d", &x, &y);//判断玩家输入的坐标是否在范围内if (x > 0 && x <= row && y > 0 && y <= col){//判断坐标是否被占用if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("坐标已被占用,请重新输入坐标。\n");}}elseprintf("坐标非法\n");}
}//电脑下棋
void computer_game(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");int x = 0;int y = 0;while (1){x = rand() % row;//生成0~2的数字y = rand() % col;//生成0~2的数字if (board[x][y] == ' '){board[x][y] = '#';break;}}
}//判断
int board_full(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++){if (board[i][j] == ' ')//判断游戏是否继续进行return 0;}}//棋盘以下满,返回1;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][1] != ' '){return board[i][0];}}//判断三列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[0][i];}}//判断正对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[0][0];}//判断副对角线if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[0][2];}//判断平局//以上4种情况都不满足时if (1 == board_full(board, row, col)){return 'Q';}//继续return 'C';
}

 game.h

#include<stdio.h>
#include <time.h>
#include <stdlib.h>#define ROW 3     //行
#define COL 3     //列//初始化棋盘
void initialize_board(char board[ROW][COL], int row, int col);
//打印棋盘
void printf_board(char board[ROW][COL], int row, int col);
//玩家下棋
void play_game(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_game(char board[ROW][COL], int row, int col);
//判断
char is_win(char board[ROW][COL], int row, int col);


http://chatgpt.dhexx.cn/article/402YKfk1.shtml

相关文章

五子棋-单机游戏-微信小游戏项目开发入门

关于这个文章能看懂的条件&#xff0c;需要读者具备如下三个条件&#xff1a; 熟悉 HTML熟悉 HTML 中的 CanvasJavaScript基础 以及ES5以上 这是一个五子棋游戏的实现方案&#xff0c;在微信小程序上运行&#xff0c;如有需要可参考此学习&#xff0c;实现逻辑不是很复杂&…

C/C++:实现象棋游戏

大体思路 采用面相过程的设计方式实现&#xff0c;类似于我们平时做的课程设计&#xff0c;实现这样的小游戏无非就是多了图形处理库。这里使用的是acllib图形库。 设计这种小游戏&#xff0c;首先要从宏观上去认识&#xff1a;象棋&#xff0c;要有棋盘&#xff0c;要有棋子&a…

基于Android的五子棋游戏APP设计

目 录 第一章&#xff1a;绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简介 3 1.2.2 课题现状及应用前景 3 第二章&#xff1a;开发环境的搭建 5 2.1 系统开发环境 5 2.2 系统开发环境…

棋类游戏-五子棋小游戏

​ 活动地址&#xff1a;CSDN21天学习挑战赛 界面效果&#xff1a; 实现&#xff1a; 第一步&#xff1a;定义好设计该游戏要用到的组件以及相关数据&#xff1b; 第二步&#xff1a;组装组件&#xff0c;给组件设置相对应的功能&#xff1b; 第三步&#xff1a;调用init()方…

基于c语言的象棋游戏

一、主要目标&#xff1a; 1.1&#xff1a;鼠标控制。 1.2&#xff1a;各棋子按照象棋规则移动 1.3&#xff1a;判断双方胜负 注&#xff1a;本设计使用vs-2017运行。需要下载graphics.h库。 二、基本流程 2.1 棋牌展示 直接输出棋盘背景图片&#xff0c;包含方格线、“楚…

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

序言 “黄梅时节家家雨&#xff0c;青草池塘处处蛙。有约不来过夜半&#xff0c;闲敲棋子落灯花。” “象棋终日乐悠悠&#xff0c;苦被严亲一旦丢。兵卒坠河皆不救&#xff0c;将军溺水一齐休。马行千里随波去&#xff0c;象入三川逐浪游。炮响一声天地震&#xff0c;忽然惊…

简单的象棋开发

我们需要准备的知识是c语言基础和easyx图形: easyx官网&#xff1a; https://easyx.cn/ 首先头文件少不了: #include<stdio.h>(c语言的头文件) #include<graphics.h>&#xff08;easyx的&#xff09; #include<mmsystem.h>&#xff08;音乐播放的&#x…

Java游戏开发 —— 五子棋

引言&#xff1a; 五子棋的代码实现很简单&#xff0c;难的是计算机的AI算法&#xff0c;在网上找了很多资料&#xff0c;费了好半天劲才弄明白其实现的原理&#xff0c;真的挺开阔思路的&#xff0c;很有意思&#xff01; 思路&#xff1a; 1、创建主窗口&#xff0c;加载菜单…

编程小游戏之三子棋

三子棋是一个民间的益智小游戏&#xff0c;游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子连成一条线的一方则视为胜利者。下面将说明如何利用C语言在我们的计算机上简单的实现三子棋。 1.逻辑框架设计 在vs上创建两个.c文件test…

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

目 录 一、三子棋游戏介绍 二、游戏功能函数分析 1 菜单显示函数 2 菜单选择函数 3 选择确认函数 4 显示当前棋盘状态函数 5 棋盘初始化函数 6 玩家下棋函数 7 电脑下棋函数 8 棋局状态判断函数 三、游戏功能函数的整合 四、三子棋游戏的实现 五、游戏…

安卓做的棋类游戏

大方大斜 前言一、直接上图二、游戏主要代码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; 之后&#…