Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2016
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.48 KB | None | 0 0
  1. Создай классы Snake, Room, Mouse
  2.  
  3. Задание 1
  4. А теперь напишем игру "змейка".
  5. Для этого нам понадобятся:
  6. а) собственно сама змея (класс Snake)
  7. б) комната, в которой она будет ползать (класс Room)
  8. в) мыши, которых она будет есть (класс Mouse)
  9.  
  10. Задание 2
  11. А добавь-ка еще метод main в класс Room.
  12.  
  13. Задание 3
  14. Теперь самое интересное - как будет устроена змея.
  15. Что можно сказать о змее:
  16. а) По сути - змея это набор кусочков - клеточек. Но точно известно, что один из них - голова.
  17. б) У змеи есть направление движения.
  18.  
  19. Так что нам еще понадобятся классы:
  20. SnakeSection - кусочек змеи.
  21. SnakeDirection - класс (enum) будет описывать направление движения змеи.
  22.  
  23. Создай классы SnakeSection и SnakeDirection
  24.  
  25. Задание 4
  26. Отлично. Я еще добавил KeyboardObserver на будущее.
  27. Пригодится.
  28.  
  29. Начнем с самого простого - класса Mouse.
  30. Мышь не будет двигаться и у нее будут только координаты и все.
  31. Добавь две переменных к классу Mouse: x и y типа int.
  32. Добавь для них getter'ы и конструктор с двумя параметрами.
  33.  
  34. Задание 5
  35. Теперь доделаем SnakeDirection.
  36. а) Переделай его в enum: замени ключевое слово class на enum
  37. б) Добавь 4 значения UP, DOWN, LEFT, RIGHT
  38. Должно получиться примерно так:
  39. public enum SnakeDirection
  40. {
  41. UP,
  42. RIGHT,
  43. DOWN,
  44. LEFT
  45. }
  46.  
  47. Задание 6
  48. Теперь займемся классом SnakeSection.
  49. Он будет описывать один кусочек змеи.
  50.  
  51. А у каждого кусочка что есть?
  52. Правильно! Координаты.
  53. Добавь две переменных к классу SnakeSection: x и y типа int.
  54. Добавь для них getter'ы и конструктор с двумя параметрами.
  55.  
  56. Задание 7
  57. "Кусочки змеи" мы описали, теперь займемся самой змеей.
  58. У змеи должен быть список кусочков(SnakeSection) и голова.
  59. Пусть головой будет просто самый первый кусочек (с номером 0).
  60.  
  61. У змеи также есть направление движения - сторона, куда она движется по умолчанию.
  62. А еще есть состояние - жива змея или мертва.
  63. Игра заканчивается тогда, когда змея мертва.
  64. Надо:
  65. а) Добавить в класс Snake переменную sections типа ArrayList<SnakeSection>.
  66. б) Добавить переменную isAlive логического типа.
  67. в) Добавить переменную direction типа SnakeDirection.
  68. г) Для всех них добавить getter'ы, а для direction еще и setter.
  69. Примечание:
  70. Для булевских переменных геттер принято писать не как getValue(), а как isValue() - это улучшает читабельность кода.
  71.  
  72.  
  73. Задание 8
  74. Настала очередь конструктора класса Snake.
  75. Змея у нас будет поначалу состоять из одного кусочка - головы.
  76. А что для него требуется?
  77. Что необходимо передать в конструктор?
  78. Координаты змеи, конечно же.
  79.  
  80. Надо:
  81. а) Передать в конструктор координаты головы змеи (x и y)
  82. б) создать в нем первый "кусочек змеи" (голову) и добавить его в коллекцию sections.
  83. в) isAlive выставить в true
  84. г) не забудь в конструкторе инициализировать переменную sections. В null не много-то и добавишь!
  85. д) создать и реализовать метод int getX(). Метод должен вернуть координату Х головы змеи.
  86. е) создать и реализовать метод int getY(). Метод должен вернуть координату Y головы змеи.
  87. ё) еще добавить классу метод move()- он нам пригодится попозже.
  88.  
  89. Задание 9
  90. Еще остался самый главный класс - Room.
  91. Что нам нужно для его описания?
  92. Размеры комнаты (width и height) - раз.
  93. Змея - два
  94. Мышь - три.
  95.  
  96. Надо:
  97. а) создать в классе Room переменные width & height типа int.
  98. б) создать в классе Room переменную snake типа Snake.
  99. в) создать в классе Room переменную mouse типа Snake. Шучу. Типа Mouse, конечно же :)
  100. г) создать для них всех геттеры и сеттеры.
  101. д) создать конструктор. Конструктор должен принимать три параметра: width, height и ... snake!
  102.  
  103. Задание 10
  104. Займемся методом main.
  105. Для начала надо создать статическую переменную game типа Room. Доступ к переменной должен быть для всех классов.
  106. Затем в методе main:
  107. а) Создать змею - объект Snake
  108. б) Создать комнату - объект типа Room и передать в него ширину, высоту и змею.
  109. в) Установить змее direction равным SnakeDirection.DOWN
  110. Чего еще не хватает? Собственно метода, в котором будет идти вся игровая логика.
  111. И еще нужен метод, который бы отрисовывал все это на экране.
  112. а) создать метод run()
  113. б) создать метод print()
  114.  
  115. Задание 11
  116. Теперь логика управления мышью.
  117. С мышью у нас будут происходить две вещи.
  118. Первая - змея съест мышь.
  119. Вторая - появляется новая мышь в случайной точке комнаты.
  120.  
  121. Надо написать и реализовать метод createMouse() в классе Room.
  122. В этом методе мы просто должны создавать новую мышь со случайными координатами в комнате.
  123. Как получить случайные координаты?
  124. Это ты уже должен был знать. На всякий случай даю подсказку:
  125. int x = (int) (Math.random() * width);
  126.  
  127. Еще понадобится метод - eatMouse(), на случай, если мышь все-таки кто-то съест :)
  128. Пока сложной логики в этом методе не будет - просто будем вызывать метод createMouse и все.
  129.  
  130. Задание 12
  131. Добавить в метод main:
  132. в) вызов метода createMouse().
  133. Змея-то у нас есть, пусть и мышь будет
  134. г) вызов метода run().
  135. Без него ничего работать не будет. В нем вся основная логика.
  136. Неплохо получилось, но я все-таки внесу пару правок.
  137. Кстати, как насчет написать метод sleep?
  138. Ты уже понял из предыдущих задач, что в методе run нужна пауза.
  139. Но насколько я помню, скорость в змейке должна расти при росте ее длины.
  140. Значит чем длиннее змея, тем выше скорость и меньше пауза.
  141.  
  142. Задание 13
  143. Предлагаю тебе в этот раз написать специальный метод sleep().
  144. Который будет делать паузу в зависимости от длины змеи (количества элементов в sections).
  145. Придумай какой-нибудь хитрый алгоритм. Чтобы на первом уровне пауза была 500 миллисекунд,
  146. а к 10 уровню постепенно уменьшилась до 300.
  147. И ниже 200 не опускалась.
  148.  
  149. Задание 14
  150. Теперь поработаем над методом print().
  151. Надо:
  152. а) вывести на экран прямоугольник из точек размером width x height.
  153. б) тело змеи отметить символом "x"-английское
  154. в) голову змеи нарисовать символом X-английское.
  155. Подсказка:
  156. а) удобно сначала создать матрицу типа int[][] с размером (height x width)
  157. б) затем пройтись по всем объектам и отрисовать их в матрицу.
  158. Например, тело змеи - 1, голова змеи - 2, мышь - 3.
  159.  
  160. Задание 15
  161. Теперь осталось допилить змею.
  162. Вот что я предлагаю насчет движения змеи:
  163. Змея состоит из кусочков. Давай каждый ход просто добавлять один кусочек со стороны головы,
  164. а самый последний - удалять. Тогда получится, что змея ползет.
  165.  
  166. Добавлять кусочек нужно рядом с текущей головой (кусочком номер 0).
  167. С какой стороны добавлять зависит от direction (UP, DOWN, LEFT, RIGHT).
  168. Подсказка:
  169. а) Как добавить кусочек змеи в начало списка sections?
  170. sections.add(0, new_section);
  171. б) А как удалить последний?
  172. sections.remove(sections.size()-1);
  173.  
  174. В методе move надо:
  175. а) сделать шаг в текущем направлении (определяется direction)
  176. б) проверить, что если змея уперлась в стену, то умереть (isAlive = false)
  177. в) проверить, что если змея уперлась себя, то умереть (isAlive = false)
  178. г) проверить, если змея встретила мышь - то съесть ее.
  179.  
  180.  
  181. Задание 16
  182. Продолжаем работать над методом move()
  183. Для определения, не пересекается ли змея сама с собой, можно сделать очень простую проверку:
  184. содержит ли список sections "новую голову змеи".
  185. Код для этого будет выглядеть примерно так:
  186. if (sections.contains(head))
  187. При этом head должен быть еще не добавлен в список sections, иначе будет всегда true.
  188. Но чтобы этот код работал, надо реализовать методы сравнения объектов (equals & hashCode) в классе SnakeSection.
  189.  
  190. Задание:
  191. а) реализовать методы equals &amp; hashCode в классе SnakeSection.
  192.  
  193. Сигнатура методов:
  194. public boolean equals(Object o)
  195. public int hashCode()
  196.  
  197. Подсказка:
  198. Используй Alt+Insert в Intellij IDEA
  199. В классе Snake:
  200. б) в методе move(int dx, int dy) создать голову(кусочек змеи) с правильными координатами. Вызвать метод checkBody() и checkBorders()
  201. в) реализовать метод checkBody: если голова змеи пересекается с ее телом (любым из кусочков) - змея умирает (isAlive = false)
  202.  
  203. Задание 17
  204. Теперь закончим класс Shake
  205. Надо:
  206. а) реализовать метод checkBorders: если голова змеи за границами комнаты - змея умирает (isAlive = false)
  207.  
  208. Реализовать метод move(int dx, int dy):
  209. б) проверить, не вылезла ли она за границу комнаты (если да, то змея умирает)
  210. в) проверить, не совпадает ли она с уже существующими кусочками змеи (если да, то змея умирает)
  211. г) добавить голову к змее (со стороны головы) и удалить последний кусочек из хвоста.
  212. д) если змея поймала мышь (координаты головы совпадают с координатами мыши), то удалять кусок из хвоста не надо.
  213.  
  214.  
  215. Задание 18
  216. Отлично!
  217. Запускаем и наслаждаемся змейкой.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement