Advertisement
Guest User

Untitled

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