Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 287|回复: 0

[Java基础知识]简单的推箱子游戏

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 09:27:24 | 显示全部楼层 |阅读模式
    以前总是很向往写游戏程序,但是从不知道写游戏其实也是一个很艰苦的过程。

           这次重写的推箱子,所实现的功能不多。仅仅实现了:玩家和箱子的正确移动,包括对撞墙的检测;当所有的箱子都到达目的地的时候,就提示“恭喜过关”;玩家可以用键盘的“上下左右”来控制前进的方向;整个代码的思路是:把游戏界面看成一个二维的数组,然后用一个布尔型的数组boolean a[][]去填充它。其中,玩家、箱子和墙为true,目的地为false。所有的界面元素都是个Node类的对象,当a[Node.x][Node.y]为true时,就代表玩家遇到了箱子或者是墙,然后再去实现相关的算法.。

    下面是代码:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.awt.geom.*;
      
       
       

         
       

         
       
      

    1. public class PushBox {
    2. public static void main(String args[]) {
    3.   GameFrame frame = new GameFrame();
    4.   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    5.   frame.show();
    6.   JOptionPane.showMessageDialog(null,
    7.     "红色方块代表玩家
    8. 把紫色箱子推到蓝框中过关
    9. 方向键控制方向
    10. 不能返回到上一步");
    11. }
    12. }
    13. class GameFrame extends JFrame {
    14. static int num;
    15. public GameFrame() {
    16.   setSize(400, 400);
    17.   Container c = getContentPane();
    18.   GamePanel panel1 = new GamePanel();
    19.   c.add(panel1);
    20. }
    21. }
    22. class GamePanel_2 extends JPanel {
    23. public GamePanel_2() {
    24.   this.setBackground(Color.BLACK);
    25. }
    26. }
    27. class GamePanel extends JPanel implements KeyListener {
    28. int width = 400;
    29. int height = 400;
    30. Box b;
    31. Node man;
    32. Node box;
    33. Node[] target;
    34. int d = 1;// 移动的步长
    35. int sideX = 25;
    36. int sideY = 25;
    37. GameFrame frame;
    38. ArrayList wallList;
    39. // 初始化界面元素
    40. public GamePanel() {
    41.   this.setBackground(Color.WHITE);
    42.   b = new Box(this, width / sideX, width / sideY);
    43.   this.man = b.man;
    44.   this.box = b.box;
    45.   this.target = b.target;
    46.   this.wallList = b.wallList;
    47.   this.setFocusable(true);
    48.   this.addKeyListener(this);
    49. }
    50. public void paintComponent(Graphics g) {
    51.   super.paintComponent(g);
    52.   Graphics2D g2 = (Graphics2D) g;
    53.   // 绘制游戏背景,玩家和箱子.
    54.   g2.setColor(Color.white);
    55.   g2.fillRect(0, 0, width, height);
    56.   g2.setColor(Color.RED);
    57.   draw(g2, man);
    58.   g2.setColor(Color.MAGENTA);
    59.   draw(g2, box);
    60.   draw(g2, b.box1);
    61.   draw(g2, b.box2);
    62.   draw(g2, b.box3);
    63.   // 绘制墙壁
    64.   g2.setColor(Color.darkGray);
    65.   for (int i = 0; i < wallList.size(); i++) {
    66.    Node n = (Node) wallList.get(i);
    67.    draw(g2, n);
    68.   }
    69.   // 绘制目的地.
    70.   g2.setColor(Color.blue);
    71.   for (int i = 0; i < target.length; i++) {
    72.    g2.drawRect(target[i].x * sideX, target[i].y * sideY, sideX - 1,
    73.      sideY - 1);
    74.    Ellipse2D e = new Ellipse2D.Double(target[i].x * sideX, target[i].y
    75.      * sideY, sideX - 1, sideY - 1);
    76.    g2.draw(e);
    77.   }
    78. }
    79. public void keyPressed(KeyEvent e) {
    80.   int keycode = e.getKeyCode();
    81.   if (keycode == KeyEvent.VK_UP) {
    82.    Box.direction = 1;// 要先确定方向再移动
    83.    b.move(0, -d);
    84.   } else if (keycode == KeyEvent.VK_RIGHT) {
    85.    Box.direction = 2;
    86.    b.move(d, 0);
    87.   } else if (keycode == KeyEvent.VK_DOWN) {
    88.    Box.direction = 3;
    89.    b.move(0, d);
    90.   } else if (keycode == KeyEvent.VK_LEFT) {
    91.    Box.direction = 4;
    92.    b.move(-d, 0);
    93.   }
    94. }
    95. public void keyReleased(KeyEvent e) {
    96. }
    97. public void keyTyped(KeyEvent e) {
    98. }
    99. public void draw(Graphics2D g, Node n) {
    100.   g.fillRect(n.x * sideX, n.y * sideY, sideX - 1, sideY - 1);
    101. }
    102. }
    103. class Node {
    104. int x;
    105. int y;
    106. public Node(int x, int y) {
    107.   this.x = x;
    108.   this.y = y;
    109. }
    110. }
    111. class Box {
    112. boolean end = false;
    113. int maxX;
    114. int maxY;
    115. boolean[][] a;// 整个游戏区域就是一个布尔型的二维数组
    116. Node man;
    117. Node[] target;// 储存目的地
    118. Node box;
    119. Node box1;
    120. Node box2;
    121. Node box3;
    122. Node[] wall;// 储存墙
    123. Node[] b;// 数组b储存箱子.
    124. GamePanel panel;
    125. // 当一个箱子推到目的时,list储存目的地节点.
    126. ArrayList list = new ArrayList();
    127. // 储存墙.
    128. ArrayList wallList = new ArrayList();
    129. public static int left = 4;
    130. public static int up = 1;
    131. public static int right = 2;
    132. public static int down = 3;
    133. public static int direction = 0;
    134. // 在BOX的构造函数中,用布尔型的二维数组填充游戏画面,同时,定义玩家,箱子和目的地。
    135. public Box(GamePanel p, int maxX, int maxY) {
    136.   panel = p;
    137.   this.maxX = maxX;
    138.   this.maxY = maxY;
    139.   a = new boolean[maxX][maxY];
    140.   for (int i = 0; i < maxX; i++) {
    141.    for (int j = 0; j < maxY; j++) {
    142.     a[i][j] = false;
    143.    }
    144.   }
    145.   // 定义箱子,玩家和目的地的初始位置
    146.   int x = 5;
    147.   int y = 8;
    148.   man = new Node(x, y);
    149.   a[x][y] = true;
    150.   // 定义游戏中的箱子的位置,并置为TRUE;
    151.   b = new Node[4];
    152.   box = new Node(10, 9);
    153.   a[10][9] = true;
    154.   b[0] = box;
    155.   box1 = new Node(6, 7);
    156.   a[6][7] = true;
    157.   b[1] = box1;
    158.   box2 = new Node(11, 8);
    159.   a[11][8] = true;
    160.   b[2] = box2;
    161.   box3 = new Node(8, 8);
    162.   a[8][8] = true;
    163.   b[3] = box3;
    164.   // 定义墙和目的地.
    165.   createWall();
    166.   target = new Node[4];
    167.   target[0] = new Node(7, 9);
    168.   target[3] = new Node(6, 9);
    169.   target[1] = new Node(7, 10);
    170.   target[2] = new Node(6, 10);
    171. }
    172. public void move(int d1, int d2) {
    173.   a[man.x][man.y] = false;
    174.   man.x += d1;
    175.   man.y += d2;
    176.   // 如果玩家遇到墙,则不能前进;否则,推动箱子.
    177.   if (a[man.x][man.y]) {
    178.    if (isOutofwall()) {
    179.     moveDisable(man, d1, d2);
    180.    } else {
    181.     for (int i = 0; i < b.length; i++) {
    182.      if (man.x == b[i].x && man.y == b[i].y) {
    183.       b[i].x += d1;
    184.       b[i].y += d2;
    185.       // 利用一个IF判断箱子是否重叠,如果重叠,则不能前进;
    186.       if (a[b[i].x][b[i].y]) {
    187.        moveDisable(man, d1, d2);
    188.        moveDisable(b[i], d1, d2);
    189.       } else {
    190.        // 一定要将箱子的位置置为true,不然箱子移动一次以后就不再移动.
    191.        a[b[i].x][b[i].y] = true;
    192.        // 如果箱子全部推到位,则游戏结束
    193.        // 在这个程序里,isArrive方法要在箱子置为true以后使用.
    194.        isArrive(b[i]);
    195.       }
    196.      }
    197.     }
    198.    }
    199.   }
    200.   panel.repaint();
    201.   if (end) {
    202.    JOptionPane.showMessageDialog(null, "over");
    203.    System.exit(0);
    204.   }
    205. }
    206. // 生成游戏地图
    207. public void createWall() {
    208.   for (int i = 5; i < 12; i++) {
    209.    Node walls = new Node(i, 5);
    210.    wallList.add(walls);
    211.   }
    212.   for (int i = 11; i < 14; i++) {
    213.    Node walls = new Node(i, 6);
    214.    wallList.add(walls);
    215.   }
    216.   wallList.add(new Node(13, 7));
    217.   wallList.add(new Node(13, 8));
    218.   wallList.add(new Node(13, 9));
    219.   wallList.add(new Node(12, 9));
    220.   wallList.add(new Node(12, 10));
    221.   for (int i = 12; i > 4; i--) {
    222.    Node walls = new Node(i, 11);
    223.    wallList.add(walls);
    224.   }
    225.   wallList.add(new Node(5, 10));
    226.   wallList.add(new Node(4, 10));
    227.   wallList.add(new Node(4, 9));
    228.   wallList.add(new Node(4, 8));
    229.   wallList.add(new Node(4, 8));
    230.   wallList.add(new Node(4, 7));
    231.   wallList.add(new Node(5, 7));
    232.   wallList.add(new Node(5, 6));
    233.   wallList.add(new Node(7, 7));
    234.   wallList.add(new Node(8, 7));
    235.   wallList.add(new Node(9, 7));
    236.   wallList.add(new Node(8, 9));
    237.   wallList.add(new Node(8, 10));
    238.   // 将墙壁的对象置为true
    239.   for (int i = 0; i < wallList.size(); i++) {
    240.    Node n = (Node) wallList.get(i);
    241.    a[n.x][n.y] = true;
    242.   }
    243. }
    244. // 当撞到墙时,玩家不能前进
    245. public void moveDisable(Node n, int d1, int d2) {
    246.   switch (direction) {
    247.   case 4:
    248.    n.x -= d1;
    249.    break;
    250.   case 1:
    251.    n.y -= d2;
    252.    break;
    253.   case 2:
    254.    n.x -= d1;
    255.    break;
    256.   case 3:
    257.    n.y -= d2;
    258.    break;
    259.   }
    260. }
    261. // 判断玩家是否越过边界
    262. public boolean isOutofwall() {
    263.   for (int i = 0; i < wallList.size(); i++) {
    264.    Node n = (Node) wallList.get(i);
    265.    if (man.x == n.x && man.y == n.y) {
    266.     return true;
    267.    }
    268.   }
    269.   return false;
    270. }
    271. // 如果所有的箱子到位,则游戏结束
    272. public void isArrive(Node n) {
    273.   for (int i = 0; i < target.length; i++) {
    274.    if ((target[i].x == n.x && target[i].y == n.y)) {
    275.     list.add(target[i]);
    276.    } else if (target[i].x == man.x && target[i].y == man.y) {
    277.     list.remove(target[i]);
    278.    }
    279.   }
    280.   if (list.size() == target.length) {
    281.    end = true;
    282.   }
    283. }
    284. }
    285.                   
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/2/092723500.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 21:53 , Processed in 0.493222 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表