java课设华容道小游戏完整

标题针对以上要求,开发一个小型的华容道小游戏,满足如下功能要求:1、设计一个华容道游戏界面;2、创建对象,代表华容道中的人物;3、通过鼠标来控制人物的移动;4、增加多个游戏难度。用户可以通过鼠标来控制人物的移动,并可以选择不同的难度级别来增加游戏挑战。要确保游戏在低配置系统上运行流畅,提高游戏的响应速度。要求界面简洁美观,布局合理,操作简便,简单易用,任何人可轻松操作。 (含源代码和报告)

标题功能需求分析

玩家可以在游戏界面上进行华容道游戏的操作包括通过鼠标来控制人物的移动,解决关卡等,并在不同的难度级别下享受游戏的挑战。游戏界面简洁美观,操作简便,具有良好的响应速度游戏、良好的逻辑和可玩性,以提供愉快的游戏体验,同时适应低配置系统的要求。功能如下:
(1)密码、账号验证登陆游戏,提供游戏背景,和在命令行显示欢迎语句和游戏规则。
(2)游戏界面:创建一个简洁美观的华容道游戏界面,包括游戏板和操作按钮等元素。游戏板应该显示当前的关卡布局和人物位置,并提供足够的空间用于移动人物,以及显示当前关卡信息的文本区域。
(3)关卡设置:创建多个难度级别的关卡供玩家选择。每个关卡应具有不同的布局和人物初始位置。关卡的数据可以通过数组等方式存储功能。
(4)人物移动:使用鼠标点击或键盘操作来实现人物的移动。当玩家点击某个方向按钮时,根据游戏规则判断人物能否向对应方向移动,并在合法的情况下更新人物的位置。
(5)过关判断:在每个关卡中,玩家需要将特定的人物移动到指定的位置才能过关。需要实时监测人物的位置和目标位置,当人物成功移动到目标位置时,判断玩家通关并进入下一关。
(6)退出游戏功能:允许玩家在任何时候退出游戏,可以提供一个退出选项供玩家选择。
(7)错误检测与提示:在玩家进行移动操作时,需要检测是否合法并给出相应的错误提示,例如超出边界或移动到已占用的位置等。
在这里插入图片描述
类名:GameClient
作用:创建游戏的客户端窗口,并将游戏面板和帮助面板添加到窗口中。
关键代码:public GameClient(){
helpPanel = new HelpPanel(1);//帮助面板,创建一个新的 HelpPanel 对象,并将其赋值给 helpPanel 变量。传递参数 1 用于指定帮助面板的类型或初始化信息。
gamePanel = new GamePanel(1);//设置关卡
gamePanel.setLayout(new BorderLayout());//将游戏面板的布局管理器设置为 BorderLayout
panel = this.getContentPane();//获取窗口的内容面板
panel.setLayout(new BorderLayout());//将内容面板的布局管理器设置BorderLayout
panel.add(helpPanel,BorderLayout.EAST);//将帮助面板添加到内容面板的东侧(右侧)位置。
panel.add(gamePanel,BorderLayout.CENTER);//将游戏面板添加到内容面板的中央位置.
this.setSize(650,650);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭时默认的操作为退出程序
this.setTitle(“华容道”);
this.setVisible(true);//设置窗口可见
this.setResizable(false);//禁止窗口大小的调整
}
类名:GamePanel(是一个游戏面板,用于展示游戏界面和控制游戏逻辑。)
作用:
初始化游戏布局:通过读取地图数组和图标数组,将人物和图块添加到游戏面板中,设置初始位置和图标。
实现鼠标事件和键盘事件的监听:用于控制人物的移动,根据鼠标点击和释放的像素坐标计算移动方向,并判断是否可以移动。
绘制游戏界面:重写paint()方法,绘制游戏面板上的人物和图块。
关键代码:
类名:HelpPanel
作用:用于显示游戏关卡的信息和操作按钮。
关键代码:private void initialize() {
nowName.setText(names[level-1]+“”);//设置当前关卡名称的标签文本为对应关卡的名称
nowStep.setText(“0”);//设置当前步数的标签文本为0
record.setText(“”+MapFactory.getRecord(level)); //设置历史记录的标签文本为对应关卡的历史记录
}
类名:login
作用:创建一个图形化登录界面,用户可以输入用户名、密码和昵称,并点击确认按钮进行登录操作。登录成功后,将显示一条欢迎消息,并创建一个游戏客户端窗口(GaneClient)。
关键代码:
public static void main(String args[])
{
new login(“欢迎进入罗依婧设计的华容道小游戏”);
}
}
类名:MapFactory
作用:它负责定义不同关卡的地图布局,并提供相关方法来获取关卡布局信息和更新关卡的记录步数。
关键代码:
//返回指定关卡布局信息的拷贝(避免直接引用)
public static Node[] getMap(int level){//静态方法的定义,用于返回指定关卡布局信息的拷贝,接受一个参数level,表示要获取的关卡级别。
Node[] temp = new Node[10]; //创建一个临时数组temp,用于存储布局信息。
for(int i=0;i<10;i++){ //循环遍历,实现拷贝。
temp[i] = map[level-1][i];
}
return temp;
}
//读取记录
fis = new FileInputStream(record);//创建一个用于读取基本数据类型的 DataInputStream 对象,并传入前面创建的 FileInputStream 对象作为构造参数。
dis = new DataInputStream(fis);//通过 DataInputStream 对象读取文件的一行内容,并将其存储在字符串变量 str 中。
String str = dis.readLine();//
array = str.split(“,”);

	}catch(Exception e){
		e.printStackTrace();
	}finally{
		 try {
				if(fis!=null)
				 fis.close();
				if(dis!=null)
				 dis.close();			
				if(fos!=null)
		    	 fos.close();
				if(dos!=null)
				 dos.close();				
		     } catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();//捕获可能发生的异常,并打印异常堆栈信息。
			}
	}			
	return Integer.parseInt(array[level-1]);//将 array 数组中指定关卡级别的记录转换为整数并返回。

类名:MapUtil
作用:用于封装对地图布局和关卡记录的操作,通过调用MapFactory类的方法来获取和更新相关信息。它提供了简化和统一的接口,方便其他类或模块使用。
关键代码:
//获取指定关卡的地图布局
public Node[] getMap(int level){
return MapFactory.getMap(level);
}
//获取关卡历史记录
public int getRecord(int level){
return MapFactory.getRecord(level);
}
//更新指定关卡记录
public void updateRecode(int level,int record){//更新关卡记录
MapFactory.writeRecord(level, record);
}
类名:Node
作用:用于封装地图节点的信息,包括节点的唯一标识符、方向以及在地图数组中的位置坐标。它提供了获取和设置节点属性的方法。
关键代码:public Node(int id,int x,int y,boolean direction){//定义了一个名为 Node 的类,并声明了一个带有参数的构造方法。
this.id = id;//将构造方法中传递的 id 参数赋值给类中的 id 属性。通过使用 this 关键字,可以引用当前类的实例变量。
this.x = x;
this.y = y;
this.direction = direction;
}
类名:Person
作用:用于创建一个可点击的人物按钮,用于在图形界面中展示人物信息。它封装了人物的编号和名称,并提供获取和设置人物属性的方法。
关键代码:
public class Person extends JButton{
int id;//人物的编号
String name;//人物的名称

public Person(int id,String str){//一个公共构造方法,用于创建 Person 类的对象
	super("");//可以访问父类的成员。
	name = str;//将构造方法中传递的 str 参数赋值给类中的 name 属性。
	this.id = id;//将构造方法中传递的 id 参数赋值给类中的 id 属性
}

public int getId() {//定义了一个公共方法 getId(),用于获取人物的编号。
	return id;
}

public void setId(int id) {
	this.id = id;
}	

}

源代码:

GameClientimport java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameClient extends JFrame{
   
    
    

	static GamePanel gamePanel;
	static HelpPanel helpPanel;
	static Container panel;//窗口容器
	
	public GameClient(){
   
    
    

		helpPanel = new HelpPanel(1);//帮助面板
		gamePanel = new GamePanel(1);//设置关卡
		gamePanel.setLayout(new BorderLayout());
		panel = this.getContentPane();
		panel.setLayout(new BorderLayout());
		panel.add(helpPanel,BorderLayout.EAST);
		panel.add(gamePanel,BorderLayout.CENTER);
		this.setSize(650,650);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭时默认的操作为退出程序
		this.setTitle("华容道");
		this.setVisible(true);//设置窗口可见
		this.setResizable(false);//禁止窗口大小的调整
	}
}
GamePanelimport java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameClient extends JFrame{
   
    
    

	static GamePanel gamePanel;
	static HelpPanel helpPanel;
	static Container panel;//窗口容器
	
	public GameClient(){
   
    
    

		helpPanel = new HelpPanel(1);//帮助面板
		gamePanel = new GamePanel(1);//设置关卡
		gamePanel.setLayout(new BorderLayout());
		panel = this.getContentPane();
		panel.setLayout(new BorderLayout());
		panel.add(helpPanel,BorderLayout.EAST);
		panel.add(gamePanel,BorderLayout.CENTER);
		this.setSize(650,650);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭时默认的操作为退出程序
		this.setTitle("华容道");
		this.setVisible(true);//设置窗口可见
		this.setResizable(false);//禁止窗口大小的调整
	}
}
HelpPanelimport java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
//创建一个帮助面板显示游戏的关卡信息 当前步数和历史记录
public class HelpPanel extends JPanel{
   
    
    

	String[] names = new String[]{
   
    
    "七步成诗","横刀立马","屯兵东路","插翅难飞","巧过五关","层层设防","近在咫尺","兵临曹营","众志成城","佳人梳妆"};//十个关卡的名字
	int level;
	JPanel panelNorth = new JPanel(new GridLayout(4,2,10,30));//:一个具有4行2列的网格布局的面板,用于存放关卡信息、当前步数和历史记录的标签以及重置按钮。
	static JLabel nowStep = new JLabel("0");//显示当前步数的标签
	JLabel nowName = new JLabel("");//显示当前关卡名称的标签
	JLabel record = new JLabel("9999");//显示历史记录的标签
	static	JButton restart = new JButton("重置");//重置按钮
                 	
	public HelpPanel(int level){
   
    
    
		this.level = level;
		this.setVisible(true);
		this.setLayout(new BorderLayout());//当前面板
		panelNorth.add(new JLabel("关卡名字:"));
		panelNorth.add(nowName);
		panelNorth.add(new JLabel("当前步数:"));
		panelNorth.add(nowStep);
		panelNorth.add(new JLabel("历史记录:"));
		panelNorth.add(record);//历史记录
		panelNorth.add(restart);
		
		this.add(panelNorth,BorderLayout.NORTH);
		initialize();
	}
//更新当前关卡数
	public void setLevel(int level){
   
    
    
		this.level = level;
		initialize();//重新初始化面板
	}
	
	private void initialize() {
   
    
    
//		System.out.println("level is "+level);
//		System.out.println(names[level-1]);
		nowName.setText(names[level-

猜你喜欢

转载自blog.csdn.net/m0_68165821/article/details/131485824
今日推荐