基于QT实现的联网国际跳棋游戏

Firstsnow

发布日期: 2018-11-06 12:41:10 浏览量: 706
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1 简介

Draughts 是一款利用 Qt 实现的国际跳棋游戏,支持双人在线对战。国际跳棋是十分古 老的智力游戏之一,其规则是在 10×10 的棋盘内,黑白双方各执 20 子,通过斜向移动、跳吃等手段吃掉对方更多的棋子。最终吃掉对方所有棋子或者使对方无法移动的一方获得胜利。

a b
c d
  • 图 (a):游戏开始时,黑方先手,可以移动的棋子以绿色标出

  • 图 (b):选中 某个棋子后,可以移动到的空位以及当前棋子以黄色标出

  • 图 (c):移动后,移动的轨迹 以黑色标出

  • 图 (d):黑方移动后,白方视角所见

国际跳棋的基本规则是,黑方先行,并且所有棋子均只能斜向移动,因此整个棋盘只有深色位置可以有棋子。它有几条基本的吃子以及前进规则:

  • 能吃子就必须吃:如果有多个棋子以及多条路径都可以吃子,那么必须吃最多的棋子。如果多有条路径可以吃到相同个数的棋子,那么可以任意选择一条

  • 土耳其打击:如果吃多子,那么被吃棋子在整个吃子过程结束后才被撤出棋盘

  • 普通棋子前进:对于普通棋子,只能向前方对角线方向前进一格

  • 普通棋子跳吃:对于普通棋子,只要对角线方向最近的黑格有敌方棋子,并且该棋子后最近的一格有空位,那么就可以跳到后方空位并且吃掉对应敌方棋子

  • 升王:任何棋子在最后一步停在对方底线则称为王棋

  • 王棋前进:对于王棋,只要对应方向有空位,可以向任意对角线方向前进后退任意步数

  • 王棋跳吃:对于王棋,在跳吃的时候可以无时距离,并且停在被吃棋子后任意空格处

我们的游戏实现在当前是自己的回合时,所有可以移动的棋子会被以绿色标出。当选中某个可移动棋子时,其本身以及下一步能够移动到的位置会被以黄色标出。见图 (1)。

由于有连跳以及能吃子就多吃的规则,在存在多条可选路径时,如果只标明最终可达位置,可能会造成困惑以及存在无法选择相同可达位置但不同走棋路线的困难。因此, 我们允许玩家一步一步进行走棋,以便选择路径,详见图 (2)。

a b
c d
  • 图 (a):当前最多可以吃两个棋子,仅有一个棋子可选

  • 图 (b):选中后,在 吃子路径的下一步被标出(如果有多条路径,全都会被黄色标出)

  • 图 (c):选择相应路 径的第一步后,随即标出继续可行路径

  • 图 (d):完成一步

a b

此外,在进行棋子移动时,我们提供动画效果以增加观赏性。以及增加了认输的功能 (位于菜单)。

我们还支持在开局时自行定义开始局面以及先手,局面以 100 个字符的形式输入, 以 0 表示空位,w 和 W 分别表示白色棋子和白色王棋,b 和 B 分别表示黑色棋子和黑 色王棋。

2 部分实现节

关于动画效果,可以利用 QPropertyAnimation 来实现。对于被吃棋子的消失效果,可以利用 QGraphicsOpacityEffect 来调节透明度。

对于棋盘的内部黑色发光效果,可以针对矩形的四条边向内进行线性渐变的填充。

对于网络的协议,我们简单用可见字符来传输数据,以操作名 + 参数的格式进行通信。各个操作的传输协议分别是:

  • 开局:START

  • 放弃:GIVEUP

  • 设置开始局面:SETGAME <first player [B|W]> <game status>

  • 移动:MOVE <length of moving trace> <pairs of (x, y)>

  • 求和:MAKEPEACE

  • 同意求和:CONFIRM_PEACE

  • 否决求和:DENIED_PEACE

上传的附件 cloud_download 基于QT实现的联网国际跳棋游戏.7z ( 1.12mb, 33次下载 )
error_outline 下载需要5点积分

发送私信

背负的太多,没等到击垮敌人,就先累死了自己

9
文章数
8
评论数
最近文章
eject