В этой статье рекомендуется классическая мини -игра, внедренная Java: Snake, я считаю, что все сыграли ее, как ее достичь?
Изображение воспроизведения:
Без лишних слов просто представьте код:
1
открытый класс GreedSnake {public static void main (string [] args) {snakemodel model = new Snakemodel (20,30); SnakeControl Control = New SnakeControl (модель); Snakeview view = new Snakeview (Model, Control); // Добавить наблюдателя и пусть представление станет наблюдателем модели модели. Addobserver (View); (новый поток (модель)). start (); }}2
Пакет mvctest; // snakecontrol.javaimport java.awt.event.keyevent; import java.awt.event.keylistener; открытый класс SnakeControl реализует KeyListener {SnakeModel Model; public snakecontrol (модель Snakemodel) {this.model = model; } public void keypressed (KeyEvent e) {int keyCode = e.getKeyCode (); if (model.running) {// обработанный переключатель ключей (KeyCode) {case keyEvent.vk_up: model.changedRection (snakemodel.up); перерыв; case keyevent.vk_down: model.changedirection (snakemodel.down); перерыв; case keyevent.vk_left: model.changedirection (snakemodel.left); перерыв; case keyevent.vk_right: model.changedirection (snakemodel.right); перерыв; case keyevent.vk_add: case keyevent.vk_page_up: model.speedup (); перерыв; case keyevent.vk_subtract: case keyevent.vk_page_down: model.speeddown (); перерыв; case keyevent.vk_space: case keyevent.vk_p: model.changepausestate (); перерыв; по умолчанию:}} // Ключ обрабатывается в любом случае, и ключ приводит к перезагрузке игры if (keycode == keyevent.vk_r || keycode == keyevent.vk_s || keycode == keyevent.vk_enter) {model.reset (); }} public void keyrealeed (keyevent e) {} public void keytyped (keyEvent e) {}}3
Пакет mvctest; // snakemodel.javaimport javax.swing.*; import java.util.arrays; import java.util.linkedlist; импорт java.util.observable; импорт java.util.observable; импорт java.util.random; class snakemodel extends extends extendseable rrupmentable rableinable; // Укажите, есть ли змеиное тело или пищу в положении LinkedList nodearray = new LinkedList (); // змеиная узловая пища; int maxx; int maxy; int direction = 2; // Направление бега змеи Broalean Running = false; // запустить состояние int timeInterval = 200; // интервал времени, миллисекунд двойной скоростной чай = 0,75; // каждый раз, когда скорость изменения скорости логии паузы = false; // пауза флаг int score = 0; // Оценка int countmove = 0; // количество раз, когда вы переезжаете, прежде чем есть еда // вверх и вниз, должно быть ровным // вправо и влево должно быть нечетным статическим финалом int int = 2; Public Static Final int Down = 4; Общественный статический окончательный окончательный int left = 1; Public Static Final int right = 3; public snakemodel (int maxx, int maxy) {this.maxx = maxx; this.maxy = maxy; перезагрузить(); } public void reset () {direction = snakemodel.up; // Направление времени выполнения змеи interval = 200; // интервал времени, миллисекунд пауза = false; // пауза Flag Score = 0; // Оценка countmove = 0; // количество раз перед едой // начальный matirx, все ясно 0 matrix = new Boolean [maxx] []; for (int i = 0; i <maxx; ++ i) {matrix [i] = new Boolean [maxy]; Arrays.fill (Matrix [i], false); } // начальная змея // Начальная корпус змеи, если существует более 20 горизонтальных положений, длина составляет 10, в противном случае это половина горизонтального положения int initarraylength = maxx> 20? 10: maxx / 2; nodearray.clear (); for (int i = 0; i <initarraylength; ++ i) {int x = maxx / 2 +i; // maxx инициализируется до 20 int y = maxy / 2; //maxY is initialized to 30 //nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15] //The default running direction is up, so at the beginning of the game nodeArray becomes: // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15] nodearray.addlast (новый узел (x, y)); Матрица [x] [y] = true; } // Создать продукт питания = createFood (); Матрица [food.x] [food.y] = true; } public void madesIrection (int newDirection) {// Измененное направление не может быть в одном направлении или обратно в исходное направление, если (направление % 2! = NewDirection % 2) {направление = newDirection; }} public boolean moveon () {node n = (node) nodearray.getfirst (); int x = nx; int y = ny; // Увеличение и уменьшение значения координаты в соответствии с переключателем направления (направление) {case up: y--; перерыв; Case Down: y ++; перерыв; Случай остался: x--; перерыв; Случай правильно: x ++; перерыв; } // Если новая координата попадает в действительный диапазон, процесс if ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrix [x] [y]) {// Если что -то есть в точке новой координаты (тело змеи или еда), если (x == food. nodearray.addfirst (еда); // Предоставление длины от головки змеи // Правило оценки связано с числом и скоростью движения изменяет направление int spactget = (10000 - 200 * countmove)/ timeInterval; Оценка += счет> 0? Спроминка: 10; countmove = 0; еда = createfood (); // Создать новую продовольственную матрицу [food.x] [food.y] = true; // Установите местоположение пищи, возвращайте True; } else // съесть само тело змеи, не удастся вернуть ложь; } else {// Если в новой координате нет ничего в новой координате (корпус змеи), переместите Nodearray. Матрица [x] [y] = true; n = (узел) nodearray.removelast (); Матрица [nx] [ny] = false; Countmove ++; вернуть истину; }} вернуть false; // касайтесь края, Fail} public void run () {running = true; while (running) {try {thread.sleep (timeInterval); } catch (Exception e) {break; } if (! pause) {if (moveon ()) {setchanged (); // модель уведомляет данные об просмотре, которые были обновлены notifyobservers (); } else {joptionpane.showmessageDialog (null, «вы не удалось», «Game Over», JoptionPane.information_message); перерыв; }}} running = false; } private node createfood () {int x = 0; int y = 0; // Случайно Получить позицию в допустимой области, которая не перекрывается с телом змеи и пищи do {случайный r = new Random (); x = r.nextint (maxx); y = r.nextint (maxy); } while (matrix [x] [y]); вернуть новый узел (x, y); } public void Speedup () {TimeInterval *= SpeedChanger; } public void speeddown () {timeInterval /= speedChanger; } public void changePaUseState () {paused =! Паузу; } public String toString () {String result = ""; for (int i = 0; i <nodearray.size (); ++ i) {node n = (node) nodearray.get (i); Результат + = "[" + nx + "," + ny + "]"; } return Result; }} класс Node {int x; int y; Node (int x, int y) {this.x = x; this.y = y; }}4
пакет mvctest; // snakeview.javaimport javax.swing.*; импорт java.awt.*; импорт java.util.iterator; import java.util.linkedlist; импорт java.util.observable; импорт java.util.observable; импорт. java.util.observer; открытый класс Snakeview реализует наблюдатель {snakecontrol control = null; SnakeModel Model = NULL; Jframe мэйнфрейм; Canvas Paintcanvas; Jlabel Labelscore; Public Static Final Canvaswidth = 200; Public Static Final Int Canvasheight = 300; Public Static Final Int Nodewidth = 10; Public Static Final int nodeheight = 10; Public Snakeview (модель Snakemodel, SnakeControl Control) {this.Model = model; this.control = control; MANICFRAME = new JFrame ("GreedSnake"); Контейнер CP = MANICFRAME.GETCONTENTPANE (); // Создать верхний счет Display Labelscore = new Jlabel ("Score:"); CP.Add (Labelscore, Borderlayout.north); // Создать среднюю область игры PaintCanvas = new Canvas (); Paintcanvas.setsize (Canvaswidth + 1, Canvasheight + 1); paintcanvas.addkeylistener (Control); CP.Add (PaintCanvas, Borderlayout.center); // Создать панель справки ниже JPanel Panelbuttom = new jPanel (); panelbuttom.setlayout (new borderlayout ()); Jlabel labelhelp; labelhelp = new jlabel ("pageup, pagedown для скорости;", jlabel.center); panelbuttom.add (labelhelp, borderlayout.north); labelhelp = new jlabel ("enter или r или s для начала;", jlabel.center); panelbuttom.add (labelhelp, borderlayout.center); labelHelp = new jlabel ("Space или P для паузы", jlabel.center); panelbuttom.add (labelhelp, borderlayout.south); CP.Add (Panelbuttom, Borderlayout.South); manaframe.addkeylistener (Control); manaframe.pack (); Manaframe.SetReSizable (false); MANEFRAME.SetDefaultCloseoPeration (jframe.exit_on_close); manaframe.setvisible (true); } void repaint () {graphics g = paintcanvas.getgraphics (); // рисовать фон g.setcolor (color.white); G.FillRect (0, 0, Canvaswidth, Canvasheight); // нарисовать змею g.setcolor (color.black); LinkedList na = model.nodearray; Итератор IT = na.iterator (); while (it.hasnext ()) {node n = (node) it.next (); натягивать (g, n); } // Нарисуйте еду g.setcolor (color.red); Узел n = model.food; натягивать (g, n); UpdateScore (); } private void DrawNode (Graphics G, Node N) {g.fillRect (nx * nodewidth, ny * nodeheight, nodewidth - 1, nodeheight - 1); } public void updatesCore () {string s = "оценка:" + model.score; labelscore.settext (s); } public void update (наблюдаемая o, объект arg) {repaint (); }}Цель этой статьи состоит в том, чтобы взять вас на то, чтобы вспомнить классику, но более важная цель - помочь вам хорошо изучить Java -программирование.