摘要:介绍了跳棋游戏的游戏功能及程序总体逻辑,在此基础上深入探讨了跳棋游戏中的查询棋子可跳动位置、最佳路径提示、电脑落子和玩家落子的算法,通过这些算法实现游戏按规则有序的进行。
中国论文网 http://www.xzbu.com/8/view-3599881.htm
关键词:游戏设计;跳棋游戏
中图分类号:TP311 文献标识码:A 文章编号:1007-9599 (2012) 13-0000-02
一、引言
电脑游戏软件的产生,使得计算机的娱乐功能产生了质的提升,进一步加快了计算机的普及。当代快节奏的生活方式,加深了人们对计算机游戏软件的需求。计算机游戏软件应用而生。随着计算机技术的发展,游戏软件给用户带来了全方位的感官体验,各种游戏引擎的引入,使得计算机游戏软件的用户体验越来越逼真、形象。于此同时,各种简单的休闲游戏也呈现出异军突起的阵势。各类休闲小游戏引起本身的易移植性,也为众多游戏开发者所宠爱。同时,由于各种办公室累工作者闲暇时间,以及工作压力较大的工作人员在下班时间往往选择比较简单易懂,而富有趣味性的计算机游戏来进行放松。因此,简单小游戏的开发前景也为作者所看好。本文基于以上各种考虑,通过C#语言开发了一款简单的跳棋游戏软件。
二、功能描述及游戏总体逻辑
在跳棋游戏中,玩家数为偶数,且必须大于等于2小于等于6,游戏可以是人与人参与,也可以是人与电脑。在游戏初始化完成后,所有玩家的10颗棋子都位于自己所在方棋盘上倒立的正三角形上,玩家在游戏过程中的目标是,在游戏规则允许的情况下,将自己的棋子移向并完全占领对面玩家棋子在棋盘上的初始位置。游戏规则为:参与游戏者轮流出棋跳子,棋子每次可以移动到本棋子相邻位置的任意一个空位置,也可以像跷跷板一样,隔着旁边的一颗棋子直接跳到对称位置上,并且隔子跳动的方式可以实现连续跳动(若后方还有可以隔子跳动的位置)。跳棋各方的目的都是将自己的棋子全部移动到对方玩家棋子的初始位置,先完成将自己的棋子全部移动到对方棋子初始位置的一方为胜利[1]。
三、跳棋游戏设计的关键算法
(一)查询棋子可跳动位置
棋子可跳动位置是用数组来存储的,在开始游戏前,棋子初始化的过程就是将所有棋子的可跳动位置数组重置更新,棋子可跳动位置的数组在初始化后不能为空,否则游戏将无法开始;在玩家玩游戏的过程中,玩家的每次执棋跳动都会对其他棋子的可以跳动的位置产生很大的影响,所以在实现跳棋游戏很重要的一点就是实现查询棋子的可跳动位置。在本设计的查询棋子可跳动位置的实现中,用到的函数为:SetAllowPlace函数负责修改棋盘中所有棋子的可跳动位置数组;SetSide函数用来添加棋子邻近的可跳动位置;Chess为递归函数,用来计算当前棋子的6个方向的可跳动位置数组;AddPlace函数将当前位置保存到当前棋子的可跳动位置数组中,并且函数AddPlace也可继续嵌套调用函数Chess。SetAllowPlace函数为本游戏的核心函数,它负责每次跳动结束后所有棋子的可跳动位置数组的更新,这样当玩家为电脑时电脑落子函数会根据自己10颗棋子的可跳动位置数组,来选择一颗能尽可能跳得远的棋子来跳动。而当玩家为人时,虽然人只是根据自己的主观判断来选择位置跳动,但人必须按游戏规则选择存在于自己10颗棋子的可跳动位置数组中的位置跳动,保证玩家对游戏规则的遵守,否则程序是不予响应棋子上的鼠标点击事件。
SetAllowPlace函数算法思想:由于考虑到游戏过程中棋子可以连续跳动和跳向相邻的空位置两种情况,所以在更新棋子可跳动位置数组的时候,函数分为两种情况讨论:一、实现棋子的连续跳动;二、棋子向相邻的位置跳动。只所以把棋子的跳动分为两个函数来写,是因为棋子跳动相邻位置时不可再继续往下走,而棋子隔子跳动时可接着再隔子跳动,但隔子跳动一步后不可再跳向相邻的可跳动位置。
Chess和ChessOdd函数算法思想:要寻找棋子的可连续跳动的位置,就要向着棋子的6个方向来寻找,逐方向寻找可跳动位置。而在寻找每个方向的跳动位置时,要实现棋子的隔子跳动,也就意味着要找到一个棋子,并且以这个棋子做跳板,跳到同方向对称的位置上。因此在寻找j方向是否有可跳动位置时分两步判断,第一步判断j方向是否有棋子,如果有棋子则该棋子就是跳板;第二步判断当前棋子j方向上的棋子的j方向是否有棋子,如果有棋子则退出(说明位置被占住,当前棋子不能跳到此位置),如果没有棋子则该位置可跳动,所以将该位置加入当前棋子的可跳动位置数组中,并将i更新为该位置的编号,调用Chess继续往后寻找可跳动的位置,即从寻找到的可跳动位置继续寻找下一个可跳动的位置,从而实现棋子的连续跳动。这是跳棋在更新位置数组时所使用的搜索算法的基本思想,也是本程序的关键。
AddPlace函数算法思想:加可跳动位置bh到当前棋子的可跳动位置数组时,首先我们要判断该位置是否已经存在于当前棋子的可跳动位置数组中,若存在则不需添加,若不存在则将该位置编号添加到当前棋子chess的可跳动位置数组中,到这里仅实现了棋子的一步隔子跳动,并没有实现棋子的连续跳动,为了实现棋子的连续跳动我们自然会想到函数的嵌套调用,这时我们就以该可跳动位置为起点,继续调用Chess函数(只是这时的i是之前添加的可跳动位置的编号bh,即i=bh),从该可跳动位置开始继续向前寻找可跳动的位置,当当前棋子的6个方向均遍历结束后即跳出此次循环。
SetSide函数算法思想:添加相邻可跳动位置到当前棋子的可跳动位置数组时,从当前棋子的6个方向逐方向判断,若当前方向棋孔上没有棋子则将当前方向棋孔的编号加入到当前棋子的可跳动位置数组中,若当前方向有棋子或不存在,则继续向下个方向寻找。
(二)最佳路径提示算法
根据游戏规则,棋子只能有两种跳法:
1.跳向相邻位置,且相邻位置上没有棋子;
2.每步隔相邻一颗棋子跳动,实现连续跳动。
首先这个算法采用递归的思想,从最开始的位置,逐步向周围寻找,如果存在则加入最佳位置数组,并且修改当前起始位置,再次递归调用该算法,继续往后寻找;如果不存在则删除起点位置,从下一个方向的棋子再次搜寻。其中跳法1中若找到相邻位置则代表程序结束,跳法2中若找到结束位置则代表程序结束
跳棋算法
时间: 2024-12-27 17:52:16
跳棋算法的相关文章
跳棋算法策略
棋子跳动算法该算法在ChessBoard.CanJumpTo函数中实现 ? 找出一个棋子所有可走位置,并建成数据结构"图"的形式这个算法有点象图的广度优先遍历算法.文字说明如下:1.把当前棋子坐标加入"图"中.2.从当前棋子位置出发,从六个方向查找棋子可跳的位置,3.如果第2步找到坐标没有加入"图"中,就把这些坐标加入"图"中去.4.从第3步刚加入"图"中的坐标出发,继续执行第2步.一直到没有坐标加入&qu
常见算法和例题
第3章 算法与程序设计模块 3.1 算 法 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作. 常用的算法:列举了穷举搜索.递归.回溯.递推.模拟.分治.贪心.深度优先搜索.广度优先搜索等几种较为常用的算法,没有做过多的描述,一旦给出具体描述,容易使内容加深,产生严重学科取向的引导,符合教育部普通高中课程方案的特点,对于这些必需的方法和思想,关键不在于学生能不能,而在于教师是否想到,是否有过关注,引发学生对系统方法和思想的思考,重视建立编程思想,
人机博弈-吃跳棋游戏(三)代移动
我们能够根据国际象棋的规则吃,创建移动生成器.基本逻辑是,假定一个拉伸己方蠕虫的存在,这是可能没有其他的致密气.这是不是对其他部分可以落子.在其他情况下.必须坚持 另一片落子,考虑到特殊情况,当自己可以提其他片,自己可以下到那里没有气.和一般吃跳棋.胜,无法形成劫争.所以走法生成器就相对非 常简单. 对于怎样确定己方是不是存在一气的棋串,能够利用上一节介绍的算气算法. int CMoveGenerator::CreatePossibleMove(BYTE position[GRID_NUM][G
算法图解之广度优先算法
一.用途 广度优先算法是为了解决两样东西之间的最短距离,其中最短距离的含义很多,如: 编写国际跳棋AI,计算最少走多少步就可获胜 编写拼写检查器, 计算最少编辑多少个地方就可将错拼的单词改成正确的单词 根据你的人际关系网络找到关系最近的医生 二.图 图由节点和边组成,模拟一组链接. 三.广度优先搜索 应用场景 从节点A出发,有前往节点B的路径吗? 从节点A出发,前往节点B的哪条路径最短? 问题:你经营着一个芒果农场,你要找一个芒果销售商并把芒果卖给他. 解决思路:你需要优先从你的朋友中开始找,朋
算法图解之广度优先搜索
广度优先搜索的应用场景,如下:(1)编写国际跳棋AI,计算最少走多少步就可获胜;(2)编写拼写检查器,计算最少编辑多个地方就可将错拼的单词改为正确的单词,如将READED改为READER需要编辑一个地方;(3)根据你的人际关系网络找到关系最近的医生; 图简介 假设你居住在旧金山,要从双子峰前往金门大桥.你想乘公交车前往,并希望换乘最少.可乘坐的公交车如下: 由图可知,换乘最少的路线是:步行->44路公交车->28路公交车(一共三步,这种问题也被称作为最短路径问题,解决最短路径问题的算法,又称广
经典排序算法 - 冒泡排序Bubble sort
原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第
转载:DenseNet算法详解
原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h
基于位置信息的聚类算法介绍及模型选择
百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的
密码算法详解——AES
0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128.AES-192和AES-256.本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加. 1 算法流程 AES加解密的流程图如下: AES加密过程涉及到4种操作:字节替代(SubBytes).行移位(ShiftRows).列混淆(MixCo