运行结果展示:
游戏玩法介绍:
通过键盘方向键位的上下左右来控制黑色块移动,使其以此排布为四行,依次首行为1,2,3,4。第二行为6,7,8,9。第三行为10,11,12,13.第四行为14,15,16,17。移动过程计步,实现排列后出现游戏成功界面提醒。
使用知识总结:
代码实现了一个拼图游戏的界面和逻辑。它运用了以下Java知识:
-
类和对象:代码中定义了一个名为MainFrame的类,继承自JFrame类,并实现了KeyListener接口。
-
GUI编程:使用了Swing库来创建窗体和界面组件,如JFrame、JLabel、JButton等。
-
事件处理:实现了KeyListener接口,并重写了keyPressed()方法来处理键盘按键事件。
-
二维数组:使用了二维数组来表示拼图的数据和胜利状态。
-
随机数生成:使用了Random类来生成随机数,用于初始化拼图的位置。
-
图片加载:使用了ImageIcon类来加载并显示图片。
-
布局管理:使用了null布局来手动设置界面组件的位置和大小。
-
方法调用和参数传递:通过调用方法来初始化数据、绘制界面、判断胜利、移动拼图块等。
总体来说,以上代码运用了面向对象编程、事件驱动编程、数组操作、随机数生成、图形界面编程等Java知识来实现拼图游戏的功能。值得刚学过Java相关知识的的小伙伴练一练。
代码展示:
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class MainFrame extends JFrame implements KeyListener {
int[][] data= {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
int[][] win= {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
int h;//0---行
int l;//0---列
int count;//计数
public MainFrame(){
// 窗体对象.addKeyListener(KeyListener实现类对象);
this.addKeyListener(this);
// 初始化窗体
initFrame();
// 初始化数据
initData();
// 绘制游戏界面
paintView();
//设置窗体可见
setVisible(true);
}
//数据初始化:随机
public void initData() {
Random r = new Random();
//遍历二维数组
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
int randomA = r.nextInt(4);
int randomB = r.nextInt(4);
int temp = data [i][j];
data[i][j] = data[randomA][randomB];
data[randomA][randomB] =temp;
}
}
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j]==0){
h = i;
l = j;
}
}
}
}
//窗体初始化
public void initFrame(){
setSize(514,595);//大小
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//默认关闭模式
setTitle("小游戏1.0");//设计标题
setAlwaysOnTop(true);//置顶最上层
setLocationRelativeTo(null);//居中
setLayout(null);//取消图片默认布局
}
//绘制界面
public void paintView(){
getContentPane().removeAll();//清空
if (vicyory()){
//加载胜利资源图
JLabel winLabel = new JLabel(new ImageIcon("D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\win.png"));
winLabel.setBounds(124,230,266,88);
getContentPane().add(winLabel);
}
//重新开始按钮
JButton btn = new JButton("重新游戏");
btn.setBounds(350,20,100,20);
getContentPane().add(btn);
btn.setFocusable(false);//取消按钮聚焦
btn.addActionListener(e -> {
count=0;
initData();
paintView();
});
//计数
JLabel scoreLabel = new JLabel("步数为:"+count);
scoreLabel.setBounds(50,20,100,20);
getContentPane().add(scoreLabel);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
JLabel image = new JLabel(new ImageIcon
("D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\"+data[i][j]+".png"
));
image.setBounds(50 + 100*j,90 + 100*i,100,100);
getContentPane().add(image);
}
}
JLabel background = new JLabel(new ImageIcon("\"D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\background.png"));
background.setBounds(26, 30, 450, 484);
getContentPane().add(background);
getContentPane().repaint();//刷新操作
}
//胜利判断
public boolean vicyory(){
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data.length; j++) {
if(data[i][j]!=win[i][j]){
return false;
}
}
}
return true;
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
move(keyCode);
paintView();//每次移动后重新绘制
}
//移动逻辑
private void move(int keyCode) {
if(vicyory()){
return;
}
if(keyCode == 37){
if(l==0){return;}
int temp = data[h][l];
data[h][l] = data[h][l-1];
data[h][l-1] = temp;
l--;//空白块坐标改变,列+1-----------"左移"
count++;
} else if (keyCode == 38) {
if(h==0){return;}
int temp = data[h][l];
data[h][l] = data[h-1][l];
data[h-1][l] = temp;
h--;//空白块坐标改变,列+1-----------"上移"
count++;
} else if (keyCode == 39) {
if(l==3){return;}
int temp = data[h][l];
data[h][l] = data[h][l+1];
data[h][l+1] = temp;
l++;//空白块坐标改变,列+1-----------"右移"
count++;
} else if (keyCode == 40) {
if(h==3){return;}
int temp = data[h][l];
data[h][l] = data[h+1][l];
data[h+1][l] = temp;
h++;//空白块坐标改变,列+1-----------"下移"
count++;
} else if (keyCode == 90) {
data= new int[][]{{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
}//开挂:Ctrl+Z
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
public class Test {
public static void main(String[] args) {
new MainFrame();
}
}
案例源码文件:
备注:这个小综合案例源于黑马在某站发布的Java学习视频,在此基础上完成。由于代码石阵号的图片比较多,另将完整项目打包。
链接:https://pan.baidu.com/s/1IT9QnctG3LOtjW5ZSs3uig?pwd=3kbo
提取码:3kbo