JAVA课程设计——华容道小游戏

华容道游戏简介:

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

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

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

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

      1、框架类构造游戏主窗口,游戏页面七大操作按钮和十个游戏角色的创建和初始化,以及地图的构建。

      2、功能类包括鼠标操作方法和键盘操作方法的添加,以及人物角色移动方法的具体实现。

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

1)、角色移动算法分析:

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

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

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

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

goc方法为boolen类型方法

Return True or False ,表示当前角色是否可进行移动

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

3)、鼠标操作:玩家需注意点击当前角色人物的位置。

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

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

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

If(y>h/2&&x>w/3&&x<(w*2)/3)

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

开始界面:

JAVA课程设计——华容道小游戏_第1张图片

游戏背景界面:

JAVA课程设计——华容道小游戏_第2张图片

游戏帮助界面

JAVA课程设计——华容道小游戏_第3张图片

键盘操作界面:

JAVA课程设计——华容道小游戏_第4张图片

鼠标操作界面:

JAVA课程设计——华容道小游戏_第5张图片

游戏胜利界面:

JAVA课程设计——华容道小游戏_第6张图片

注:以上素材gif图片均来自网络,感谢原作者,这里仅供娱乐。

JAVA课程设计——华容道小游戏_第7张图片

贴下两个类的代码:(还没有进行良好的封装)

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Hua_Rong_Road extends JFrame implements MouseListener,KeyListener,ActionListener {
private static final int ERROR_MESSAGE = 0;
private static final int WARNING_MESSAGE = 0;
int cnt=0;
Person person[]=new Person[10];
JButton left,right,above,below;
JButton restart=new JButton("重新开始");
JButton about=new JButton("游戏背景");
JButton help=new JButton("游戏帮助");
JButton mouse=new JButton("鼠标操作");
JButton key=new JButton("键盘操作");
JButton message=new JButton("当前步数:"+cnt);
JButton begin=new JButton("开始游戏");
JButton star=new JButton();
String name[]={"曹操","关羽","张飞","黄忠","马超","赵云","兵","兵","兵","兵"};
public Hua_Rong_Road(){
	JOptionPane.showMessageDialog(this, "开始游戏前,请先阅读下方的游戏帮助,游戏背景可自行了解.");
	init();
	//setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	setBounds(200,200,640,800);//设置窗体初始位置以及大小的一个函数
	setVisible(true);//窗口可见
	//person[9].requestFocus();//获取焦点需要卸载setVisible后面才行
	validate();//使用validate方法是容器再次布置其组件,确保布局有效
}
public void init(){
	setLayout(null);
	message.setBackground(Color.ORANGE);
	add(restart);
	restart.setBounds(120, 640, 100, 50);
	//restart.setBackground(Color.RED);
	restart.addActionListener(this);
	add(about);
	about.addActionListener(this);
	about.setBounds(250,640,100,50);
	add(mouse);
	mouse.setBounds(280,40,100,50);
	mouse.addActionListener(this);
	add(key);
	key.setBounds(400, 40, 100, 50);
	key.addActionListener(this);
	add(help);
	help.setBounds(380, 640, 100, 50);
	help.addActionListener(this);
	add(message);
	message.setBounds(110,40,160,50);
	ImageIcon starr=new ImageIcon("timg (5).gif");
	star.setIcon(starr);
	star.setBounds(108,208,400,400);
	add(star);
	add(begin);
	begin.addActionListener(this);
	begin.setBounds(250,140,100,50);
	setVisible(true);
	left=new JButton();
	right=new JButton();
	above=new JButton();
	below=new JButton();
	add(left);
	add(right);
	add(above);
	add(below);
	//边界类
	left.setBounds(98, 98, 10, 520);
	right.setBounds(508,98,10,520);
	above.setBounds(98, 98, 420, 10);
	below.setBounds(98, 608, 420, 10);
	validate();
}
//游戏布局
public	void map1()
{
for(int k=0;kh/2&&x>w/3&&x<(w*2)/3)
	{
	gom(man,below);//下面
	}
if(yw/3&&x<(w*2)/3)
{
	gom(man,above);//上面
}
 if(xh/3&&y<(h*2)/3)
	{
	gom(man,left);//左
	}
 if(x>w/2&&y>h/3&&y<(h*2)/3)
{
	gom(man,right);//右
}
}
@Override
public void mouseReleased(MouseEvent e) {
	// TODO Auto-generated method stub
	
}
@Override
public void mouseEntered(MouseEvent e) {
	// TODO Auto-generated method stub
	
}
@Override
public void mouseExited(MouseEvent e) {
	// TODO Auto-generated method stub
	
}
}

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Person extends JButton implements FocusListener{
	int number;
	Person(int number,String s){
		this.number=number;
		addFocusListener(this);
	}
	public void focusGained(FocusEvent e){
		//setBackground(Color.GREEN);
	}
	public void focusLost(FocusEvent e){
		//setBackground(Color.RED);
	}

}


若需要运行,只需要new一个Hua_Rong_Road()即可。


参考文献:

Java程序设计实用教程(第二版)》——耿祥义 张跃平编著。


你可能感兴趣的:(JAVA课程设计——华容道小游戏)