在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java swing 小游戏 贪吃蛇

2016-12-20 13:15| 发布者: zhangjf| 查看: 549| 评论: 0

摘要: 本人做了些修改 修正如下: 1、修正了按键与行进方向相反而死的bug 2、修正了连续按键可以加速的bug GreedySnake.java package com.fred.test; import java.awt.event.K ...
本人做了些修改
修正如下:
1、修正了按键与行进方向相反而死的bug
2、修正了连续按键可以加速的bug

GreedySnake.java
  1. package com.fred.test;
  2. import java.awt.event.KeyListener;
  3. import java.awt.event.KeyEvent;
  4. import java.awt.Graphics;
  5. import java.awt.Point;
  6. import java.awt.Color;
  7. import java.util.Random;
  8. import java.util.List;
  9. import java.util.LinkedList;
  10. import javax.swing.JPanel;
  11. import javax.swing.JFrame;
  12. class Food{
  13. Snake snake;
  14. int x,y;
  15. boolean flag;
  16. Food(Snake snake){
  17. this.snake = snake;
  18. flag = true;
  19. int x = 0;
  20. int y = 0;
  21. while(flag){
  22. flag = false;
  23. x = Math.abs(new Random().nextInt()%40);
  24. y = Math.abs(new Random().nextInt()%40);
  25. if(snake.head.x==x && snake.head.y==y) flag = true;
  26. for(Point it:snake.body) if(it.x==x && it.y==y) flag = true;
  27. }
  28. this.x = x;
  29. this.y = y;
  30. }
  31. }
  32. class Snake{
  33. int size,length,dir;
  34. List<Point> body;
  35. Point head;
  36. Snake(Point head){
  37. size = 10;
  38. length = 5;dir = 4;
  39. this.head = head;
  40. body = new LinkedList<Point>();
  41. for(int i=0;i<length-1;i++){
  42. Point p = new Point(head.x,head.y+1+i);
  43. body.add(p);
  44. }
  45. }
  46. boolean isEat(Food food){
  47. if(head.x==food.x && head.y==food.y) return true;
  48. return false;
  49. }
  50. boolean isOut(){
  51. if(head.x<0 || head.y<0 || head.x>=40 || head.y>=40)
  52. return true;
  53. return false;
  54. }
  55. boolean isPitch(){
  56. for(Point it:body)
  57. if(head.x==it.x && head.y==it.y){
  58. dead(1);
  59. return true;
  60. }
  61. return false;
  62. }
  63. void dead(int way){
  64. System.exit(way);
  65. }
  66. }
  67. class MyPanel extends JPanel implements KeyListener,Runnable{
  68. Snake snake;
  69. Food food;
  70. int speed;
  71. MyPanel(Snake snake,Food food){
  72. this.snake = snake;
  73. this.food = food;
  74. speed = 526;
  75. }
  76. public void paint(Graphics g){
  77. super.paint(g);
  78. g.fillRect(0,0,400,400);
  79. g.setColor(Color.YELLOW);
  80. g.fillRect(snake.head.x*snake.size,snake.head.y*snake.size,snake.size,snake.size);
  81. g.setColor(Color.ORANGE);
  82. for(Point it:snake.body) g.fillRect(it.x*snake.size,it.y*snake.size,snake.size,snake.size);
  83. g.setColor(Color.GREEN);
  84. g.fillRect(food.x*snake.size,food.y*snake.size,snake.size,snake.size);
  85. }
  86. //自动行进
  87. public void keyPressed(Integer dir){
  88. Point oxy = new Point(snake.head);
  89. if(dir==3){
  90. snake.head.x--;
  91. }
  92. else if(dir==4){
  93. snake.head.x++;
  94. }
  95. else if(dir==1){
  96. snake.head.y--;
  97. }
  98. else if(dir==2){
  99. snake.head.y++;
  100. }else return;
  101. if(snake.isOut()) snake.dead(1);
  102. snake.body.add(0,oxy);
  103. if(snake.isEat(food)){
  104. snake.length++;
  105. if(speed >= 50) speed-=25;
  106. food = new Food(snake);
  107. }else snake.body.remove(snake.length-1);
  108. if(snake.isPitch()) snake.dead(2);
  109. repaint();
  110. }
  111. //按键仅用于修改蛇的方向
  112. public void keyPressed(KeyEvent e){
  113. int key = e.getKeyCode();
  114. //按鍵和行進方向相反,按鍵無效直接返回!
  115. if(((key==KeyEvent.VK_LEFT && snake.dir==4)||(key==KeyEvent.VK_UP && snake.dir==2)
  116. ||(key==KeyEvent.VK_DOWN && snake.dir==1)||(key==KeyEvent.VK_RIGHT && snake.dir==3))){
  117. return;
  118. }
  119. if(key == KeyEvent.VK_LEFT){
  120. snake.dir = 3;
  121. }
  122. else if(key == KeyEvent.VK_RIGHT){
  123. snake.dir = 4;
  124. }
  125. else if(key == KeyEvent.VK_UP){
  126. snake.dir = 1;
  127. }
  128. else if(key == KeyEvent.VK_DOWN){
  129. snake.dir = 2;
  130. }else return;
  131. }
  132. public void keyReleased(KeyEvent e){}
  133. public void keyTyped(KeyEvent e){}
  134. public synchronized void run(){
  135. while(true){
  136. try{Thread.sleep(speed);
  137. }catch(Exception e){}
  138. keyPressed(snake.dir);
  139. }
  140. }
  141. }
  142. public class GreedySnake extends JFrame{
  143. MyPanel mp;
  144. Snake snake;
  145. Food food;
  146. Thread t;
  147. public GreedySnake(){
  148. snake = new Snake(new Point(5,5));
  149. food = new Food(snake);
  150. mp = new MyPanel(snake,food);
  151. t = new Thread(mp);
  152. t.start();
  153. add(mp);
  154. addKeyListener(mp);
  155. setTitle("GreedySnake");
  156. setSize(40*10 + 15,40*10 + 38);
  157. setLocation(200,200);
  158. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  159. setVisible(true);
  160. }
  161. public static void main(String[] args){
  162. new GreedySnake();
  163. }
  164. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 07:53

Copyright 2015-2025 djqfx

返回顶部