摘要:介绍了跳棋游戏的游戏功能及程序总体逻辑,在此基础上深入探讨了跳棋游戏中的查询棋子可跳动位置、最佳路径提示、电脑落子和玩家落子的算法,通过这些算法实现游戏按规则有序的进行。
中国论文网 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中若找到结束位置则代表程序结束