SnakeModel.java
上传用户:benlin99
上传日期:2022-05-02
资源大小:8k
文件大小:4k
源码类别:

其他游戏

开发平台:

Java

  1. import java.util.Arrays;
  2. import java.util.LinkedList;
  3. import java.util.Random;
  4. import javax.swing.JOptionPane;
  5. public class SnakeModel implements Runnable
  6. {
  7. Snake gs;
  8. boolean[][] matrix;//定义矩阵
  9. LinkedList nodeArray = new LinkedList();//list类的方法,用于动态添加数组元素,没有同步方法
  10. Node food;//食物
  11. int maxX;
  12. int maxY;
  13. int direction = 2;//起始方向为向上
  14. boolean running = false;
  15. int timeInterval = 300;//时间间隔
  16. double speedChangeRate = 0.5;
  17. boolean paused = false;
  18. int score = 0;
  19. int countMove = 0;
  20. public static final int UP = 2;
  21. public static final int DOWN = 4;
  22. public static final int LEFT = 1;
  23. public static final int RIGHT = 3;
  24. public SnakeModel(Snake gs, int maxX, int maxY)//构造方法
  25. {
  26. this.gs = gs;
  27. this.maxX = maxX;
  28. this.maxY = maxY;
  29. // 初始化矩阵
  30. matrix = new boolean[maxX][];
  31. for (int i = 0; i < maxX; ++i)
  32. {
  33. matrix[i] = new boolean[maxY];
  34. Arrays.fill(matrix[i], false);//LinkedList的方法fill()用于填充
  35. }
  36. // 初始化蛇 
  37. int initArrayLength = maxX > 20 ? 10 : maxX / 2;//初始蛇的长度
  38. for (int i = 0; i < initArrayLength; ++i)
  39. {
  40. int x = maxX / 2 + i;
  41. int y = maxY / 2;//初始蛇的位置
  42. nodeArray.addLast(new Node(x, y));//LinkedList的优势在于在中间位置插入和删除操作,速度是最快的
  43. matrix[x][y] = true;
  44. }
  45. food = createFood();
  46. matrix[food.x][food.y] = true;
  47. }
  48. public void changeDirection(int newDirection)
  49. {
  50. if (direction % 2 != newDirection % 2)
  51. {
  52. direction = newDirection;
  53. }
  54. }
  55. public boolean moveOn()
  56. {
  57. Node n = (Node)nodeArray.getFirst();
  58. int x = n.x;
  59. int y = n.y;
  60. switch (direction)
  61. {
  62. case UP:
  63. y--;
  64. break;
  65. case DOWN:
  66. y++;
  67. break;
  68. case LEFT:
  69. x--;
  70. break;
  71. case RIGHT:
  72. x++;
  73. break;
  74. }
  75. if ((0 <= x && x < maxX) && (0 <= y && y < maxY))
  76. {          //蛇不能碰到外壁
  77. if (matrix[x][y])
  78. {
  79. if (x == food.x && y == food.y)
  80. {
  81. nodeArray.addFirst(food);  //食物入栈         
  82. int scoreGet = (10000 - 200 * countMove) / timeInterval;//加分原则:移动速度越快,移动步数越少,加的分越多;
  83. score += scoreGet > 0 ? scoreGet : 10;
  84. countMove = 0;
  85. food = createFood();
  86. matrix[food.x][food.y] = true;
  87. return true;
  88. }
  89. else
  90. return false;
  91. }
  92. else
  93. {                               //蛇移动,相应的矩阵元素入栈出栈
  94. nodeArray.addFirst(new Node(x, y));//入栈元素设为可见
  95. matrix[x][y] = true;
  96. n = (Node)nodeArray.removeLast();//出栈元素设为不可见
  97. matrix[n.x][n.y] = false;
  98. countMove++;                     //记录移动步数
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. public void run()
  105. {
  106. running = true;
  107. while (running)
  108. {
  109. try
  110. {
  111. Thread.sleep(timeInterval);//优先级高的线程可用run()方法中的sleep方法休眠一段时间
  112. }                            //线程在休眠时被打断,会抛出异常,必须使用try-catch语句
  113. catch (Exception e)
  114. {
  115. break;
  116. }
  117. if (!paused)
  118. {
  119. if (moveOn())
  120. {
  121. gs.repaint();
  122. }
  123. else
  124. {
  125. int n = JOptionPane.showConfirmDialog(
  126. null,
  127. "不好意思啊,你输了,点确定再来一局吧!",
  128. "游戏结束",
  129. JOptionPane.YES_NO_OPTION);
  130. if (n == JOptionPane.YES_OPTION)
  131. {
  132. running = false;
  133. gs.begin();
  134. }
  135. break;
  136. }
  137. }
  138. }
  139. running = false;
  140. }
  141. private Node createFood()
  142. {
  143. int x = 0;
  144. int y = 0;
  145. do
  146. {
  147. Random r = new Random();
  148. x = r.nextInt(maxX);
  149. y = r.nextInt(maxY);
  150. } while (matrix[x][y]);
  151. return new Node(x, y);
  152. }
  153. public void speedUp()
  154. {
  155. timeInterval *= speedChangeRate;
  156. }
  157. public void speedDown()
  158. {
  159. timeInterval /= speedChangeRate;
  160. }
  161. public void changePauseState()
  162. {
  163. paused = !paused;
  164. }
  165. }