推箱子程序制作说明文档

更新时间:2024-06-18 01:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

推箱子Swing版

难度 技术重点 代码量 初级 Swing、键盘事件 150行左右

西安尚学堂网址: 项目咨询热线:

http://www.xasxt.com 82300161,82300162

0 基本知识点

0.1 Swing中的基本控件

本项目中会分别使用JFrame、JPanel、JLabel、JOptionPane四种控件,含义如下:

JFrame:代表窗体对象,Windows操作系统中的一个窗体都可以看做一个JFrame对象。JFrame常见的操作有设置标题(setTitle)、设置窗口大小(setBounds)、设置是否显示(setVisible)等。

JPanel:即面板,面板中可以包含各种Swing控件。JPanel常见的操作有设置背景色(setBackground)、添加控件(add)、设置布局(setLayout)等。

JLabel:即标签,可以用来显示文字或图片。JLabel常见的操作有设置图片(setIcon)、设置位置(setBounds)等。

JOptionPane:通常使用JOptionPane的showMessageDialog方法弹出对话框。

0.2 Swing中坐标的概念

Swing中以左上角为原点坐标,通过x、y坐标及宽度、高度,可以确定物体的位置和大小(bound),Swing中正是使用控件的setBounds(x, y, width, height)方法来确定控件位置的,如下图所示:

0.3 判断物体是否超出边界

通过判断物体的x、y坐标是否小于0就可以知道物体是否出了左边界和上边界,但判断物体是否超过

右边界和下边界则需要加上物体自身的宽度或高度,如下图所示:

1 准备步骤 1.1 复制资源文件

在资源管理器中输入服务器的共享文件夹地址:“\\\\192.168.1.14\\study”,将文件夹“图片资源”复制

到本地。

1.2 创建eclipse工程

在桌面找到eclipse 3.2图标,双击运行。eclipse启动后在文件菜单中选择“新建”——“项

目”,如下图所示:

在弹出的窗体中选择“Java项目”,然后点击“下一步”按钮,如下图所示:

输入项目的名称“推箱子”,然后点击“完成”按钮,如下图所示:

1.3 拷贝图片

在资源管理器中复制推箱子需要的7张图片,在“推箱子”工程上点击右键,选择“粘贴”,复制后的效

果如下图所示:

1.4 创建Java类

在“推箱子”工程上点击右键,选择“新建”——“类”,如下图所示:

在弹出的窗口中输入类的名称“GameFrame”,并选中“public static void main(String[] args)”,

如下图所示:

2 编码实现工人与围墙 2.1 创建窗体

import javax.swing.JFrame; public class GameFrameextends JFrame { public GameFrame() { this.setBounds(200, 60, 535, 650); this.setVisible(true); } public static void main(String[] args) { new GameFrame(); } } 输入如下粗体代码创建窗体:

要点:可以使用快捷键“Ctrl + 1”快速引包。

在代码编辑窗体点右键,选择“运行方式”——“Java应用程序”运行程序,如下图所示:

2.2 完善窗体

import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Color; public class GameFrame extends JFrame { JPanel panel = new JPanel(); public GameFrame() { this.setTitle(\欢迎大家推箱子\this.setBounds(200, 60, 535, 650); this.setContentPane(panel); 输入如下粗体代码完善窗体:

} panel.setLayout(null); panel.setBackground(Color.black); this.setVisible(true); } public static void main(String[] args) { new GameFrame(); } 2.3 加入工人

输入如下粗体代码加入工人: import javax.swing.JFrame; import java.awt.Color; import javax.swing.JPanel; import javax.swing.ImageIcon; import javax.swing.JLabel; public class GameFrame extends JFrame { JPanel panel = new JPanel(); JLabel worker = new JLabel(new ImageIcon(\ public GameFrame() { } this.setTitle(\欢迎大家推箱子\ this.setBounds(200, 60, 535, 650); this.setContentPane(panel); panel.setLayout(null); panel.setBackground(Color.black); panel.add(worker); worker.setBounds(240, 240, 48, 48); this.setVisible(true); } public static void main(String[] args) { new GameFrame(); } 2.4 监听键盘事件

输入如下粗体代码监听键盘事件: import javax.swing.JFrame; import java.awt.Color; import javax.swing.JPanel; import javax.swing.ImageIcon; import javax.swing.JLabel; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class GameFrame extends JFrame { JPanel panel = new JPanel(); JLabel worker = new JLabel(new ImageIcon(\ public GameFrame() { this.setTitle(\欢迎大家推箱子\this.setBounds(200, 60, 535, 650); this.setContentPane(panel); panel.setLayout(null); panel.setBackground(Color.black); panel.add(worker); worker.setBounds(240, 240, 48, 48); this.setVisible(true); //监听键盘事件 this.addKeyListener(new KeyListener() { //键盘按下事件 public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { }}); } public static void main(String[] args) {

} } new GameFrame(); 要点:可以使用快捷键“Alt + /”快速生成代码。

2.5 使工人可以移动

intxSpeed = 0, ySpeed = 0; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : xSpeed = -SPEED; worker.setIcon(new ImageIcon(\ break; case KeyEvent.VK_RIGHT : xSpeed = SPEED; worker.setIcon(new ImageIcon(\ break; case KeyEvent.VK_UP : ySpeed = -SPEED; worker.setIcon(new ImageIcon(\ break; case KeyEvent.VK_DOWN : ySpeed = SPEED; worker.setIcon(new ImageIcon(\ break; default: return; } worker.setBounds(worker.getX() + xSpeed, worker.getY() + ySpeed, worker.getWidth(), worker.getHeight());

要点:需要在类中定义常量SPEED,如public static final int SPEED = 12; 在keyPressed方法中输入如下代码使工人可以移动:

2.6 加入围墙

在类中加入围墙位置数组与墙壁控件数组:

int[] pos = new int[]{0,0, 1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,0, 9,0, 10,0, 0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9, 0,10, 0,11, 0,12, 1,12, 2,12, 3,12, 4,12, 5,12, 6,12, 7,12, 8,12, 9,12, 10,12, 10,1, 10,2, 10,3, 10,4, 10,5, 10,6, 10,7, 10,8, 10,9, 10,10, 10,11, 10,12, 1,3, 2,3, 3,3, 4,3, 5,3, 6,3, 5,8, 6,8, 7,8, 8,8, 9,8, 10,8 ,11,8 }; JLabel[] walls = new JLabel[pos.length/2]; for (int i = 0; i

2.7 判断工人是否撞到墙壁

for (int i = 0; i

3 编码实现工人推箱子 3.1 加入箱子与胜利标志

JLabel box = new JLabel(new ImageIcon(\JLabel goal = new JLabel(new ImageIcon(\

在构造函数中加入两个控件: 在类中加入箱子控件与胜利标志控件:

panel.add(box); panel.add(goal); 3.2 使工人可以推动箱子

if (worker.getBounds().intersects(box.getBounds())) { box.setBounds(box.getX() + xSpeed, box.getY() box.getWidth(), box.getHeight()); } + ySpeed, 在步骤2.7的代码后继续输入如下代码使工人可以推动箱子:

3.3判断箱子是否撞到墙壁

for (int i = 0; i

3.4 判断是否胜利

if (box.getX()==goal.getX() &&box.getY()==goal.getY()) { } JOptionPane.showMessageDialog(null, \您赢啦!\在步骤3.3的语句后继续输入如下代码判断是否胜利:

4 完整代码

importjavax.swing.JFrame; importjava.awt.Color; importjava.awt.event.KeyEvent; importjava.awt.event.KeyListener; importjavax.swing.JOptionPane; importjavax.swing.JPanel; importjavax.swing.ImageIcon; importjavax.swing.JLabel; publicclassGameFrameextendsJFrame { JPanel panel = newJPanel(); //[2.3] 加入工人 JLabel worker = newJLabel(newImageIcon(\publicstaticfinalintSPEED = 12; //[2.6] 加入围墙 int[] pos = newint[]{0,0, 1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,0, 9,0, 10,0, 0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9, 0,10, 0,11, 0,12, 1,12, 2,12, 3,12, 4,12, 5,12, 6,12, 7,12, 8,12, 9,12, 10,12, 10,1, 10,2, 10,3, 10,4, 10,5, 10,6, 10,7, 10,8, 10,9, 10,10, 10,11, 10,12, 1,3, 2,3, 3,3, 4,3, 5,3, 6,3, 5,8, 6,8, 7,8, 8,8, 9,8, 10,8 ,11,8 }; JLabel[] walls = newJLabel[pos.length/2]; //[3.1] 加入箱子与胜利标志 JLabel box = newJLabel(newImageIcon(\JLabel goal = newJLabel(newImageIcon(\publicGameFrame() { //[2.2] 完善窗体 this.setTitle(\欢迎大家推箱子\this.setBounds(200, 60, 535, 650); this.setContentPane(panel); panel.setLayout(null); panel.setBackground(Color.black); //[2.3] 加入工人 panel.add(worker); worker.setBounds(240, 240, 48, 48); //[2.6] 加入围墙 for (int i = 0; i

worker.setBounds(worker.getX() + xSpeed, worker.getY() + ySpeed, worker.getWidth(), worker.getHeight()); //[2.7] 判断工人是否撞到墙壁 for (int i = 0; i

学而时习之,不亦乐乎。请回忆本项目的开发思路、技术点,进行总结。有总结才有提高喔! 开发思路总结: 关键技术点总结: 其他收获:

本文来源:https://www.bwwdw.com/article/fxn3.html

Top