拼图小游戏,通过上下左右键或者awds键实现拼图的移动,以完成拼图。
其中包含更换图片,重新开始,退出登录,关闭界面,还有关于我们等功能,有Q键查看最终效果,R键一键通关的特殊按键功能。
package hello.third.game;
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[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int jj[][] = new int[4][4];
int ii[][] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0},
};
int step=0;
int x;
int y;
String path = "..\\July\\image\\girl\\girl3\\";
//按钮条目是声明
JMenuItem replayItem = new JMenuItem("重新开始");
JMenuItem reLoginItem = new JMenuItem("重新登陆");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
JMenuItem animalItem = new JMenuItem("动物");
JMenuItem girlItem = new JMenuItem("美女");
JMenuItem sportItem = new JMenuItem("运动");
public GameJFrame() {
//初始化页面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数组
initArray();
//初始化图片
initImage();
//设置页面可见,建议写在最后
this.setVisible(true);
}
private void initArray() {
/*Random c = new Random();
int b = c.nextInt(15)+5;*/
for (int i = 0; i < 15; i++) {
Random random = new Random();
int b = random.nextInt(16);
int temp = a[i];
a[i] = a[b];
a[b] = temp;
}
for (int i = 0; i < a.length; i++) {
if (a[i]==0){
x=i/4;
y=i%4;
}
jj[i/4][i%4] = a[i];
}
}
private void initImage() {
this.getContentPane().removeAll();
JLabel stepNum = new JLabel("stepNum: "+step);
stepNum.setBounds(20,20,150,60);
this.getContentPane().add(stepNum);
//清除原本的图片
if (winOrNo()){
ImageIcon backGround = new ImageIcon("..\\July\\image\\win.png");
JLabel jLabel = new JLabel(backGround);
jLabel.setBounds(203, 283, 200, 100);
this.getContentPane().add(jLabel);
}
image();
}
private void initJMenuBar() {
//设置菜单内的单独选项和条目 JMenuBar>JMenu>JMenuItem
JMenuBar jMenuBar = new JMenuBar();
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
JMenu exchangePhoto = new JMenu("更换图片");
functionJMenu.add(exchangePhoto);
//把JMenuItem条目放在JMenu选择中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
exchangePhoto.add(animalItem);
exchangePhoto.add(girlItem);
exchangePhoto.add(sportItem);
aboutJMenu.add(accountItem);
//添加动作监听
reLoginItem.addActionListener(this);
replayItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
girlItem.addActionListener(this);
animalItem.addActionListener(this);
sportItem.addActionListener(this);
//把JMenu选项放在JMenuBar菜单中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给页面设置菜单
this.setJMenuBar(jMenuBar);
}//功能按钮的初始化
private void initJFrame() {
//设置页面大小
this.setSize(603, 680);
//设置页面一直存在
this.setAlwaysOnTop(true);
//设置title标题
this.setTitle("单机版 v1.0");
//设置居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消页面的默认布局
this.setLayout(null);
this.addKeyListener(this);
}//整体页面的初始化
@Override
public void keyTyped(KeyEvent e) {
}
public void image(){
for (int i = 0; i < ii.length; i++) {
for (int j = 0; j < ii.length; j++) {
ImageIcon imageIcon = new ImageIcon(path+(jj[i][j])+".jpg");
JLabel jLabel = new JLabel(imageIcon);
//设置JLabel的位置
jLabel.setBounds(j * 105 + 92, i * 105 + 134, 105, 105);
jLabel.setBorder(new BevelBorder(0));//对斜角边框的设置
//把容器添加到页面
this.getContentPane().add(jLabel);
}
}
ImageIcon backGround = new ImageIcon("..\\July\\image\\background.png");
JLabel jLabel = new JLabel(backGround);
jLabel.setBounds(40, 40, 508, 560);
this.getContentPane().add(jLabel);
this.getContentPane().repaint();
}//按照jj数组去打印图片
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==81){
this.getContentPane().removeAll();
ImageIcon imageIcon = new ImageIcon(path+"all.jpg");
JLabel jLabel = new JLabel(imageIcon);
//设置JLabel的位置
jLabel.setBounds(83, 134, 420, 420);
jLabel.setBorder(new BevelBorder(0));
//把容器添加到页面
this.getContentPane().add(jLabel);
ImageIcon backGround = new ImageIcon("..\\July\\image\\background.png");
JLabel jLabel1 = new JLabel(backGround);
jLabel1.setBounds(40, 40, 508, 560);
this.getContentPane().add(jLabel1);
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
if(winOrNo()){
return;
}
int code = e.getKeyCode();
if(code==37 || code==65){
if(y>0){
jj[x][y]=jj[x][y-1];
jj[x][y-1]=0;
y--;
step++;
initImage();
}else return;
}else if(code==38 || code==87){
if(x>0){
jj[x][y]=jj[x-1][y];
jj[x-1][y]=0;
x--;
step++;
initImage();
}else return;
}else if(code==39 || code==68){
if(y<3){
jj[x][y]=jj[x][y+1];
jj[x][y+1]=0;
y++;
step++;
initImage();
}else return;
}else if(code==40 || code==83){
if(x<3){
jj[x][y]=jj[x+1][y];
jj[x+1][y]=0;
x++;
step++;
initImage();
}else return;
}else if(code == 81) {
initImage();
}
else if(code==82) {
jj=new int [][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0},
};
winOrNo();
initImage();
}
}
public Boolean winOrNo(){
for (int i = 0; i < ii.length; i++) {
for (int j = 0; j < ii.length; j++) {
if (jj[i][j]!=ii[i][j]){
return false;
}
}
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
if(ob==replayItem){
initArray();
step=0;
initImage();
}if(ob==reLoginItem){
this.setVisible(false);
new LoginJFrame();
} else if (ob==closeItem) {
System.exit(0);
} else if (ob==accountItem) {
JDialog jDialog = new JDialog();
JLabel jLabel = new JLabel(new ImageIcon("F:\\holiday java code\\July\\image\\about.png"));
jDialog.getContentPane().add(jLabel);
jDialog.setSize(300,300);
jLabel.setBounds(0,0,258,258);
jDialog.setAlwaysOnTop(true);
jDialog.setLocationRelativeTo(null);
jDialog.setModal(true);
jDialog.setVisible(true);
} else if (ob==girlItem) {
Random g = new Random();
System.out.println(g.nextInt(12)+1);
path = "..\\July\\image\\girl\\girl"+(g.nextInt(12)+1)+"\\";
initArray();
step=0;
initImage();
} else if (ob==animalItem) {
Random a = new Random();
System.out.println(a.nextInt(7)+1);
path = "..\\July\\image\\animal\\animal"+(a.nextInt(7)+1)+"\\";
initArray();
step=0;
initImage();
} else if (ob==sportItem) {
Random s = new Random();
System.out.println(s.nextInt(9)+1);
path = "..\\July\\image\\sport\\sport"+(s.nextInt(9)+1)+"\\";
initArray();
step=0;
initImage();
}
}
}
在test类中直接调用
new GameJFrame();