目录
一、主界面分析:
二、逻辑处理
三、文件目录
四、代码
(一)游戏界面
(二)登录界面
(三)注册界面
(四)测试类代码
五、实现效果
该项目是Java基础联系项目,适用于初学者温习知识。本人也是初学者,跟着练手的。
注意:项目包括三个部分,注册页面、登录页面和游戏界面,但是前面两个页面没写!!只写了分游戏界面,功能完整。(主要是想混个徽章)
一、主界面分析:
需要了解JFrame的各种API,主要练习继承、接口、多态等知识点。
二、逻辑处理
分三个类写,包括注册页面,登录页面和游戏页面,他们分别继承于JFrame。然后在每个类中加上自己需要的属性和方法,但值得注意的是,我们尽量分块编码,这样逻辑会更加清晰。
三、文件目录
四、代码
(一)游戏界面
package gui;
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 gameFrame extends JFrame implements KeyListener , ActionListener {
//X,Y记录图片空白块的位置
int x=0;
int y=0;
int [][]data=new int[4][4];
//创建选项的功能
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reloginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("公众号");
//图片路径
String path="D:\\Java develop\\Program\\jiasawGame\\image\\girl\\girl8\\";
//定义一个正确的数组,放便以后判断是否通关
int [][]win= {
{1,5,9,13},
{2,6,10,14},
{3,7,11,15},
{4,8,12,16}
};
//计算步数
int count=0;
public gameFrame(){
//设置界面
initFrame();
//初始化菜单
initJmenubar();
//随机初始化图片位置
initData();
//初始化图片
initImage();
this.setVisible(true);
}
private void initData() {
int []temparr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
Random ra=new Random();
for (int i = 0; i < temparr.length; i++) {
int index=ra.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("D:\\Java develop\\Program\\jiasawGame\\image\\win.png"));
winJlabel.setBounds(203,283,197,73);
this.getContentPane().add(winJlabel);
}
JLabel stepCount=new JLabel("步数"+count );
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 number=data[i][j];
JLabel jlabel1 =new JLabel(new ImageIcon(path+number+".jpg"));
jlabel1.setBounds(105*i+83,105*j+124,105,105);
jlabel1.setBorder(new BevelBorder(1));
this.getContentPane().add(jlabel1);
}
}
JLabel jlabel2=new JLabel(new ImageIcon("D:\\Java develop\\Program\\jiasawGame\\image\\background.png"));
jlabel2.setBounds(40,30,508,560);
this.getContentPane().add(jlabel2);
this.getContentPane().repaint();//刷新界面
}
private void initJmenubar() {
//创建菜单
JMenuBar jmenuBar=new JMenuBar();
//创建菜单选项
JMenu functionJmenu=new JMenu("功能");
JMenu aboutJmenu=new JMenu("关于我们");
//向上添加对象
jmenuBar.add(functionJmenu);
jmenuBar.add(aboutJmenu);
functionJmenu.add(reloginItem);
functionJmenu.add(closeItem);
functionJmenu.add(replayItem);
aboutJmenu.add(accountItem);
//给目标绑定动作监听事件
reloginItem.addActionListener(this);
closeItem.addActionListener(this);
replayItem.addActionListener(this);
accountItem.addActionListener(this);
this.setJMenuBar(jmenuBar);
}
private void initFrame() {
this.setSize(603,680);
this.setTitle("拼图单机版 V1.0");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setLayout(null);
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code=e.getKeyCode();
if(code==65){
//按下A,显示完整图片
this.getContentPane().removeAll();
JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//添加背景图片
JLabel background=new JLabel(new ImageIcon("D:\\Java develop\\Program\\jiasawGame\\image\\background.png"));
background.setBounds(40,30,508,560);
this.getContentPane().add(background);
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
if(victory())return;//判断游戏是否胜利,如果胜利,就不能再继续移动
//对上下左右进行判断
int code=e.getKeyCode();
if(code==40){
if(y==3)return;
data[x][y]=data[x][y+1];
data[x][y+1]=0;
y++;
count++;
initImage();
} else if (code==39) {
if(x==3)return;
data[x][y]=data[x+1][y];
data[x+1][y]=0;
x++;
count++;
initImage();
} else if (code==38) {
if(y==0)return;
data[x][y]=data[x][y-1];
data[x][y-1]=0;
y--;
count++;
initImage();
} else if (code==37) {
if(x==0)return;
data[x][y]=data[x-1][y];
data[x-1][y]=0;
x--;
count++;
initImage();
} else if (code==65) {
initImage();
} else if (code==87) {
data=new int[][]{
{1,5,9,13},
{2,6,10,14},
{3,7,11,15},
{4,8,12,16}
};
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 ob=e.getSource();//获取当前被点击的条目对象
if(ob==replayItem){//重新游戏
initData();
count=0;
initImage();
} else if (ob==reloginItem) {
this.setVisible(false);
new loginFrame();
} else if (ob==accountItem) {
JDialog jDialog=new JDialog();//创建一个弹框对象
JLabel jLbel=new JLabel(new ImageIcon("D:\\Java develop\\Program\\jiasawGame\\image\\wangcheng.jpg"));
jLbel.setBounds(0,0,100,200);
jDialog.getContentPane().add(jLbel);
jDialog.setSize(600,600);
jDialog.setAlwaysOnTop(true);//弹窗置顶
jDialog.setLocationRelativeTo(null);//弹窗居中
jDialog.setModal(true);//弹框不关闭则无法操作下面的界面
jDialog.setVisible(true);//显示弹窗
} else if (ob==closeItem) {
System.exit(0);
}
}
}
(二)登录界面
package gui;
import javax.swing.*;
public class loginFrame extends JFrame {
public loginFrame(){
this.setSize(488,430);
this.setTitle("登录");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
(三)注册界面
package gui;
import javax.swing.*;
public class registerFrame extends JFrame {
public registerFrame(){
this.setSize(488,500);
this.setTitle("注册");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
(四)测试类代码
package gui;
public class Test {
public static void main(String[] args) {
gameFrame gf=new gameFrame();
//loginFrame lf=new loginFrame();
//registerFrame rf=new registerFrame();
}
}
五、实现效果