推箱子-电信081-陈剑-3080432008.doc_第1页
推箱子-电信081-陈剑-3080432008.doc_第2页
推箱子-电信081-陈剑-3080432008.doc_第3页
推箱子-电信081-陈剑-3080432008.doc_第4页
推箱子-电信081-陈剑-3080432008.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

推箱子实验报告1、实验目的运用Java有关知识更进一步掌握编程方法;了解一些小游戏的相关代码,2、设计思路 在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。玩家和箱子的正确移动,包括对撞墙的检测;当所有的箱子都到达目的地的时候,就提示“恭喜过关”;家可以用键盘的“上下左右”来控制前进的方向;整个代码的思路是:把游戏界面看成一个二维的数组,然后用一个布尔型的数组boolean a去填充它。3、设计方法 / 初始化界面元素 public GamePanel()加入提示菜单public static void main(String args) GameFrame frame = new GameFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); JOptionPane.showMessageDialog(null, 红色方块代表玩家n把紫色箱子推到蓝框中过关n方向键控制方向n不能返回到上一步); 要给方块绘制游戏背景,玩家和箱子.,绘制墙壁,绘制目的地.,/ 定义箱子,玩家和目的地的初始位置 int x = 5; int y = 8; man = new Node(x, y); axy = true; / 定义游戏中的箱子的位置,并置为TRUE; b = new Node4; box = new Node(10, 9); a109 = true; b0 = box; box1 = new Node(6, 7); a67 = true; b1 = box1; box2 = new Node(11, 8); a118 = true; b2 = box2; box3 = new Node(8, 8); a88 = true; b3 = box3; / 定义墙和目的地. createWall(); target = new Node4; target0 = new Node(7, 9); target1 = new Node(6, 9); target2 = new Node(7, 10); target3 = new Node(6, 10); public void move(int d1, int d2) aman.xman.y = false; man.x += d1; man.y += d2;/ 如果所有的箱子到位,则游戏结束 public void isArrive(Node n) for (int i = 0; i target.length; i+) if (targeti.x = n.x & targeti.y = n.y) list.add(targeti); else if (targeti.x = man.x & targeti.y = man.y) list.remove(targeti); if (list.size() = target.length) end = true; 4、流程图游戏开始提示 游戏结束游戏过程5、实验过程 实验开始箱子撞墙游戏过关6、相关代码import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.awt.geom.*;public class PushBox public static void main(String args) GameFrame frame = new GameFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); JOptionPane.showMessageDialog(null, 红色方块代表玩家n把紫色箱子推到蓝框中过关n方向键控制方向n不能返回到上一步); class GameFrame extends JFrame static int num; public GameFrame() setSize(400, 400); Container c = getContentPane(); GamePanel panel1 = new GamePanel(); c.add(panel1); class GamePanel_2 extends JPanel public GamePanel_2() this.setBackground(Color.BLACK); class GamePanel extends JPanel implements KeyListener int width = 400; int height = 400; Box b; Node man; Node box; Node target; int d = 1;/ 移动的步长 int sideX = 25; int sideY = 25; GameFrame frame; ArrayList wallList; / 初始化界面元素 public GamePanel() this.setBackground(Color.WHITE); b = new Box(this, width / sideX, width / sideY); this.man = b.man; this.box = b.box; this.target = b.target; this.wallList = b.wallList; this.setFocusable(true); this.addKeyListener(this); public void paintComponent(Graphics g) super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; / 绘制游戏背景,玩家和箱子. g2.setColor(Color.white); g2.fillRect(0, 0, width, height); g2.setColor(Color.RED); draw(g2, man); g2.setColor(Color.MAGENTA); draw(g2, box); draw(g2, b.box1); draw(g2, b.box2); draw(g2, b.box3); / 绘制墙壁 g2.setColor(Color.darkGray); for (int i = 0; i wallList.size(); i+) Node n = (Node) wallList.get(i); draw(g2, n); / 绘制目的地. g2.setColor(Color.blue); for (int i = 0; i target.length; i+) g2.drawRect(targeti.x * sideX, targeti.y * sideY, sideX - 1, sideY - 1); Ellipse2D e = new Ellipse2D.Double(targeti.x * sideX, targeti.y * sideY, sideX - 1, sideY - 1); g2.draw(e); public void keyPressed(KeyEvent e) int keycode = e.getKeyCode(); if (keycode = KeyEvent.VK_UP) Box.direction = 1;/ 要先确定方向再移动 b.move(0, -d); else if (keycode = KeyEvent.VK_RIGHT) Box.direction = 2; b.move(d, 0); else if (keycode = KeyEvent.VK_DOWN) Box.direction = 3; b.move(0, d); else if (keycode = KeyEvent.VK_LEFT) Box.direction = 4; b.move(-d, 0); public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) public void draw(Graphics2D g, Node n) g.fillRect(n.x * sideX, n.y * sideY, sideX - 1, sideY - 1); class Node int x; int y; public Node(int x, int y) this.x = x; this.y = y; class Box boolean end = false; static int count = 0; int maxX; int maxY; boolean a; Node man; Node target; Node box; Node box1; Node box2; Node box3; Node wall; Node b; GamePanel panel; / 当一个箱子推到目的时,list储存目的地节点. ArrayList list = new ArrayList(); / 储存墙. ArrayList wallList = new ArrayList(); public static int left = 4; public static int up = 1; public static int right = 2; public static int down = 3; public static int direction = 0; / 在BOX的构造函数中,用布尔型的二维数组填充游戏画面,同时,定义玩家,箱子和目的地。 public Box(GamePanel p, int maxX, int maxY) panel = p; this.maxX = maxX; this.maxY = maxY; a = new booleanmaxXmaxY; for (int i = 0; i maxX; i+) for (int j = 0; j maxY; j+) aij = false; / 定义箱子,玩家和目的地的初始位置 int x = 5; int y = 8; man = new Node(x, y); axy = true; / 定义游戏中的箱子的位置,并置为TRUE; b = new Node4; box = new Node(10, 9); a109 = true; b0 = box; box1 = new Node(6, 7); a67 = true; b1 = box1; box2 = new Node(11, 8); a118 = true; b2 = box2; box3 = new Node(8, 8); a88 = true; b3 = box3; / 定义墙和目的地. createWall(); target = new Node4; target0 = new Node(7, 9); target1 = new Node(6, 9); target2 = new Node(7, 10); target3 = new Node(6, 10); public void move(int d1, int d2) aman.xman.y = false; man.x += d1; man.y += d2; / 如果玩家遇到墙,则不能前进;否则,推动箱子. if (aman.xman.y) if (isOutofwall() moveDisable(man, d1, d2); else for (int i = 0; i b.length; i+) if (man.x = bi.x & man.y = bi.y) bi.x += d1; bi.y += d2; / 如果箱子全部推到位,则游戏结束 isArrive(bi); / 利用一个IF判断箱子是否重叠,如果重叠,则不能前进; if (abi.xbi.y) moveDisable(bi, man, d1, d2); else / 一定要将箱子的位置置为true,不然箱子移动一次以后就不再移动. abi.xbi.y = true; panel.repaint(); if (end) JOptionPane.showMessageDialog(null, 恭喜过关); System.exit(0); / 生成游戏地图 public void createWall() for (int i = 5; i 12; i+) Node walls = new Node(i, 5); wallList.add(walls); for (int i = 11; i 4; i-) Node walls = new Node(i, 11); wallList.add(walls); wallList.add(new Node(5, 10); wallList.add(new Node(4, 10); wallList.add(new Node(4, 9); wallList.add(new Node(4, 8); wallList.add(new Node(4, 8); wallList.add(new Node(4, 7); wallList.add(new Node(5, 7); wallList.add(new Node(5, 6); wallList.add(new Node(7, 7); wallList.add(new Node(8, 7); wallList.add(new Node(9, 7); wallList.add(new Node(8, 9); wallList.add(new Node(8, 10); / 将墙壁的对象置为true for (int i = 0; i wallList.size(); i+) Node n = (Node) wallList.get(i); an.xn.y = true; / 当撞到墙时,玩家不能前进 public void moveDisable(Node n, int d1, int d2) switch (direction) case 4: n.x -= d1; break; case 1: n.y -= d2; break; case 2: n.x -= d1; break; case 3: n.y -= d2; break; / 用来使两个箱子不重叠 public void moveDisable(Node n1, Node n2,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论