您现在的位置是:首页 > 个人日记个人日记

贪吃蛇小游戏

2019-02-15 20:07:29【个人日记】998人已围观

简介通过简单的GUI实现小游戏,同时回顾知识,回味经典

这个小游戏无聊的时候消遣写的,同时回顾下GUI布局

用到知识有

  • 集合
  • 线程
  • Swing组件
  • 流程控制
  • 面向对象

下面附上代码
新建一个类Snack.java

  1. package work.huangxin;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import java.awt.Point;
  6. import java.awt.event.KeyAdapter;
  7. import java.awt.event.KeyEvent;
  8. import java.util.LinkedList;
  9. import java.util.Random;
  10. import javax.swing.JFrame;
  11. import javax.swing.JOptionPane;
  12. public class Snack extends JFrame {
  13. private static final long serialVersionUID = 1L;
  14. // 食物
  15. private Point point = new Point();
  16. // 蛇
  17. private LinkedList<Point> lists = new LinkedList<Point>();
  18. // 键
  19. private int key = 37;
  20. // 线程
  21. private Thread newThread = new Thread(new MoveThread());
  22. // 对蛇和食物初始化
  23. private void init() {
  24. point.setLocation(100, 100);
  25. lists.add(new Point(300, 300));
  26. lists.add(new Point(310, 300));
  27. lists.add(new Point(320, 300));
  28. lists.add(new Point(330, 300));
  29. lists.add(new Point(340, 300));
  30. lists.add(new Point(350, 300));
  31. lists.add(new Point(360, 300));
  32. newThread.start();
  33. }
  34. @Override
  35. public void paint(Graphics g) {
  36. Image img = createImage(500, 500);
  37. Graphics g2 = img.getGraphics();
  38. g2.setColor(Color.WHITE);// 白色面板
  39. g2.fillRect(0, 0, 500, 500);
  40. g2.translate(50, 50);
  41. g2.setColor(Color.RED);// 画红框
  42. g2.drawRect(0, 0, 400, 400);
  43. g2.setColor(Color.GREEN);// 画蛇
  44. for (Point point : lists) {
  45. g2.fillRect(point.x, point.y, 10, 10);// 遍历蛇
  46. }
  47. g2.setColor(Color.RED);
  48. g2.fillRect(point.x, point.y, 10, 10);// 填充食物
  49. g.drawImage(img, 0, 0, 500, 500, this);// 画出来
  50. }
  51. class MoveThread implements Runnable {
  52. private boolean isTrue = true;
  53. @Override
  54. public void run() {
  55. while (isTrue) {
  56. try {
  57. Thread.sleep(150);
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61. Point p = lists.getFirst().getLocation();
  62. switch (key) {
  63. case 37:
  64. p.x = p.x - 10;
  65. break;
  66. case 38:
  67. p.y = p.y - 10;
  68. break;
  69. case 39:
  70. p.x = p.x + 10;
  71. break;
  72. case 40:
  73. p.y = p.y + 10;
  74. break;
  75. default:
  76. p.x = p.x - 10;
  77. }
  78. // 判断蛇的坐标
  79. if (p.x < 0 || p.x > 390 || p.y < 0 || p.y > 390 || lists.contains(p)) {
  80. int res = JOptionPane.showConfirmDialog(null, "是否继续游戏", "游戏结束", JOptionPane.YES_NO_OPTION);
  81. if (res == JOptionPane.YES_OPTION) {// 选择继续游戏
  82. lists.clear();// 清空集合
  83. key = 37;
  84. point.setLocation(100, 100);
  85. lists.add(new Point(300, 300));
  86. lists.add(new Point(310, 300));
  87. lists.add(new Point(320, 300));
  88. lists.add(new Point(330, 300));
  89. lists.add(new Point(340, 300));
  90. lists.add(new Point(350, 300));
  91. lists.add(new Point(360, 300));
  92. continue;
  93. } else {
  94. System.exit(0);
  95. }
  96. }
  97. lists.addFirst(p);// 向第一个增加蛇头
  98. if (p.equals(point)) {
  99. int x;
  100. int y;
  101. while (true) {
  102. // 让食物以10单位增加
  103. x = new Random().nextInt(400);
  104. y = new Random().nextInt(400);
  105. if (x % 10 == 0 && y % 10 == 0) {
  106. break;
  107. }
  108. }
  109. point.setLocation(x, y);
  110. } else {
  111. lists.removeLast();// 移除最后一个
  112. }
  113. Snack.this.repaint();
  114. }
  115. }
  116. }
  117. public Snack() {
  118. // 当前对象
  119. this.setTitle("贪吃蛇");// 设置标题
  120. this.setResizable(false);// 设置窗体大小不可变
  121. this.setVisible(true);// 设置窗体可见
  122. this.setSize(500, 500);// 设置窗体大小
  123. this.setLocationRelativeTo(null);// 窗体居中
  124. this.addKeyListener(new KeyAdapter() {
  125. @Override
  126. public void keyPressed(KeyEvent e) {
  127. if (e.getKeyCode() > 36 && e.getKeyCode() < 41) {
  128. if (Math.abs(key - e.getKeyCode()) != 2) {
  129. key = e.getKeyCode();
  130. }
  131. }
  132. }
  133. });
  134. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭事件
  135. init();
  136. }
  137. public static void main(String[] args) {
  138. new Snack();
  139. }
  140. }

代码仅供参考,当然不足的地方很多,如果有什么想法可以在下面留言,游戏基本功能已经实现,可以在基础上增加小功能

Tags: Java基础  

评论区

    2024-10-03 18:53:28

    站长

    没有登录功能是为了方便大家留言,但留言接口现在被恶意攻击,将关闭留言接口,如有疑问,请联系我的QQ 1538933906/同微信

    2020-01-17 11:57:47

    秶歆

    我以为下面有效果展示的。。


文章评论



给自个选个头像吧!






站点信息

  • 建站时间:   2019-01-31
  • 网站程序:   Tomcat+nginx
  • 文章统计:   44篇文章
  • 标签管理:   标签云
  • 微信公众号:  扫描二维码,联系我