JAVASE 游戏

news/2024/7/8 4:15:11

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

代码:

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移动

打乱功能效果:

在这里插入图片描述

复原功能效果:

在这里插入图片描述

成功功能效果:

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1538453.html

相关文章

asio中的锁

asio到底有没有锁 asio是有锁的&#xff0c;所以规避锁的写法还是值得研究的 windows中的锁 先来张截图&#xff1a; dispatch_mutex_主要是为了保护定时器队列和完成端口回调的队列。 保护定时器队列 保护完成端口回调的队列 在PostQueuedCompletionStatus失败时&#x…

机器视觉方案工程师,价值远不止于此

机器视觉方案工程师,很少出差,受到很多机器视觉工程师的追捧,那我们看下主要的工作职责和任职要求: 岗位职责: 1、负责机器视觉检测系统光学方案选型,主要为光源,相机镜头的选型评估; 2、负责机器视觉光学系统的设计、搭建、测试,具体是指:机器视觉中光学成像方案设…

【Vue】

Vue 简介 Vue.js&#xff08;通常简称为Vue&#xff09;是一种流行的JavaScript前端框架&#xff0c;用于构建交互式和动态的用户界面&#xff08;UI&#xff09;。Vue的特点包括&#xff1a; 轻量级&#xff1a;Vue.js是一个轻量级框架&#xff0c;文件大小小&#xff0c;易于…

TCP通信测试

一、TCP通信测试&#xff1a; 创建TCP Server&#xff1a; 选中左方的TCP Server, 然后点击”创建”按钮&#xff0c;软件弹出监听端口输入框 输入监听端口后&#xff0c;即创建了一个在指定端口上进行监听的TCP Server Socket。TCP Server Socket创建时,软件会自动启动TCP Se…

5. spark 参数问题

官网地址&#xff1a;spark 参数 在代码中设置参数 spark-default.conf < 命令行< 代码内部设置参数&#xff0c; 对于一常用的参数可以放在配置文件&#xff0c;对于一些个性化参数则通过 命令行传递比较好。 命令行 命令行传递参数&#xff0c;有一些快捷方式&…

点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理

目录 前言 国内外研究现状 点云基础和相关技术研究 2.1 点云数据格式 2.1.1 LAS 格式

蚂蚁发布金融大模型:两大应用产品支小宝2.0、支小助将在完成备案后上线

9月8日&#xff0c;在上海举办的外滩大会上&#xff0c;蚂蚁集团正式发布金融大模型。据了解&#xff0c;蚂蚁金融大模型基于蚂蚁自研基础大模型&#xff0c;针对金融产业深度定制&#xff0c;底层算力集群达到万卡规模。该大模型聚焦真实的金融场景需求&#xff0c;在“认知、…

浅谈UI自动化测试

最近一直在学习python&#xff0c;正好部门技术结构调整&#xff0c;就开始了点工向UI自动化测试的转变&#xff0c;我要说瞌睡来了就掉枕头么&#xff1f; 不过还好&#xff0c;可以将python的学习成果在自动化测试中实践。。。 1、about自动化测试 定义&#xff1a;把人为驱…