临时储备的知识点
- ctrl+B查看源代码
- 源代码里面的英文可以添加翻译插件(plugin)搜索translate安装插件,然后选择想翻译的内容,右键,翻译
- ctrl+alt+m 是把选中的模块而代码抽取成方法
- alt+enter 写一个还没写好的方法,选中名称点击这个快捷键自动生成方法体
- CTRL+B 选中方法名,点击它跟进方法体
主界面分析
效果图
创建主界面
菜单制作
添加图片
照片地址可以通过改变数字的方式
我一开始一个一个打进去的,用一个循环,提高效率
打乱图片循序
事件
游戏逻辑实现
目录:
美化界面
移动图片
按照这个坐标实现坐标位置
查看完整图片功能
作弊码
判断胜利
记录步数
重新开始
到目前位置该游戏基本已完成,注册,登录代码,可以去看我以前发布的博客,有详细步骤以及源代码
完整代码
因为拼图用的照片是我自己的个人照片,没有在这里分享给你们,你们可以参考代码里面的照片数据,能做出自己的拼图小游戏,以下代码中,我把不同包类下的代码一起放进去了,依******号隔开
xiaoguo
里面放进你自己的图片就可以
没有照片情况下的图示
import UI.GameJframe;
import UI.LoginJfarame;
import UI.RegisterJframe;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class App {
public static void main(String[] args) {
//如果我们想开启一个界面就要新建谁的界面
//主页面
new GameJframe();
//登录页面
// new LoginJfarame();
//注册页面
// new RegisterJframe();
}
}
//*************************************************************
package UI;
import javax.swing.*;
public class LoginJfarame extends JFrame {
public LoginJfarame (){
setSize(488,430);
//设置界面的标题
this.setTitle("拼图 登录");
//置顶设置
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//显示界面程序,建议写到最后
setVisible(true);
}
}
//**********************************************************
package UI;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJframe extends JFrame implements KeyListener, ActionListener {
// 创建一个二维数组,用来管理数据,加载图片的时候会根据二维数组中的进行加载
int [][]date=new int[3][3];
//定义一个变量名,记录当前展示图片的路径
int []tempAtt={0,1,2,3,4,5,6,7,8};
String path="E:\\E\\IDEA代码\\interface\\puzzleGame\\";
//定义一个二维数组,里面存储正确的数据
int [][] win= {{1,2,3},{4,5,6},{7,8,0}};
//定义一个变量,用来计步数
int step=0;
//创建下面的条目对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reloginItem=new JMenuItem("重新登陆");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("关于我们 ");
public GameJframe() {
//初始化界面
initJframe();
//初始化菜单
initJmenuBar();
//初始化数据
intDate();
//初始化图片
initImage();
//显示界面程序,建议写到最后
setVisible(true);
}
//记录空白方块儿在二维数组中的位置
int x=0;
int y=0;
//初始化数据,(打乱)
private void intDate() {
//需求,打乱0~9的一维数组
// 然后再按照三个一起存放
// 定义一个一位数组
int []tempAtt={0,1,2,3,4,5,6,7,8};
// 打乱数组中的数字
Random r=new Random();
for (int i = 0; i < tempAtt.length; i++) {
// 获取到随即索引
int index= r.nextInt(tempAtt.length);
// 拿着遍历到的没一个数组跟随即索引的数据进行交换
int temp=tempAtt[i];
tempAtt[i]=tempAtt[index];
tempAtt[index]=temp;
}
// 给二维数组添加数据,每一行三个数据
for (int i = 0; i < tempAtt.length; i++) {
if (tempAtt[i]==0){
x=i/3;
y=i%3;
}
date[i/3][i%3]=tempAtt[i];
}
}
//初始化图片
private void initImage() {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
//显示胜利的图标
if (victory()){
// int dat=date[x][y];
JLabel winLabel1=new JLabel(new ImageIcon(path+"胜利-4.jpg"));
winLabel1.setBounds(124*3-40,124*3+10,124,124);
this.getContentPane().add(winLabel1);
}
JLabel stepCount=new JLabel("步数"+step);
stepCount.setBounds(25,20,100,20);
this.getContentPane().add(stepCount);
//创建一个图片ImageIcon的对象
/* ImageIcon icon1 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\1.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel1=new JLabel(icon1);
//置顶图片位置
Jlabel1.setBounds(0,0,140,140);
//把管理容器添加到桌面中
//this.add(Jlabel1);
this.getContentPane().add(Jlabel1);
//2张
//创建一个图片ImageIcon的对象
ImageIcon icon2 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\2.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel2=new JLabel(icon2);
//置顶图片位置
Jlabel2.setBounds(140,0,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel2);
//3张
//创建一个图片ImageIcon的对象
ImageIcon icon3 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\3.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel3=new JLabel(icon3);
//置顶图片位置
Jlabel3.setBounds(280,0,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel3);
//4张
//创建一个图片ImageIcon的对象
ImageIcon icon4 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\4.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel4=new JLabel(icon4);
//置顶图片位置
Jlabel4.setBounds(0,140,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel4);
//5张
//创建一个图片ImageIcon的对象
ImageIcon icon5 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\5.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel5=new JLabel(icon5);
//置顶图片位置
Jlabel5.setBounds(140,140,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel5);
//2张
//创建一个图片ImageIcon的对象
ImageIcon icon6 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\6.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel6=new JLabel(icon6);
//置顶图片位置
Jlabel6.setBounds(280,140,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel6);
//2张
//创建一个图片ImageIcon的对象
ImageIcon icon7 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\7.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel7=new JLabel(icon7);
//置顶图片位置
Jlabel7.setBounds(0,280,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel7);
//2张
//创建一个图片ImageIcon的对象
ImageIcon icon8 =new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\8.jpg");
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel8=new JLabel(icon8);
//置顶图片位置
Jlabel8.setBounds(140,280,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel8);
//创建一个图片ImageIcon的对象
ImageIcon icon9 =new ImageIcon();
//创建一个Jlabel的对象(管理容器)
JLabel Jlabel9=new JLabel(icon9);
//置顶图片位置
Jlabel9.setBounds(280,280,140,140);
//把管理容器添加到桌面中
this.getContentPane().add(Jlabel9);*/
//外循环,把内循环重复执行了3次
//int number=1;
for (int i = 0; i < 3; i++) {
//内循环 ,表示在一个行里面添加三张图片
for (int j = 0; j < 3; j++) {
//获取当前要加载图片的序号
int num=date[i][j];
//创建一个Jlabel对象(管理容器)
JLabel jLabel1=new JLabel(new ImageIcon(path+num+".jpg"));
//置顶图片位置
jLabel1.setBounds(124*j+83,124*i+134,124,124);
//给图片添加边框
//0,表示凸起,1表示凹下
jLabel1.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
this.getContentPane().add(jLabel1);
// number++;
}
}
//添加背景图片
JLabel background=new JLabel(new ImageIcon(path+"未标题-2.jpg"));
background.setBounds(20,40,508,560);
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
}
//初始化菜单
private void initJmenuBar() {
//创建整个菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上的两个选项的对象(功能,关于我们)
JMenu FunctiomMenu = new JMenu("功能");
JMenu AboutMenue = new JMenu("关于我们");
//将每一个选项下面的条目到选项当中
FunctiomMenu.add(replayItem);
FunctiomMenu.add(reloginItem);
FunctiomMenu.add(closeItem);
AboutMenue.add(accountItem);
//给条目绑定事件
replayItem.addActionListener(this);
reloginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//将菜单里面的两个选项添加到菜单当中
jMenuBar.add(FunctiomMenu);
jMenuBar.add(AboutMenue);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
private void initJframe() {
//this 关键字在这里科协可不写
this.setSize(603, 680);//括号内的表示像素
this.setVisible(true);//用于显示创建的主界面(默认是处于隐藏状态)
//设置界面的标题
this.setTitle("拼图单机版,对象BMY v.0");
//置顶设置
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//修改.后面的内容可以修改关闭模式
//取消默认的居中设置,只要取消了才会按照xy的值来放指定的位置
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松时会调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code=e.getKeyCode();
//快捷键a查看原图
if (code==65){
//先把界面中的所有图片全部删除
this.getContentPane().removeAll();
//加载完整的图片
JLabel all=new JLabel(new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\未标题-1.jpg"));
all.setBounds(83,134,372,372);
this.getContentPane().add(all);
//加载背景图片
//添加背景图片
JLabel background=new JLabel(new ImageIcon("E:\\E\\IDEA代码\\interface\\puzzleGame\\未标题-2.jpg"));
background.setBounds(20,40,508,560);
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
//然后想调回原来的那个拼图界面,就要用下面的(keyReleased)接口
}
}
//松开时
@Override
public void keyReleased(KeyEvent e) {
//判断有没有成功,如果成功结束游戏
if (victory()){
return;
}
//对上下左右进行判断
//左37,上,38,右39,上,40(忘记了可以打印code的值获取
int code=e.getKeyCode();
if (code==37){
if (y==0){
return;
}
System.out.println("向←移动");
date[x][y]=date[x][y-1];
date[x][y-1]=0;
y--;
//记步数
step++;
initImage();
} else if (code==38) {
if (x==0){
return;
}
System.out.println("向上移动");
//逻辑:把空白方块儿下方的数字向上移动,xy表示空白方块儿,x+1,y表示空白方块儿下方的数字
date[x][y]=date[x-1][y];
date[x-1][y]=0;
x--;
//记步数
step++;
//调用方法按照最新的数字加载图片
initImage();
} else if (code==39) {
if (y==2){
return;
}
System.out.println("向右移动");
date[x][y]=date[x][y+1];
date[x][y+1]=0;
y++;
//记步数
step++;
initImage();
} else if (code==40) {
//下移动
if (x==2){
return;
}
System.out.println("向下移动");
date[x][y]=date[x+1][y];
date[x+1][y]=0;
x++;
//记步数
step++;
initImage();
//快捷键w一件获胜
} else if (code==65) {
initImage();
} else if (code==87) {
date =new int[][]{{1,2,3},{4,5,6},{7,8,0}};
initImage();
}
}
//判断date数组中的数据是否和win数组中相通
//如果全部相通,返回true,否则返回false
public boolean victory(){
for (int i = 0; i < date.length; i++) {
for (int j = 0; j < date.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==replayItem){
System.out.println("重新开始游戏");
//计数
step=0;
//再次打乱图像
intDate();
//重新加载图片
initImage();
} else if (obj==reloginItem) {
System.out.println("重新登录游戏");
//关闭当前游戏界面
this.setVisible(false);
//打开登录界面
new UI.LoginJfarame();
//计数
step=0;
} else if (obj==closeItem) {
System.out.println("关闭游戏");
System.exit(0);
} else if (obj==accountItem) {
System.out.println("公众号");
//创建一个弹窗对象
JDialog jDialog=new JDialog();
//创建一个管理图片容器对象Jlabel
JLabel jLabel=new JLabel(new ImageIcon(path+"弹窗00.png"));
//设置位置和宽高
jLabel.setBounds(0,0,500,500);
//把图片添加到弹窗当中
jDialog.getContentPane().add(jLabel);
//设置弹窗大小
jDialog.setSize(520,520);
//让弹窗置顶
jDialog.setAlwaysOnTop(true);
//让弹窗居中
jDialog.setLocationRelativeTo(null);
//弹窗不关闭无法操作下面的界面
jDialog.setModal(true);
//让弹窗显示出来
jDialog.setVisible(true);
}
}
}
//******************************************************
package UI;
import javax.swing.*;
public class RegisterJframe extends JFrame {
public RegisterJframe (){
setSize(488,500);
//设置界面的标题
this.setTitle("拼图 注册");
//置顶设置
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
}