当前位置: 首页 > article >正文

拼图游游戏代码

一.创建新项目

二.插入图片

三.游戏的主界面

1.代码

package com.itheima.ui;
 
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;
import javax.swing.border.BevelBorder;
 
public class GameJFrame extends JFrame implements KeyListener,ActionListener{
//GameJFrame游戏的主界面
	//4.创建二维数组,用来管理数据
	int[][] data = new int[4][4];
	int x=0;
	int y=0;
	
	//定义一个变量,展示图片路径
	String path="images\\\\";
	
	
	//定义一个二维数组
	int[][] win = {
			{1,2,3,4},
			{5,6,7,8},
			{9,10,11,12},
			{13,14,15,0}
	};
	
	int step=0;
	//创建选项下面的对象
			JMenuItem replayItem = new JMenuItem("重新游戏");
			JMenuItem reLoginItem = new JMenuItem("重新登入");
			JMenuItem closeItem = new JMenuItem("关闭游戏");
			
			JMenuItem accountItem = new JMenuItem("公众号");
	public GameJFrame() {
		//设置宽高
		this.setSize(640, 700);
		//设置界面的标题
		this.setTitle("拼图单机版1.0");
		//设置界面置顶
		this.setAlwaysOnTop(true);
		//设置界面居中
		this.setLocationRelativeTo(null);
		//设置关闭模式
		this.setDefaultCloseOperation(3);
		//取消默认中间放置
		this.setLayout(null);
		//监听事件
		this.addKeyListener(this);
		
		
		
		//初始化菜单
		//创建菜单对象
		JMenuBar jMenuBar = new JMenuBar();
		//创建菜单上面的选项
		JMenu functionJMenu = new JMenu("功能");
		JMenu aboutJMenu = new JMenu("关于我们");
		
		//将每一个选项下面的条目添加到选项当中
		functionJMenu.add(replayItem);
		functionJMenu.add(reLoginItem);
		functionJMenu.add(closeItem);
		
		aboutJMenu.add(accountItem);
		
		//绑定事件
		replayItem.addActionListener(this);
		reLoginItem.addActionListener(this);
		closeItem.addActionListener(this);
		accountItem.addActionListener(this);
		
		//将菜单里面的两个选项添加到菜单中
		jMenuBar.add(functionJMenu);
		jMenuBar.add(aboutJMenu);
		
		//给整个界面设置菜单
		this.setJMenuBar(jMenuBar);
		
		//初始化数据
		initData();
		
		//初始化图片
		initImage();
		
	
		
		//显示
		this.setVisible(true);
		
	}
	
	//初始化数据
	private void initData() {
	
		//1.定义一维数组
				int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
				//2.打乱数组中的数据顺序
				//遍历数组
				Random r = new Random();
				for(int i=0;i<tempArr.length;i++) {
					//获取到随机索引
					int index = r.nextInt(tempArr.length);
					//拿到遍历数组的数据,和随机交换
					int temp = tempArr[i];
					tempArr[i] = tempArr[index];
					tempArr[index] = temp;
				}
				
				//遍历一维数组给二维数组
				for(int i=0;i<tempArr.length;i++) {
					if(tempArr[i]== 0) {
						x=i/4;
						y=i%4;
					}
					data[i /4][i%4] = tempArr[i];
				}
				}
				
				
 
	//初始化图片
	//添加图片
private void initImage() {
	//清空原本已经出现的所有图片
	this.getContentPane().removeAll();
	
	if(victory()) {
		JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
		winJLabel.setBounds(60, 59, 500, 500);
		this.getContentPane().add(winJLabel);
	}
	
	
	JLabel stepCount =new JLabel("步数: " +step);
	stepCount.setBounds(50, 30, 100, 20);
	this.getContentPane().add(stepCount);
	
	for(int i=0;i<4;i++) {
		for(int j=0;j<4;j++) {
			//获取当前图片的序号
			int num=data[i][j];
			JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
			//创建一个图片JLabel对象(管理容器)
			//指定图片位=位置
			jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
			//添加边框0/1都可以
			jLabel.setBorder(new BevelBorder(1));
			//把管理容器添加到界面中
			this.getContentPane().add(jLabel);
			
		}
	}
		
		this.getContentPane().repaint();
		
		
	
}
@Override
public void keyTyped(KeyEvent e) {
	// TODO Auto-generated method stub
	
}//按下不松时
@Override
public void keyPressed(KeyEvent e) {
	// TODO Auto-generated method stub
	int code = e.getKeyCode();
	if(code == 65) {
		//清空原本已经出现的所有图片
		this.getContentPane().removeAll();
		//加载完整图片
		JLabel all = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
		all.setBounds(10, 110, 603, 485);
		this.getContentPane().add(all);
		//刷新界面
		this.getContentPane().repaint();
	}
}
@Override
public void keyReleased(KeyEvent e) {
	//判断游戏是否胜利
	if(victory()) {
		return;
	}
	
	
	
	//对上下左右进行判断
	int code = e.getKeyCode();
	if(code == 37) {
	System.out.println("向左");
	if(y == 3) {
		//表示空白方块已经在最下方了,不能在移动了
		return;
	}
	//把空白方块下面的数字赋值给上面
			data[x][y] = data[x ][y-1];
			data[x][y-1]=0;
			y++;
			step++;
			initImage();
			
}else if(code == 38) {
	System.out.println("向上");
	if(x == 3) {
		//表示空白方块已经在最下方了,不能在移动了
		return;
	}
	//把空白方块下面的数字赋值给上面
	data[x][y] = data[x + 1][y];
	data[x+1][y]=0;
	x++;
	step++;
	initImage();
	
	
	
}else if(code == 39) {
	System.out.println("向右");
	if(y == 0) {
		//表示空白方块已经在最下方了,不能在移动了
		return;
	}
	//把空白方块下面的数字赋值给上面
		data[x][y] = data[x ][y-1];
		data[x][y-1]=0;
		y--;
		step++;
		initImage();
}else if(code == 40) {
	System.out.println("向下");
	if(x == 0) {
		//表示空白方块已经在最下方了,不能在移动了
		return;
	}
	//把空白方块下面的数字赋值给上面
		data[x][y] = data[x - 1][y];
		data[x-1][y]=0;
		x--;
		step++;
		initImage();
}else if(code == 65) {
	initImage();
}else if(code == 87) {
	data = new int[][] {
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12},
		{13,14,15,0}
	};
	initImage();
}
	}
public  boolean victory() {
	for(int i=0;i<data.length;i++) {
		for(int j=0;j<data[i].length;j++) {
			if(data[i][j] != win[i][j]) {
				return false;
			}
		}
	}
	return true;
	
}
 
@Override
public void actionPerformed(ActionEvent e) {
	Object obj =e.getSource();
	//判断
	if(obj == replayItem) {
		System.out.println("重新游戏");
		step = 0;
		initData();
		initImage();
	
	}else if(obj == reLoginItem) {
		System.out.println("重新登入");
		this.setVisible(false);
		new LoginJFrame();
		
		
		
	}else if(obj == closeItem) {
		System.out.println("关闭游戏");
		
		System.exit(0);
	}else if(obj == accountItem) {
		System.out.println("公众号");
	}
	
}
}
 

2.程序的启动入口

package com.itheima.ui;
public class App {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//程序的启动入口
		
		//想要开启谁的界面,就创建谁的对象
	
 
 
		new GameJFrame();
	}
 
}

3.结果

 


http://www.kler.cn/news/135780.html

相关文章:

  • Vatee万腾携手Wiki EXPO 2023悉尼峰会 共谱辉煌未来
  • Java code auditing
  • 力扣刷题-二叉树-完全二叉树的节点个数
  • Go 语言中的map和内存泄漏
  • 【GitLab】-HTTP 500 curl 22 The requested URL returned error: 500~SSH解决
  • 界面组件DevExpress Reporting v23.1亮点 - 全新升级报表查看器
  • 立哥先进技术-常用渗透测试工具
  • Workplace Search 的演变:使用 Elasticsearch 搜索你的私人数据
  • 细说MySQL数据类型
  • 安装R和Rstudio
  • 庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
  • uniapp如何上传文件,使用API是什么
  • 贪吃蛇代码
  • JVM的运行时数据区
  • 算法学习 day26
  • SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(九)
  • Android 解决CameraView叠加2个以上滤镜拍照黑屏的BUG (二)
  • 【C++上层应用】2. 预处理器
  • Github小彩蛋显示自己的README,git 个人首页的 README,readme基本语法
  • Attingo:西部数据部分SSD存在硬件设计制造缺陷
  • open3d ICP 配准
  • Java自定义异常类详解及示例
  • WPF中的App类介绍
  • 【华为HCIP | 华为数通工程师】刷题日记1116(一个字惨)
  • screen中conda激活环境后登录jupyter notebook导入包提示找不到,但是在命令行中就可以导入包
  • 记录我常用的免费API接口
  • 如何使用ffmpeg将FLAC格式转为MP3格式
  • qt-C++笔记之两个窗口ui的交互
  • 测试和验证有什么区别,怎么划分测试集和验证集
  • 【运维篇】5.4 Redis 并发延迟检测