JAVASE 游戏

朴素的拼图游戏,通过WASD移动,我自己都不太会,可以通过篡改内部代码来取得想要的成功彩蛋

代码:

java 复制代码
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MainFrame extends JFrame implements KeyListener, ActionListener{//继承父类非私有方法,方便创建新的方法

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        new MainFrame();
	}
	
	String path = "A";
	int[][] datas = { 	
			{1, 2, 3},
			{4, 5, 6},
			{7, 8, 0}
	};
	
	int fx = datas.length - 1, fy = datas.length - 1;
	
	int count = -1;//记录移动次数
	JMenuItem item1 = new JMenuItem("打乱");
	JMenuItem item2 = new JMenuItem("复原");
	
	boolean selfdo = false;
	 
	
//构造器
public MainFrame(){
	initFrame();
	pantview();
	//放在这里更保险
	initmemu();//初始化菜单
	this.addKeyListener(this);
	setVisible(true);//设置窗体可见
}
	
//界面初始化
public void initFrame(){ 
	 setTitle("游戏");
	 setSize(804, 534);//设置尺寸
	 setLocationRelativeTo(null);//设置窗体居中
	 setAlwaysOnTop(true);//设置窗体置顶
	 setDefaultCloseOperation(3);//设置窗体的关闭模式
	//取消窗口默认布局
	 setLayout(null);
}

/*菜单*/
public void initmemu() {
	JMenuBar menu = new JMenuBar();//菜单框
	JMenu menu1 = new JMenu("菜单"); 
	JMenu menu2 = new JMenu("关于我们");//一阶菜单
	 
	JMenu menu3 = new JMenu("作者");
	JMenuItem item3 = new JMenuItem("Narnat");
	JMenu menu4 = new JMenu("指导者");
	JMenuItem item4 = new JMenuItem("黑马程序员");
	//串起来
	menu.add(menu1);
	menu.add(menu2);
	menu1.add(item1);
	menu1.add(item2);
	menu2.add(menu3);
	menu3.add(item3);
	menu2.add(menu4);
	menu4.add(item4);
	
	/*只要监听运行一次就会一直监听*/
	item1.addActionListener(this);
	item2.addActionListener(this);
	
	setJMenuBar(menu);
	//放入窗体
}

//图片放映
public void pantview(){ 	
	
	/*先移除掉原有的画面*/
	 
	getContentPane().removeAll();
	count ++;
	//System.out.println(selfdo + " " + checkVictory());
	pantVictory(selfdo && checkVictory());//画出成功
	
	for(int i = 0; i < 3; i ++)
		for(int j = 0; j < 3; j ++) {
			JLabel image = new JLabel(new ImageIcon("D:\\New_Study\\JAVA\\gameJAVA\\" + datas[i][j] + ".png"));//读取图片
			image.setBounds(100 + 202 * j, 100 + 112 * i, 200, 110);
			getContentPane().add(image);//将图片放入窗口
		}
	JLabel background = new JLabel(new ImageIcon("D:\\New_Study\\JAVA\\gameJAVA\\background.png"));//放入背景
	background.setBounds(100, 100, 604, 334);
	//后放的图片放在下面
	getContentPane().add(background);
	
	JLabel scoreshow = new JLabel("步数: " + count);
	
	scoreshow.setBounds(100, 80, 100, 20);
	getContentPane().add(scoreshow);//装入窗口
	
	getContentPane().repaint();//刷新界面
}

@Override
public void keyTyped(KeyEvent e) {}//较多按键监视不到

@Override
/*按键被按下*/
public void keyPressed(KeyEvent e) {
	// TODO Auto-generated method stub
	int keycode = e.getKeyCode();
	if(keycode == 87) {//上
	   
	   MoveUp();
	}else if(keycode == 83) {//下
	    
	   MoveDown();
	}else if(keycode == 65) {//左
	    
	   MoveLeft();
	}else if(keycode == 68) {//右
	    
	   MoveRight();
	}else {
		 
	}
	 
}

 
@Override
/*按键松开*/
public void keyReleased(KeyEvent e) {
	// TODO Auto-generated method stub
	
}

public void MoveLeft() {
	// TODO Auto-generated method stub
	if(fy + 1 >= 0 && fy + 1 < datas.length) {
		swap(fx, fy, fx, fy + 1);
		pantview();//重新绘制界面 
	}
	
}

public void MoveRight() {
	// TODO Auto-generated method stub
	if(fy - 1 >= 0 && fy - 1 < datas.length) {
		swap(fx, fy, fx, fy - 1);
		pantview();//重新绘制界面 
	}
}

public void MoveDown(){
	// TODO Auto-generated method stub
	 
		if(fx - 1 >= 0 && fx - 1 < datas.length) {
			swap(fx, fy, fx - 1, fy);
			pantview();//重新绘制界面 
		}
}

public void MoveUp() {
	// TODO Auto-generated method stub
    if(fx + 1 >= 0 && fx + 1 < datas.length) {
	   swap(fx, fy, fx + 1, fy);
	   pantview();//重新绘制界面 
	}
}

public void swap(int xx, int yy, int x, int y) {
	int temp = datas[xx][yy];
	datas[xx][yy] = datas[x][y];
	datas[x][y] = temp; 
	fx = x;
	fy = y;
}

@Override
/*监听菜单*/
public void actionPerformed(ActionEvent e) {
	// TODO Auto-generated method stub
	if(e.getSource() == item1) {
		selfdo = true;//再次完成拼图会出现成功画面
	    changeAll();
	    count = -1;
	    pantview();
	}else if(e.getSource() == item2) {
		selfdo = false;//再次完成拼图不会出现成功画面
	    recoverAll();
	    count = -1;
	    pantview();
	}
}
public void changeAll() {
	int len = datas.length * datas.length;
	int nums[] = new int[len];
	nums[len - 1] = 0;
	int x = 1;
	for(int i = 0; i < len - 1; i ++) nums[i] = x ++;
	Random r = new Random();//产生随机数
	for(int j = 0; j < len - 1; j ++) {//最后一位不做处理
		int index = r.nextInt(len - 1);//[0 ~ len - 1)随机数
		int temp = nums[j];
		nums[j] = nums[index];
		nums[index] = temp;
	}
	int length = (int)Math.abs(Math.sqrt(len));
	
	for(int i = 0; i < len; i++) datas[i / length][i % length] = nums[i];
	
	//重新记录空格位置
	fx = length - 1;
	fy = length - 1;
}
public void recoverAll() {
	int len = datas.length;
	datas[len - 1][len - 1] = 0;
	int x = 1;
	for(int i = 0; i < len; i ++)
		for(int j = 0; j < len; j ++) datas[i][j] = x ++;
	
	//记录空格位置
	fx = len - 1;
	fy = len - 1;
}
public boolean checkVictory() {
	int x = 1;
	int len = datas.length;
	for(int i = 0; i < len; i ++)
		for(int j = 0; j < len; j ++) {
			if(i == len - 1 && j == len - 1) return true;//最后一个不用检查
			if(datas[i][j] != x ++) return false;
		}
	return true;
}
public void pantVictory(boolean whodo) {
	if(whodo) {
		if(count <= 50) path = "A";
		else if(count <= 100) path = "B";
		else if(count <= 500) path = "C";
		else path = "D";
		System.out.println("成功");
		JLabel victory = new JLabel(new ImageIcon("D:\\New_Study\\JAVA\\gameJAVA\\"+ path +"_victory.jpg"));//成功画面
		victory.setBounds(252, 117, 300, 300);
		getContentPane().add(victory);//写入画框
	    selfdo = false;
	}
}
}

调用的文件图片:

图片下载:

百度网盘:

https://pan.baidu.com/s/1ELlMZXXSqGCE8Dsyl1ETNQ?pwd=e1z8

提取:e1z8

运行效果:

移动:通过WASD移动

打乱功能效果:

复原功能效果:

成功功能效果:

根据步数不同效果分别为:




相关推荐
邪修king10 分钟前
UE5 进阶篇第一弹:中期架构升级 —— 组件化开发与 Gameplay 框架实战
c++·游戏·架构·ue5
zhangfeng11331 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
Javatutouhouduan7 小时前
2026Java面试的正确打开方式!
java·高并发·java面试·java面试题·后端开发·java编程·java八股文
chao1898448 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
JAVA面经实录9178 小时前
Java初级最终完整版学习路线图
java·spring·eclipse·maven
赏金术士8 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
Cat_Rocky9 小时前
k8s-持久化存储,粗浅学习
java·学习·kubernetes
楼兰公子9 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
知识领航员9 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
吴声子夜歌9 小时前
Go——并发编程
开发语言·后端·golang