基于Java实现的(GUI)华容道小游戏

基于java的华容道小游戏

一、华容道游戏简介

华容道,古老的中国游戏,以其变化多端、百玩不厌的特点与魔方、独立钻石棋一起被国外智力专家并称为"智力游戏界的三个不可思议"。它与七巧板、九连环等中国传统益智玩具还有个代名词叫作"中国的难题"。华容道游戏取自著名的三国故事,曹操在赤壁大战中被刘备和孙权的"苦肉计"、"火烧连营"打败,被迫退逃到华容道,又遇上诸葛亮的伏兵,关羽为了报答曹操对他的恩情,明逼实让,终于帮助曹操逃出了华容道。游戏就是依照"曹瞒兵败走华容,正与关公狭路逢。只为当初恩义重,放开金锁走蛟龙"这一故事情节,通过移动各个棋子,帮助曹操从初始位置移到棋盘最下方中部,从出口逃走。不允许跨越棋子,还要设法用最少的步数把曹操移到出口。曹操逃出华容道的最大障碍是关羽,关羽立马华容道,一夫当关,万夫莫开。关羽与曹操当然是解开这一游戏的关键。四个刘备军兵是最灵活的,也最容易对付,如何发挥他们的作用也要充分考虑周全。"华容道"有一个带二十个小方格的棋盘,代表华容道。棋盘下方有一个两方格边长的出口,是供曹操逃走的。棋盘上共摆有十个大小不一样的棋子,它们分别代表曹操、张飞、赵云、马超、黄忠和关羽,还有四个卒。"华容道"有几十种布阵方法,如"横刀立马"、"近在咫尺"、"过五关"、"水泄不通"、"小燕出巢"等等玩法。棋盘上仅有两个小方格空着,玩法就是通过这两个空格移动棋子,用最少的步数把曹操移出华容道。

很小的时候就用父亲的手机玩过这个游戏,记得当时用了好久才过得去一关,现在同样觉得真的挺难的一个游戏。

但当时却玩的不亦乐乎,因为并没有别的游戏可以选择,记得当时就觉得这个游戏的人物角色太丑了,让我这个三国迷无法忍受。没想到好多年后的今年终于可以自己做出这个简单的小游戏,把每个角色定义成自己喜欢的样子,也算是圆了小时候的一个梦想。

二、游戏实现方法

程序主要由一个框架类和功能类构成。

  • 框架类构造游戏主窗口,游戏页面七大操作按钮和十个游戏角色的创建和初始化,以及地图的构建
  • 功能类包括鼠标操作方法和键盘操作方法的添加,以及人物角色移动方法的具体实现

算法主要体现在人物的移动上。主要是操作方式,鼠标和键盘都可进行操作,由用户进行选择使用哪种方式来进行游戏。

2.1 角色移动算法分析

组件调用getBounds()方法可以返回一个和自己大小相等,位置相同的Rectangle对象,但Rectangle没有可视的外观,仅封装组件的位置和大小,因此可以用组件返回的Rectangle对象判断位置和大小信息,检查移动后的Rectangle对象和其他组件的是否相交即可。

若选择键盘,初始给特定一个小兵一个焦点,即从它开始进行移动,若玩家按下某方向键,当前小兵需要往某方向移动但是它不能往某方向移动(在边界处或者被其他人物阻挡),则选择当前可以往该方向移动的角色进行移动。

算法具体实现:遍历每一个角色,若当前角色可以执行该操作,用当前角色进行该操作。

用事先写好的goc方法判断其是否可以移动。

goc方法为boolen类型方法,Return True or False,表示当前角色是否可进行移动。

精确操作:键盘操作模式下,先用鼠标点击某个角色(鼠标点击即可给当前用户得到焦点),然后使用方向键进行移动。

2.2 鼠标操作

玩家需注意点击当前角色人物的位置。

鼠标操作下的移动与键盘略有不同,不存在需要自动获取焦点的问题,但需要注意的是当同时点击一个角色的下半部分和右半部分时,也就是说当前的操作同时触发两个鼠标事件,那么它就会直接向右下方进行移动,但游戏的规则中其实是不允许这样进行移动的。

这里通过把一个角色抽象为一个矩阵,然后模拟出它的长和宽,对点击的位置进行一定的数学限制即可实现。

比如向下可以以这样的条件进行限制

java 复制代码
if(y>h/2&&x>w/3&&x<(w*2)/3)

其他位置如法炮制,就可以完美的解决这个细节上的问题。

三、游戏运行

开始界面

游戏帮助界面

键盘操作界面

鼠标操作界面

游戏胜利界面

相关推荐
考虑考虑1 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261352 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊3 小时前
Java学习第22天 - 云原生与容器化
java
渣哥4 小时前
原来 Java 里线程安全集合有这么多种
java
间彧4 小时前
Spring Boot集成Spring Security完整指南
java
间彧5 小时前
Spring Secutiy基本原理及工作流程
java
Java水解6 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆8 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学8 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole8 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端