java拼图游戏

只完成了游戏界面,登入和注册界面还没完成

启动类

package com.yx.ui;
 
public class App {
//启动入口
	public static void main(String[] args) {
		//如果想要开启一个界面,就创建谁的对象
//	new DengJFrame();	
//	new ZCJFrame();
	new GameJFrame();
	}
 
}

游戏类

package com.yx.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.JDialog;
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{
		//创建二维数组
		int[][]date=new int[4][4];
		//记录空白方块的位置
		int x=0;
		int y=0;
		String pas="image/animal/animal3/";
		//游戏界面,所有跟游戏有关的代码
		
		//定义数组保存正确数据
		int[][] win={
			{1,2,3,4},
			{5,6,7,8},
			{9,10,11,12},
			{13,14,15,0}
			};
		//步数
		int bu=0;
		
		//创建选项下面的条目对象
		JMenuItem cxyx=new JMenuItem("重新游戏");
		JMenuItem cxdr=new JMenuItem("重新登入");
		JMenuItem gbyx=new JMenuItem("关闭游戏");
		
		JMenuItem gzh=new JMenuItem("公众号");
				
	public GameJFrame() {
		//初始化界面
		jmian();
		
		//初始化菜单
		caidan();
		
		//初始化数据
		daluan();
		
		//初始化图片
		tupian();
		
		//展示出来
		this.setVisible(true);
		
	}
	
	//初始化数据(打乱)
	private void daluan() {
		//需求:
		//把一个一维数组中的数据: 0~15 打乱顺序
		//然后再按照4个一组的方式添加到二维数组当中
		
		//定义一个一维数组
		int[]temp= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		//打乱数组中的数据的顺序
		//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
		Random r=new Random();
		for(int i=0;i<temp.length;i++) {
			//获取随机索引
		int x=r.nextInt(temp.length);
		//交换数据
		int temp1=temp[i];
		temp[i]=temp[x];
		temp[x]=temp1;
		}
		//给二维数组添加数据
		//遍历一维数组temp得到每个元素,将每个元素添加到二维数组中
		//i=0		0  0
		//i=1		0  1
		//i=2		0  2.....
		for(int i=0;i<temp.length;i++) {
			if(temp[i]==0) {
				x=i/4;
				y=i%4;
			}
				date[i/4][i%4]=temp[i];
			
			
		}
	}
	//初始化图片
	
	private void tupian() {
		
	//清空图片
		this.getContentPane().removeAll();
		if(victory()) {
			//胜利的图
			JLabel winJLabel=new JLabel(new ImageIcon("image/win.png"));
			winJLabel.setBounds(203, 283, 197, 73);
			this.getContentPane().add(winJLabel);
		}
		
		JLabel bs=new JLabel("步数"+bu);
		bs.setBounds(50, 30, 100, 20);
		this.getContentPane().add(bs);
		
		
		
		
		
	//先加载的图片在上方
		
		//把内循环执行4次
		for(int i=0;i<4;i++) {
			//一行添加4张图片
			for(int j=0;j<4;j++) {
				//获取图片序号
				int num=date[i][j];
				//创建JLabel对象(管理容器)
				JLabel jLabel=new JLabel(new ImageIcon(pas+num+".jpg"));
			//指定图片位置
				jLabel.setBounds(105*j+83, 105*i+134, 105, 105);
				//给图片添加边框
				jLabel.setBorder(new BevelBorder(1));
				//0让图片凸起来,1让图片凹下去
			//将管理容器添加到容器内
			this.getContentPane().add(jLabel);
			
			}
			
		}
 
		//添加背景
		
		JLabel ba=new JLabel(new ImageIcon("image/background.png"));
		ba.setBounds(40, 40, 508, 560);
		this.getContentPane().add(ba);
		
		//刷新界面
		this.getContentPane().repaint();
		
		
}
	private void caidan() {
		//创建菜单对象
		JMenuBar cdan=new JMenuBar();
		//创建菜单上面两个选项对象(功能  关于我们)
		JMenu gn=new JMenu("功能");
		JMenu gywm=new JMenu("关于我们");
		
		//将每一个选项下面的条目添加到选项中
		gn.add(cxyx);
		gn.add(cxdr);
		gn.add(gbyx);
		gywm.add(gzh);
		
		//给条目绑定事件
		cxyx.addActionListener(this);
		cxdr.addActionListener(this);
		gbyx.addActionListener(this);
		gzh.addActionListener(this);
		
		//将菜单里面的两个选项添加到菜单当中
		cdan.add(gn);
		cdan.add(gywm);
		
		
		
		
		
		//给整个界面设置菜单
		this.setJMenuBar(cdan);
	}
	private void jmian() {
		//设置窗体的宽高
		this.setSize(603,680);
		//标题
		this.setTitle("拼图游戏");
		//置顶
		this.setAlwaysOnTop(true);
		//居中
		this.setLocationRelativeTo(null);
		//关闭模式
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//取消默认的居中放置
		this.setLayout(null);
		//添加键盘事件
		this.addKeyListener(this);
	}
	public static void main(String[] args) {
		
		
	}
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	//按下不松会调用这个方法
	@Override
	public void keyPressed(KeyEvent e) {
	int code=e.getKeyCode();
	if(code==65) {
		//删除当前界面所有图片
		this.getContentPane().removeAll();
		//加载完整图片
		JLabel all=new JLabel(new ImageIcon(pas+"all.jpg"));
		all.setBounds(83, 134, 420, 420);
		this.getContentPane().add(all);
		//加载背景
		JLabel ba=new JLabel(new ImageIcon("image/background.png"));
		ba.setBounds(40, 40, 508, 560);
		this.getContentPane().add(ba);
		
		//刷新界面
		this.getContentPane().repaint();
	}
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
		
		//上下左右进行判断
		int code=e.getKeyCode();
		if(code==38) {
		System.out.println("向上移动");
		if(x==3) {
			//表示空白方块已经在最下方了,他的下面没有图片在能移动了
			return;
		}
		//把空白方块下方的数字往上移动
		//x,y 表示空白方块
		//x+1,y表示空白方块的数字
		date[x][y]=date[x+1][y];
		date[x+1][y]=0;
		x++;
		//步数自增
		bu++;
		tupian();
		}else if(code==40) {
			System.out.println("向下移动");
			if(x==0) {
				return;
			}
			//把空白方块上方的数字往下移动
			date[x][y]=date[x-1][y];
			date[x-1][y]=0;
			x--;
			//步数自增
			bu++;
			tupian();
		}else if(code==37) {
			//把空白方块右方的数字往下移动
			System.out.println("向左移动");
			if(y==3) {
				return;
			}
			date[x][y]=date[x][y+1];
			date[x][y+1]=0;
			y++;
			//步数自增
			bu++;
			tupian();
		}else if(code==39) {
			//把空白方块左方的数字往下移动
			System.out.println("向右移动");
			if(y==0) {
				return;
			}
			date[x][y]=date[x][y-1];
			date[x][y-1]=0;
			y--;
			//步数自增
			bu++;
			tupian();
		}else if(code==65) {
			tupian();
		}else if(code==87) {
			date=new int[][] {
				{1,2,3,4},
				{5,6,7,8},
				{9,10,11,12},
				{13,14,15,0}
			};
			tupian();
		}
		
		
	}
	//判断是否正确,正确返回true,否则返回false
	public boolean victory() {
		for(int i=0;i<date.length;i++) {
			for(int j=0;j<date[i].length;j++) {
				if(date[i][j]!=win[i][j]) {
					return false;
				}
			}
		}
		return true;
	}
 
	@Override
	public void actionPerformed(ActionEvent e) {
		//获得被点击的条目对象
		Object obj=e.getSource();
		if(obj==cxyx) {
			System.out.println("重新游戏");
			//打乱二维数组数据
			daluan();
			//计步器清零
			bu=0;
			//重新加载图片
			tupian();
		}else if(obj==cxdr) {
			System.out.println("重新登入");
			
			//关闭游戏
			this.setVisible(false);
			//打开登入界面
			new DengJFrame();			
		}else if(obj==gbyx) {
			System.out.println("关闭游戏");
			//关闭虚拟机
			System.exit(0);
			
			
		}else if(obj==gzh) {
			System.out.println("公众号");
			//创建弹框
			JDialog gzhtu=new JDialog();
			//创建管理的容器对象
			JLabel jLabel=new JLabel(new ImageIcon("image/about.png"));
			jLabel.setBounds(0, 0, 258, 258);
			//添加到弹框
			gzhtu.getContentPane().add(jLabel);
			//设置大小
			gzhtu.setSize(344, 344);
			//置顶
			gzhtu.setAlwaysOnTop(true);
			//居中
			gzhtu.setLayout(null);
			//不关闭,无法操作
			gzhtu.setModal(true);
			//显示弹框
			gzhtu.setVisible(true);
		}
		
	}
	
}

 展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值