JAVASE 游戏

news2025/1/11 20:04:13

朴素的拼图游戏,通过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://www.coloradmin.cn/o/999222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用autotools制作Makefile

本文将通过一个例子介绍如何使用autotools制作Makefile&#xff0c;最终运行可执行文件。 本例子中使用的源代码a.c如下。 #include "stdio.h" void main() {int a,b;int c;printf("请输入两个数&#xff1a;\n");scanf("%d %d",&a,&b)…

大数据课程L3——网站流量项目的系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的运行环境; ⚪ 了解网站流量项目的日志采集系统搭建; ⚪ 了解网站流量项目的离线业务系统搭建; ⚪ 了解网站流量项目的Hive做离线数据处理; ⚪ 了解网站流量项目的…

盲打键盘的正确指法指南

简介 很多打字初学者&#xff0c;并不了解打字的正确指法规范&#xff0c;很容易出现只用两根手指交替按压键盘的“二指禅”情况。虽然这样也能实现打字&#xff0c;但是效率极低。本文将简单介绍盲打键盘的正确指法&#xff0c;以便大家在后续的学习和工作中能够提高工作效率…

Nacos安装及在项目中的使用

目录 概要一、安装 Nacos1、下载 Nacos2、解压3、启动 Nacos 服务器4、自定义Nacos启动脚本5、访问Nacos Web控制台 二、Nacos----服务注册与发现1、添加 Nacos 依赖2、配置 Nacos 服务器地址3、使用 Nacos 注册服务4、启动服务 三、Nacos----配置管理1、创建配置数据2、从 Nac…

技师学院物联网实训室建建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

深圳站WOT全球技术创新大会2023,精彩即将开启!

前几天刷屏的“中国大模型顶流群聊笔记”想必很多人都看到了&#xff0c;包括百川智能创始人&CEO王小川&#xff0c;创新工场董事长、零一万物创始人李开复&#xff0c;澜舟科技CEO周明在内的20多位中国大模型领域模型层、工具层、应用层的“顶流”们&#xff0c;在西溪湿地…

【校招VIP】专业课考点之死锁

考点介绍&#xff1a; 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源&#xff0c;在未改变这种状态之前都不能向前推进&#xff0c;称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的…

使用Python和BeautifulSoup提取网页数据的实用技巧

在数据驱动的时代&#xff0c;获取网页数据并进行分析和处理是一项重要的任务。Python作为一门强大的编程语言&#xff0c;在处理网页数据的领域也表现出色。本文将分享使用Python和BeautifulSoup库提取网页数据的实用技巧&#xff0c;帮助你更高效地获取和处理网页数据。 1、了…

什么牌子的运动蓝牙耳机好用、运动耳机品牌排行榜推荐

运动与健康息息相关&#xff0c;人们越来越认识到运动带来的益处&#xff0c;例如增强心肺功能、提高新陈代谢率&#xff0c;并能预防多种慢性疾病。随着社交媒体上越来越多人分享自己的运动心得&#xff0c;更多的人也被激发起参与其中的热情。 在运动过程中&#xff0c;音乐的…

猫头虎博主赠书三期:《Go编程进阶实战: 开发命令行应用、HTTP应用和gRPC应用》

&#x1f389;猫头虎博主赠书三期&#x1f389;&#xff1a;《Go编程进阶实战: 开发命令行应用、HTTP应用和gRPC应用》 &#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页…

EditPlus 配置python 及Anaconda中的python

若不是pycharm vscode 太大&#xff0c;太占内存&#xff0c;谁会想到用Notepad&#xff0c;EdirPlus 配置python呢&#xff01;&#xff01;&#xff01; 话不多说&#xff0c;首先你自己安装好EditPlus。开始 菜单栏 选择 工具 -> 配置自定义工具 组名:python 命令:d:\*…

基于51单片机的称重电子秤proteus仿真设计

一、设计背景 随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求。为了改变传统称重工具在使用上存在的问题&#xff0c;在本设计中将智能化、自动化、人性化用在了电子秤重的控制系统中。本系统主要由单片机来控制&#xff0c;测量物体重量部分使用称重传…

雅思口语同替高分表达

目录 雅思口语题目准备 Riding a bike 1. Did you have a bike when you were young? 2. Did you ride a bike when you were little? 3. Did you ride a bike to school? 4. Do you ride a bike when you go out no? 雅思口语经验 口语高分同替词汇 中式英语问题…

计算机竞赛 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

系列五、Nginx配置实例之反向代理1

一、目标 Linux服务器部署Tomcat的运行环境&#xff0c;然后通过Windows的www.123.com访问&#xff0c;能够访问到Tomcat的主页&#xff08;有猫的页面&#xff09; 二、步骤 2.1、下载apache-tomcat-8.5.63.tar.gz安装包 # 我分享的 链接&#xff1a;https://pan.baidu.com…

【数据结构与算法系列4】长度最小的子数组 (C++ Python)

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

virtualbox虚拟机中安装FreeDOS系统和DJGPP编译环境

一、安装FreeDOS系统 1、从官网下载FreeDOS系统镜像&#xff0c;下载的压缩包中包含两个文件&#xff1a;后缀为.iso和.img的镜像 ​​​下载页面 http://www.freedos.org/download/ 直接下载链接 https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.…

TAITherm专业热管理工具

TAITherm是ThermoAnalytics公司开发的专业三维热仿真分析工具&#xff0c;广泛应用于国内外汽车、工业自动化、轨道交通、重型机械等行业的热仿真设计中。同系列的CoTherm耦合优化平台可支持热流耦合、一三维耦合、FMU集成、设计优化、敏感性分析等应用。 产品模块介绍 TAITh…

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一&#xff1a;完全背包问题的变体&#xff08;版本1&#xff09;方法二&#xff1a;完全背包问题变体&#xff08;版本2&#xff09; 三、拓展&#xff1a;先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包&#xff08;组合问题…

1905. 统计子岛屿

给你两个 m x n 的二进制矩阵 grid1 和 grid2 &#xff0c;它们只包含 0 &#xff08;表示水域&#xff09;和 1 &#xff08;表示陆地&#xff09;。一个 岛屿 是由 四个方向 &#xff08;水平或者竖直&#xff09;上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。 如…