五子棋游戏程序创作过程(C语言)

news2024/12/23 1:48:37

五子棋游戏程序创作过程(C语言 )

我是编程爱好者,对游戏程序编制很感兴趣。学习VB6语言时就编制过一些游戏程序,如独立钻石棋、伤脑筋十二块、连连看、扑克牌游戏等,都是windows标准图形界面的。感到很好玩,很有成就感。后来玩了一些PC和手机版的五子棋游戏,就萌生了自己编一个的想法。今在此借助CSDN把这个过程和经验分享给大家,当然大咖和大佬是不要的,他们自己有。那就给初学者吧,我学习时也喜欢看看人家的思路。
创作过程不是很复杂,就是一个循序渐进的过程。我很享受这个过程。首先做游戏程序就要了解这个游戏,玩过了就知道游戏的基本规则。

88991ebb23624b1e8112e03ffc187374.png

 

程序编制的第一步:启动页面,绘制棋盘

设计和绘制游戏界面,绘制棋盘,如何下子,重绘棋盘。这些都仰仗编译器的图形图像功能,VB6,VC,java这方面都很好。这些做好了,游戏的雏形也就完成了。此中主要是设置全局变量。我的思路是变量要简单直接易理解。对于15*15的棋盘,用一维数组就行。
      设int pn [225] ,0表示无子,1表示黑子,2表示白子。
      这个设置在绘制下子时就很简单明了。对于225个棋盘点位:
       一个是i=0-225,另一个是行列row,col,     用于点位选择后绘制棋子,
      棋盘格设置40*40的方格,盘面长宽是600 。定位点距40*i  。

程序编制先定义全局变量:
Canvas cs;    //画布类,绘图时图形图像载体
                      //VC是 canvas , VB是 picture ,java 是 Frame , Graphics
 int px,py;        // piece X  Y  棋子坐标,float X Y 是屏幕坐标
 int dx,dy;        //draw X  Y  绘图坐标
 int i,j,kn;           // 用于循环  
int pn[300];     // pn数组  0=无子 ,1=黑子,2=白子
                         // 棋子225个编码号,防下标越界,容错下标加大
int n;               // 下子时获取 棋子编码号
int dn;             //下子计数
int isDo;          //游戏操作控制: 1=可下子,0=不可下
int B,W,k;       //判断胜负:B黑棋 , W白棋
string cordp;   //游戏记录字串
int mode;        //模式设定:0=双人,1=人机

坐标转换:px=(int)(x/40*40) ;  py=(int)(y/40*40)  ;   
                       坐标定位点距40
                       dx=px/40  ;   dy=py/40  ;   
                       n=(dy-1)*15+dx  ;   pn(n) 棋子编码
                       i=1--225  ;  

           n= i  ;  row=15-(n/15)  ;  col=(n-(n/15*15))  ;

有了转换算法,绘制棋盘棋子,这样就写了board( ) {  棋板函数,用于
起始界面画棋盘,游戏时画已下的黑白子,更新屏幕输出。
这是游戏程序的根基,游戏设计的雏形就成了。
board( )函数,加绘制桌面黑子白子下子按钮,设置按钮是为用户选择下子位后确认落子,避免误操作。比赛时落子计时。

 

接下来是第二步:双人模式,胜负判定

主要是下子操作,胜负判定。既然是博弈就要分胜负,所以胜负判定算法是游戏程序的关键。
下子操作:棋盘区域鼠标移动显示下子位选择标记,我设置在点位上加红色框线和红色标记点。友好界面设计,添加提示,黑棋选子还是白棋选子。同时显示用户选取棋子的序号。此序号就是记录的数据。至此游戏下子操作就成了。
能下子后就要由机器来自动判定胜负,于是就添加胜负判定函数detect( )。胜负判定要点是遍历棋盘点位,向右向下,右斜左斜,四个方向搜索,若有黑子白子就查看是否有五连子。
需要注意的是:向右搜索时col=1 to 11,大了就到下一行了,其他方向亦如此。
正确的遍历搜索是:
向右搜索:i = 1-15 行 ,  j = 1-11 列
向下搜索:i = 1- 11行 ,  j = 1-15列
向右斜搜索:i = 1-11行 ,  j = 1-11列
向斜左搜索:i = 1-11行 ,  j = 5-15列
这样的四个方向搜索下标就不会出界越界。
部分代码如下所示:
 for (i=1;i<=15;i++){     // B 黑子
       for (j=1;j<=11;j++){    
          k=(i-1)*15+j ;    //pn(B) number
       if (pn[k]==1){
      if ( pn[k+1]==1&&pn[k+2]==1&&pn[k+3]==1&&pn[k+4]==1){  goto showwin ;  }         
            }   }    }   //黑子向右搜索五连
双人模式的游戏程序就大功告成了。

b13ec477196f452d8349360817cf3fde.png

 

功能改进是第三步:盘面记录,复盘功能

作为一个能耐人寻味的游戏程序,就要再加些功能。有人要悔棋功能就加一个。其实悔棋功能是鸡肋。下棋是博弈,讲究落子无悔高棋品。
接下来是研究人机对战的电脑智能应子算法。我玩五子棋是低手,要了解博弈的算法很难。参阅了站内一些高手关于AI的智能算法,参阅很多五子棋书籍棋谱和五子棋竞赛的对抗棋谱。为了摆谱,就在此游戏程序上添加了复盘功能。程序没关闭就能复现出上一次的盘面。要复盘就要由有复盘的数据,此复盘数据也就是记录。据此就先加了记录功能。这个记录就是下子的序号。每盘棋都打印黑白双方下子的文本记录,界面上也显示记录。有一点就是程序关闭记录也就没了。解决的方法是把记录存为文本文件,需要时可作为复盘数据。有了记录数据也就完成了复盘功能的设置。
另一个改进:界面记录显示的是序数号,没能明了地表达棋子的点位。于是就需把序数转换成标准的棋盘点位标记。
    如pn(n)=113 --->H8
    n=fudat( i ) ;  复盘记录 ,走子记录
        row=15-(n/15) ;
        col=(n-(n/15*15)) ;
        if (col==0){ col=15 ;    row=row+1 ;   }
        swapabc () ;   //传入col ,输出字母A to O  ,return ss
        cordp=" B   "+intToString (n);    //走子记录,存盘数据 n = 1 to 225
        cordp1=" B  "+ss+intToString (row) ;    //pn(n)=113桌面显示 H8

    abc$="sABCDEFGHIJKLMNO" ;    col(8)="H"    ,  row=8
样例可参阅本站博文《五子棋游戏程序记录和复盘功能设置》,该文有游戏程序示例源码。

5bb6e9cc299241bebf6585392631c8ce.png

 
 游戏程序完善是第四步:AI智能游戏设置人机模式,禁手设置

编制五子棋游戏很有趣,尤其是AI智能算法很烧脑。网上介绍有什么贪心算法,剪枝算法,博弈树算法等等,不一而足。

对于人机对战的电脑智能应子算法,参阅很多五子棋书籍棋谱和五子棋竞赛的对抗棋谱。我感到白棋的后手防御算法很难取胜,棋界有黑棋高手先手必胜一说。算法么想了很多,既然是人工智能下棋就得按人的思路来算计。棋书阐述有许多思路和棋局解说。如活四冲四,嵌五,活三嵌四,活二嵌二。这些是高级棋手的总结。我就按此思路用加权计权方法来表现此类各种情况。

算法可参阅本站博文”五子棋游戏程序禁手设置算法”。此是五子棋游戏AI智能版的完整的设计源码。程序代码写出了基本算法。代码是function   testAIq ( )。

792d9cad03454e4d9d57000bf3e0b9d3.png
另外代码中有一算法测试的方法autotest( ) 可供参考。
此测试黑白双方用同一算法互斗难分胜负,这就像周伯通双手互搏,难分高下。想来要另写白棋防守算法,设置白棋VS黑棋才可看出哪个算法好。我的思路是博弈双方的白棋后手防守点也就是黑棋的加权高分点,白棋加权高分点就是进攻点。我就以计算的高分点为AI下子点。
本人五子棋是初识,水平不高,故写出的AI博弈算法也一般。也就是能人机对战而已。程序中界面显示有加权分,这是算法设计时查看和检测加权计分的情况,以此来修正和改进算法。

 

还有一种说法五子棋博弈要算杀,算杀就是计算必杀之局,如嵌四加活三,冲四加活三,嵌五加活三,嵌五加冲四,这些就是必杀局,就是必胜法宝。算杀的最高境界是做杀,预判算出必杀点提前几子做出必杀局。此谓奕道高手中的高手,乃高高手也。此种算法也就是编程界的高手,是谓大咖也。我望之有些高仰,自感境界还没到。锲而不舍,持之以恒,努力吧。

070f2a118c4a4a8bba150a6bb1f33110.png

 

为了使自己的程序高级一些就加了黑棋的禁手设置。
禁手设置算法:
禁手有三种,即三三禁手和四四禁手,以及长连禁手。
三三禁手形态:00 1  0100,  00 1  100,  0 1 0010 
四四禁手形态:00 1 1100 ,  00 1 1010,  0 1 0110
用遍历搜索算法按15 * 15 棋盘点位pn ( 1 -225 ),
分四个方向搜索,即左右,上下,右斜,斜左。遇黑子则计算加权分,赋100分值。此方法可减少计算量,无黑子位不计算。三三四四各形态同时搜索查验加权计算,一次遍历加权计分,最后查验加权分情况,超过100分的点位就是禁手点位。如有超过200分的情况就是有复合的三三四四禁手。
长连禁手设置:在判胜负函数detect()时黑棋超过五连即是长连禁手,判黑负,白棋胜。
有一些特殊的形态如扁担阵暂不设置。此程序是简版,完整版本要全面设置。
代码中有显示计算的分值点标记,黄色是100分的点位,紫色是超过100分的点位,即禁手点位。这是测试算法时用来查看的,应用时可注释掉。
此算法是基本的算法,优点是简单和易于理解。

下面是禁手设置变量:
int js[255];         //禁手设置,遍历搜索225个点位
int jsset ;            //有无禁手标志

white_do (){    //白棋下子时设置,检测禁手点位
  <  ............>
      if (jsset==1)  restrict_move () ;   // 菜单选择有无禁手,有禁手就执行此函数
      //***  scan restricted move and draw mark
 }//white_do ()
禁手设置restrict_move( ) 
完整的源码可参阅我在本站的博文《五子棋游戏程序禁手设置算法》。
该博文是有禁手设置算法的完整的游戏程序源码。

48320f2cc500466097ef85b6abbecb97.png

 

游戏程序设计的前瞻
以上几个步骤是五子棋游戏程序设计从想做一个五子棋程序到设计完成整个游戏程序设计制作的概要。介绍的是设计者的思路和一些关键的算法。
对于五子棋游戏程序设计的扩展有些想法,试做娱乐版的手机程序,供初学者练手用。做windows版的标准的可供比赛用的专业版五子棋游戏程序。也可做网络版的手机对战游戏程序。程序要有计时功能,完整的记录功能,比赛记录或棋谱的文本数据输入可复盘的功能。
当然如你有超高的手段,就研究现在时兴的AI智能算法,做一个黑先手必胜,白后手不败的独孤不败的五子棋程序。哈哈,我功力不够,开玩笑了。
新生代的学子们,你们年轻,你们有希望登上顶峰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3+ts+vite自适应项目——路由、layout布局

系列文章目录 第一章&#xff1a;搭建项目 目录 系列文章目录 前言 一、vue-router 1.安装vue-router 2.引入 2.1 新建页面 2.2 公共样式引入 2.3 layout 布局 2.4路由配置 总结 前言 上一章我们搭建了项目&#xff0c;这一张主要讲路由和layout布局&#xff0c;和…

go环境安装

Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发&#xff0c;后来还加入了Ian Lance Taylor, Russ Cox等人&#xff0c;并最终于2009年11月开源&#xff0c;在2012年早些时…

ArduPilot之GPS Glitch问题M8N模块配置

ArduPilot之GPS Glitch问题&M8N模块配置 1. 源由2. 现象3. 视频分析3.1 配置&#xff08;不理想&#xff09;3.2 配置优化3.3 优化配置短时间3D LockGlitch3.4 优化配置长时间3D DGPS Lock3.5 使用尽量多的卫星系统3.5.1 配置一3.5.2 配置二 4. 总结4.1 解锁卫星数4.2 自动…

项目风险管理

风险的分类(按照性质划分) 纯粹风险:只有损失可能性而无获利可能性的风险。投机风险:相对于纯粹风险而言,指既有损失的可能又有获利机会的风险。风险既是一个危险也是一个机会 一、规划风险管理 决定如何进行规划和实施项目风险管理活动 二、风险识别 判断哪些风险会…

单列文本数据快速导入表格

文本数据导入Excel似乎是个老生常谈&#xff0c;方法也有很多&#xff0c;例如 使用文本编辑器打开文本文件&#xff0c;拷贝粘贴到Excel然后分类Power Query中的【从文本/CSV】如下图所示。 但是这个需求略有不同&#xff0c;文本数据为单列&#xff0c;每7行数据为一组&am…

2023年华东杯数学建模B 题 期货价格相关性问题-思路解析

题目背景&#xff1a; 许多金融标的都有其内在的关联&#xff0c;如何从量价数据找到这种关联是一个有趣的 问题。例如在万得的“煤焦钢矿”板块中&#xff0c;有螺纹钢、铁矿石、不锈钢、热轧卷板、 硅铁、焦煤、焦炭、锰硅、线材 9 个品种。这些品种有些是上下游关系&…

【高频电子线路】——高频小信号放大器学习笔记总结

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 学习之路&#xff0c;长路漫漫&#xff0c;写学习笔记的过程就是把知识讲给自己听的过程。这个过程中&#xff0c;我们去记录思考的过程&#xff0c;便于日后复习&#xff0c;梳理自己的思路。学习之乐&#xff0c;独乐乐&a…

SmartEngine流程引擎之Custom模式

目录 一、为什么选用SmartEngine 二、各类流程引擎框架简单对比 1、流程设计器推荐 2、什么是BPMN 流程定义解释说明 三、SmartEngine之Custom实操 1、引入依赖 2、典型的初始化代码如下 3、节点如何流转以及流程实例存储问题 4、定义Delegation 关键类 一、为什么选用…

RebbitMQ Windows安装

RabbitMQ是由Erlang语言写的,因此安装前要先安装Erlang Erlang及RabbitMQ安装版本的选择 下载时一定要注意版本兼容性 版本兼容说明地址&#xff1a;RabbitMQ Erlang Version Requirements — RabbitMQ 我们选择的版本 Erlang官网下载:https://www.erlang.org/downloads Ra…

[大家的项目] 获取主机IP地址

get-host-ip https://github.com/stuartZhang/get-host-ip/tree/main 这是一款用rust制作的命令行工具。其被设计用来从C:\Windows\System32\ipconfig.exe的执行结果内提取出指定【网卡】的属性值。比如&#xff0c;从电脑本的【无线局域网适配器WLAN】中提取出【IPv4地址】字符…

写给开发同学的 AI 强化学习入门指南

该篇文章是我学习过程的一些归纳总结&#xff0c;希望对大家有所帮助。 最近因为 AI 大火&#xff0c;搞的我也对 AI 突然也很感兴趣&#xff0c;于是开启了 AI 的学习之旅。其实我也没学过机器学习&#xff0c;对 AI 基本上一窍不通&#xff0c;但是好在身处在这个信息爆炸的…

数据结构---栈的实现

文章目录 前言一、什么是栈&#xff1f;二、栈的实现 1.栈的结构2.栈的接口实现过程总结 前言 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶&#xff0c;相对地&#xff0c;把另一…

用ChatGPT通过WebSocket开发一个交互性的五子棋微信小程序(二)

文章目录 1 前言1.1 实现的原理1.2 如何与微信小程序联系 2 五子棋项目2.1 申请OpenAI的API2.2 调用API代码2.3 界面代码 3 同步五子棋到前端小程序3.1 WebSocket长连接3.2 获取实时下棋 4 讨论 1 前言 1.1 实现的原理 大体方向是将ChatGPT作为后端语言模型&#xff0c;然后将…

AD19 基础应用技巧(差分线的添加走线与蛇形等长)

《差分线的添加走线与蛇形等长》 问:何为差分信号? 答:通俗地说&#xff0c;就是驱动端发送两个等值、反相的信号&#xff0c;接收端通过比较这两个电压的差值来判断逻辑状态“0”还是“1”。 问:差分线的优势在哪? 答:差分信号和普通的单端信号走线相比&#xff0c;最明量…

【SpringBoot2】三:基础入门---自动配置原理(自动配置原理入门+开发技巧)

文章目录 1.自动配置原理入门1.1 引导加载自动配置类1.2 按需开启自动配置项1.3 修改默认配置1.4 最佳实践 2.开发小技巧2.1 Lombok2.1.1 简化Bean开发2.1.2 简化日志开发 2.2 dev-tools2.3 Spring Initailizr&#xff08;项目初始化向导&#xff09; 1.自动配置原理入门 1.1 …

【数据库】Java的JDBC编程(idea链接数据库)

目录 前言 1、Java的数据库编程&#xff1a;JDBC 2、使用JDBC&#xff08;项目中导入数据库驱动包&#xff09; 2.1、获取驱动包 2.2、将数据库驱动包导入Java项目中 2.3、使用JDBC编写代码 2.3.1、创建并初始化一个数据源 2.3.2、 和数据库服务器建立链接 2.3.3、构…

C++(多态上)

目录: 1.多态的概念 2.多态的定义和实现 3.虚函数构成重写的特例 4.剖析一道非常经典的题 5.剖析多态的原理 ------------------------------------------------------------------------------------------------------------------------- 1.多态的概念 概念:通俗来说&#…

嵌入式开发--无刷电机学习2--克拉克变换

克拉克变换 首先说明&#xff0c;有很多方法&#xff0c;在数学上是等价的&#xff0c;比如33333*412。下面说的事情也是。 为了更简明的控制&#xff0c;克拉克女士提出电机控制简化的方法&#xff0c;即建立一个坐标系&#xff0c;横轴是α 纵轴是β&#xff0c;并将三相电…

RabbitMQ入门Demo 简单模式

出现的问题,原本4个操作,要么全部执行,要么全部不执行------->强一致性 但是现在分开了-----------最终一致性 强一致性&#xff1a;指在消息传递的过程中&#xff0c;系统会确保每个消息被精确地按照发送的顺序被传递&#xff0c;并且每个消息都会被正确地处理。强一致性…

重大问题,Windows11出现重大BUG

重大问题&#xff0c;Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的&#xff0c;但是&#xff0c;今天我将代表所有微软用户&#xff0c;解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…