1. Описание требований
1. Функциональные требования
На этапе анализа функциональных требований наша основная задача состоит в том, чтобы указать, какие услуги должны предоставить систему, определить, какие функции выполняют программное обеспечение, и предоставить их этим людям. Функциональные требования являются основным требованием разработки программного обеспечения и незаменимой части анализа спроса. Tank War - классическая игра. Эта игра выучила некоторый опыт предшественников. В целом, игра разделена на обе стороны врага и нас. Танки, которые в основном участвуют в битве, контролируются игроками. Вражеские танки могут появляться разумно и случайным образом на экране и перемещаться, запустив определенное количество пуль; Игроки могут перемещать танки по желанию в указанной области. Когда пуля попадает в игрока, игрок умирает, а игра заканчивается; Вражеские танки бегают разумно. Поскольку им необходимо иметь определенную степень интеллекта, они появляются случайным образом на экране и свободно вращаются, например: знание рулевого управления, когда они сталкиваются с границей; Запускаются пули: танки контролируются игроками и пожарными пулями в соответствии с различными позициями танка. Если они достигнут цели, будет создан эффект взрыва; Это также исчезнет на экране.
2. Требования к производительности системы
Требования к конфигурации производительности игры, основанные на компьютерных системах, должны гарантировать, что программа может работать быстро и стабильно и может своевременно реагировать при запуске. Когда танк игрока уничтожен в игре, быстро заявила о неудаче игры и своевременно отвечает, чтобы удовлетворить требования к правилам игры. Кроме того, также необходимо убедиться, что размер главного окна не может быть изменен по желанию при игре, обеспечивая игровую способность.
3. Функциональные решения
Коэффициент использования кода очень хорош в игре. В конце концов, это работа в реальном времени. Каждую миллисекунду будет много пуль, и координатное движение многих танков. Я сравнил количество пуль, попавших в резервуар бесчисленное количество раз, и события мониторинга клавиатуры, реализуя интерфейс потока и перераспределение рисования и освежающие; Чувство логики должно быть сильным, а объектно-ориентированный дисплей полностью отображается; Даже отношения между ними неясны, и легко иметь неожиданные ситуации; Чтобы сделать добавление красоты и добавить взрыв в игре, требуется, чтобы, когда вражеский танк умирает, короткая и быстрая карусель фиксированных мест на внешней панели для достижения эффекта взрыва;
В целом, основные функции, которые должны быть выполнены в танковых битвах, включают в себя: графический интерфейс, различия в стилях танков с врагом, танки могут выстрелить пули, чтобы атаковать противника, но не могут атаковать товарищей по команде, а танки устанавливают определенные точки здоровья;
2. Анализ основных функций
В процессе разработки игры в танк -войнах основные функции предоставляются пользователям для использования, поэтому сначала вам нужно нарисовать танк.
1. Нарисуйте бак игрока: вам нужно установить краску () на панели JPanel и нарисовать приблизительную форму резервуара кистью;
2. Танки игроков могут двигаться: если танк движется, им необходимо изменить координаты резервуара и постоянно перекрасить панель. Однако, когда баки перемещаются, интерфейс механизма мониторинга событий (мониторинг клавиатуры) может быть реализован в классе панели. Когда игрок нажимает клавишу W/D/S/A, он может двигаться вверх, вниз, влево и вправо;
3. И нарисуйте вражеские танки на моей рисовой бумажной краске (); Поскольку вражеские танки и танки игроков находятся на одном и том же интерфейсе, их нужно нарисовать на одной чертежной доске;
4. Танки игроков могут выстрелить пули: если игрок хочет запустить пули, им необходимо иметь источник событий. Когда пользователь нажимает клавишу J, мониторинг событий немедленно выпустит пулю, но его необходимо отобразить перед глазами пользователя, чтобы увидеть эффект, поэтому Paint () рисует пулю на панели; Поскольку пуля запущена и постоянно движется к запуску, координаты пули должны постоянно меняться, а скорость пули должна быть уместной, поэтому ее необходимо реализовать с потоками, а панель постоянно перерисована, чтобы увидеть эффект;
5. Игроки могут выстрелить пули подряд и запустить до пяти: если игрок хочет контролировать количество пуль, ему нужно выяснить, является ли количество выживающих в настоящее время пуль меньше 5, когда игрок нажимает к клавишу J. Когда условия будут выполнены, будет создана одна пуля. Когда игрок запускает более пяти пуль, функция пожара системы больше не будет вызвана; Поскольку запуск пуль не только выпускает одну пулю, установите набор пуль, чтобы генерировать одну пулю за раз, чтобы узнать, что пули умирают, когда они попадают в границу и умирают;
6. Когда танк игрока поражает вражеский танк, он исчезает и создает эффект взрыва; Во -первых, необходимо определить, попадает ли пуля танка игрока по врагу, поэтому есть функция, чтобы постоянно судить врага. Когда пуля бежит на вражеском танке, жизнь танка должна закончиться, и вкратце сгенерируется бомба, а в Paint () нарисована бомба ();
7. Врагский танк может двигаться разумно: если танк может двигаться только, он должен случайным образом генерировать направление движения. Из -за постоянного движения метод записывается в функцию прогона потока, а поток контролируется для сна для достижения проблемы скорости движения;
8. Вражеские танки могут выстрелить пули: притягивая врага, устанавливайте определенную спятую в нити, чтобы генерировать пули разных направлений и разного количества танков, вынуть каждую пулю на панель и нарисовать;
9. Когда вражеская пуля поражает игрока, игрок исчезает: продолжайте вынимать каждую пулю врага и сравнивая ее с танком игрока. Когда пуля касается игрока, взрыв игрока исчезает;
3. Сводка дизайна
• Настройки атрибута роли
Танк: место, где генерируется бак, цвет различных типов резервуаров, жизненный идентификатор резервуара, скорость движения бака и резервуары в разных направлениях;
Танк игрок: после наследства основных атрибутов танка, он реализуется на основе второй основы, а танк игрок свободно движется вверх и вниз и влево и вправо; И игровой бак обладает функцией стрельбы и стрельбы пуль;
Вражеский танк: после наследства основных атрибутов танка необходимо реализовать интеллектуальное движение вражеского танка, и в то же время он также должен запустить пули на резервуарах с разных позиций;
Пули: пули должны иметь координатную позицию, скорость, здоровье и пуль должны быть в состоянии двигаться, а пули также должны реализовать метод функции смерти;
Бомба: координаты бомбы, жизни и метода эффекта постепенно исчезающей жизни;
• Функциональные настройки свойства
Рисование бумаги: Paint () должна нарисовать танк игрока, вражеский танк и продемонстрировать эффект взрыва смертного танка;
Мониторинг событий: когда пользователь нажимает WDSA, соответствующий резервуар для игрока должен изменить направление. Когда пользователь стреляет J, в направлении запуска появляется пуля, и он должен работать до смерти, если только она не попадет в врага;
Ударьте в танк: когда пуля попадает в вражеский танк, взрыв генерируется и добавляется к набору взрыва, а информация о взрыве нарисована на поверхности;
Враги поразили игрока: выньте так называемых врагов в игре, и пули каждого врага соответствуют моему танке, чтобы определить, ударить ли его;
Игроки поражают врага: выньте каждую пулю игрока, сопоставьте каждый вражеский танк, чтобы определить, ударить ли его; и поместите суждения, связанные с попаданием в танку в Thread Run (), чтобы сделать непрерывные параллельные суждения;
Специфическая диаграмма функционального анализа заключается в следующем:
• Диаграмма анализа атрибутов танка
Диаграмма анализа функциональной чертежей
Танк Xmind Общая схема анализа
Атрибут символа танка xmind диаграмма
Атрибуты функции бака xmind диаграмма
IV Реализация системы
• Члены. Ява
//Members.javapackage mytank9; import java.util.*; Class Bomb {// определить координаты бомбы int x, y; // Жизнь бомбы - int life = 9; Boolean Islive = true; Public Bomb (int x, int y) {this.x = x; this.y = y; } // Уменьшение здоровья public void lizeDown () {if (life> 0) {life--; } else {this.islive = false; }}} класс выстрел реализует runnable {int x; int y; Int Direct; int speed = 1; Boolean Islive = true; public Shot (int x, int y, int direct) {this.x = x; this.y = y; this.direct = direct; } public void run () {while (true) {try {thread.sleep (50); } catch (Exception e) {e.printstackTrace (); } switch (direct) {case 0: y- = speed; перерыв; Случай 1: x+= скорость; перерыв; Случай 2: y+= скорость; перерыв; Случай 3: x- = скорость; перерыв; } // Определите, попадает ли поле по краю if (x <0 || x> 400 || y <0 || y> 300) {this.islive = false; перерыв; }}}} класс Танк {// Танк горизонтальная координата int x = 0; // g Вертикальная координата int y = 0; // направление бака // 0 указывает верхний, 1 указывает на правый, 2 указывает на нижний, 3 указывает на левый int direct = 0; // Скорость резервуара int speed = 1; // color int int color; Boolean Islive = true; public int getColor () {return Color; } public void setColor (int color) {color = color; } public int getSpeed () {return Speed; } public void setSpeed (int speed) {this.speed = speed; } public int getDirect () {return Direct; } public void setDirect (int direct) {this.Direct = direct; } public Tank (int x, int y) {this.x = x; this.y = y; } public int getx () {return x; } public void setx (int x) {this.x = x; } public int gety () {return y; } public void sety (int y) {this.y = y; }} // Класс вражеского танка врага Экспендирует Танк Осуществления, запускаемые {int times = 0; // Определить вектор, который может хранить вражеские пули вектор <SOM -SHS = новый вектор <SOM -SHOT> (); // Враг добавляет пули после танка, а противник только что был создан, и вражеский танк погиб Public EneryTank (int X, Int Y) {Super (x, y); } @Override public void run () {// todo Автогенерированный метод заглушка (true) {switch (this.direct) {case 0: // указывает, что танк движется для (int i = 0; i <30; i ++) {// вражеский танк движется в моем диапазоне, если (y> 0) {y- = speed; } try {thread.sleep (50); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } } перерыв; Случай 1: для (int i = 0; i <30; i ++) {if (x <400) {x+= speed; } try {thread.sleep (50); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } } перерыв; Случай 2: для (int i = 0; i <30; i ++) {if (y <300) {y+= speed; } try {thread.sleep (50); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } } перерыв; Случай 3: для (int i = 0; i <30; i ++) {if (x> 0) {x- = speed; } try {thread.sleep (50); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } } перерыв; } // Определите, нужно ли вам добавить новую пулю в танк this.Times ++; if (times%2 == 0) {if (islive) {if (ss.size () <5) {shot s = null; Switch (Direct) {case 0: // Создать пулю s = новый выстрел (x+10, y, 0); // Добавить пулю в вектор ss.add (ы); перерыв; Случай 1: S = новый выстрел (x+30, y+10, 1); ss.add (ы); перерыв; Случай 2: S = новый выстрел (x+10, y+30, 2); ss.add (ы); перерыв; Случай 3: S = новый выстрел (x, y+10, 3); ss.add (ы); перерыв; } // запустить поток потока пули t = новый поток (ы); t.start (); }}} // Пусть резервуар случайным образом генерирует новое направление this.direct = (int) (math.random ()*4); // Проверьте, умирает ли вражеский танк, если (это. }}}} // мой герой класса танка расширяет танк {vector <shot> s = новый вектор <shot> (); Выстрел s = null; public Hero (int x, int y) {super (x, y); } // Fire public void shotenemy () {switch (this.direct) {case 0: // Создать пулю s = новый выстрел (x+10, y, 0); // Добавить пулю в вектор ss.add (s); перерыв; Случай 1: S = новый выстрел (x+30, y+10, 1); ss.add (ы); перерыв; Случай 2: S = новый выстрел (x+10, y+30, 2); ss.add (ы); перерыв; Случай 3: S = новый выстрел (x, y+10, 3); ss.add (ы); перерыв; } Поток t = новый поток (ы); t.start (); } // Танк перемещается вверх по void moveup () {y- = speed; } // Tank moverert () {x+= speed; } public void Movelown () {y+= speed; } public void moveleft () {x- = speed; }} • mytankgame4.java
//Mytankgame4.java/* * Функция: Tank Game 2.0 * 1: Нарисуйте танк * 2: Мой танк может двигаться вверх и вниз * 3: Нарисуйте вражеский танк * 4: мой танк может стрелять пули * 5: Пули могут запускать (до пяти последовательных снимков) * 6: Когда мой танк поражает вражеский танк, враг исчезает, когда я исчезет, когда это будет подумать: «Взрыв *». Сначала приготовьте три картины; java.awt.event.*; импортировать java.io.file; импорт java.util Mytankgame4 () {mp = new MyPanel (); t.start (); this.add (mp); // зарегистрироваться, чтобы прослушать это. это. setize (400, 300); this.setDefaultCloseoPeration (jframe.exit_on_close); this.setvisible (true); }} Класс MyPanel Extens JPanel реализует KeyListener, Runnable {// определить a My Tank Hero = null; // Определить вектор танка противника <egineTank> ets = new Vector <egineTank> (); // определить набор бомб. Переключение трех изображений для формирования изображения бомбы 1 = NULL; Изображение Image2 = NULL; Изображение Image3 = null; // Создание public mypanel () {hero = new Hero (100,100); // Инициализация вражеского танка для (int i = 0; i <anpisize; i ++) {// Создать вражеский танк объект EnegyTank et = new EngeNTANK ((i+1)*50, 0); et.setcolor (0); et.setDirect (2); // запустить вражеский резервуар TACK T = новый поток (ET); T.Start (); // договориться о пуле с выстрелом против врага S = новый выстрел (et.x+10, et.y+30,2); et.ss.add (ы); Потока T2 = новый поток (ы); t2.start (); // присоединиться к ets.add (et); } try {image1 = imageio.read (новый файл ("bomb_1.gif")); image2 = imageio.read (новый файл ("Bomb_2.gif")); Image3 = imageio.read (новый файл ("Bomb_3.gif")); } catch (Exception e) {e.printstackTrace (); } // Инициализация трех изображений // Image1 = toolkit.getDefaulttoolkit (). GetiMage (panel.class.getResource ("/bomb_1.gif")); // Image2 = toolkit.getDefaulttoolkit ()./// image3 =////c Toolkit.getdefaulttoolkit (). GetiMage (panel.class.getresource ("/bomb_3.gif")); } // перекрасить public void Paint (Graphics G) {super.paint (g); G.FillRect (0, 0, 400, 300); // Нарисуйте свой собственный танк if (hero.islive == true) {this.drawtank (hero.getx (), hero.gety (), g, this.hero.direct, 1); } // Удалите каждую пулю из SS и нарисуйте для (int i = 0; i <hero.ss.size (); i ++) {// Уберите пули, снятые myshot = hero.ss.get (i); // Нарисуйте пулю и нарисуйте одну пулю. Как нарисовать несколько пуль? Traversal if (myshot! = null && myshot.islive == true) {g.draw3drect (myshot.x, myshot.y, 1, 1, false); } if (myshot.islive == false) {// Удалить пулю из SS Vector Hero.ss.remove (myshot); }} // Нарисуйте бомбу для (int i = 0; i <bombs.size (); i ++) {bomb b = bombs.get (i); if (b.life> 6) {g.drawimage (image1, bx, by, 30,30, это); } else if (b.life> 4) {g.drawimage (image2, bx, by, 30,30, это); } else {g.drawimage (image3, bx, by, 30,30, это); } // Уменьшить значение здоровья B b.lifedown (); // Если значение здоровья бомбы == 0, выбивайте его, если (b.life == 0) {bombs.remove (b); }} // Нарисуйте вражеский танк для (int i = 0; i <ets.size (); i ++) {angueTank et = ets.get (i); if (et.islive) {this.drawtank (et.getx (), et.gety (), g, et.getDirect (), 0); // Нарисуйте вражескую пулю для (int j = 0; j <et.ss.size (); j ++) {Shot agenshot = et.ss.get (j); if (egineshot.islive) {g.draw3drect (engeshot.x, engeshot.y, 1, 1, false); } else {// вражеский танк умер et.ss.remove (enegeshot); }}}}}}}}} // Является ли вражеская пуля на меня публично void hitme () {// Удалить каждый вражеский танк для (int i = 0; i <this.ets.size (); i ++) {// Установите вражеский танк egintank et = ets.get (i); if (et.islive == true) {for (int j = 0; j <et.ss.size (); j ++) {// Установите пули с выстрелом uryshot = et.ss.get (j); if (engeshot.islive == true) {this.hittank (engeshot, hero); }}}}}}}}} // Является ли моя пуля в вражеском танке Public void hitenemytank () {// определить, достигается ли вражеский танк (int i = 0; i <hero.ss.size (); i ++) {Shot myshot = hero.ss.get (i); // определить, что пуль действительно, если myShot. Каждый танк и судья для (int j = 0; j <ets.size (); j ++) {angerTank et = ets.get (j); if (et.islive == true) {this.hittank (myshot, et); }}}}}}}}}}} //, чтобы написать функцию специально, чтобы определить, попадает ли пуля в танке Public void Hittank (Shot S, Tank et) {Switch (et.Direct) {// Если направление врага является верхним или нижним чеходом 0: Случай 2: if (sx> et.x && s.x <et.x+20 && s.y> et.y && s.y <et.y+30) {// Хит Смерть s.islive = false; // танк et.islive = false; // создать бомбу и положить ее в векторную бомбу B = новая бомба (et.x, et.y); Bombs.add (b); } Случай 1: Случай 3: if (sx> et.x && s.x <et.x+30 && s.y> et.y && s.y <et.y+20) {{// Хит Смерть S.Islive = false; // Танк враг et.islive = false; Бомба B = новая бомба (et.x, et.y); Bombs.add (b); }}}}}}} // Нарисуйте танк public void draittank (int x, int y, graphics g, int direct, int type) {// tack type switch (type) {case 0: g.setcolor (color.cyan); перерыв; Случай 1: g.setcolor (color.etellow); перерыв; } // Переключатель направления резервуара (Direct) {// up case 0: // Нарисуйте бак на левом g.fill3drect (x, y, 5, 30, false); // drawline (x+10, y+15, y+15, 5, 30, false); // нарисовать средний прямоугольник g.fill3drect (x+5, y+5, 10, 20, false); y+10, 10, 10); // Нарисуйте прямую линию g.drawline (x+10, y+15, x+10, y); перерыв; Случай 1: // справа // Нарисуйте верхний прямоугольник g.fill3drect (x, y, 30, 5, false); // Нарисуйте нижний прямоугольник g.fill3drect (x, y+15, 30, 5, false); // Нарисуйте нижний прямоугольник g.fill3drect (x, y+15, 30, 5, false);/////// clain (x+15, y, x, y+30, y+30; перерыв; Случай 2: // Нарисуйте бак ниже g.fill3drect (x+15, y+10, x+30, y+10); // Нарисуйте бак на правом g.fill3drect (x+15, y+10, x+30, y+10); // нарисуйте резервуар справа g.fill3drect (x+15, 5, 30, false); 10, 20, false); // Нарисуйте прямоугольник g.fill3drect (x+5, y+5, 10, 20, false); // drawline (x+10, y+10, 10, 10, 10); // Нарисуйте прямую линию G.drawline (x+10, y+15, x+10, y+30); перерыв; Случай 3: // влево // Нарисуйте верхний прямоугольник g.fill3drect (x, y, 30, 5, false); // нарисуйте нижний прямоугольник g.fill3drect (x, y+15, 30, 5, false); // Нарисуйте средний прямоугольник g.fill3drect (x+5, y+5, 20, 10, false);//нарисуйте круг g.filloval (x+5, y+5, 10, 10, false); Линия натяжения (x+15, y+10, x, y+10); перерыв; }} // Нажмите клавишу и обработайте ее. левый внизу D направо вверх. @Override public void keytyped (keyEvent e) {// todo автоматически генерируемый метод} @override public void keypressed (keyevent e) {// todo автоматически генерируемый метод. this.hero.moveup (); } else if (e.getKeyCode () == keyEvent.vk_d) {this.hero.setDirect (1); this.hero.moveright (); } else if (e.getKeyCode () == keyEvent.vk_s) {this.hero.setDirect (2); this.hero.modyown (); } else if (e.getKeyCode () == keyEvent.vk_a) {this.hero.setDirect (3); this.hero.moveleft (); } if (e.getKeyCode () == keyEvent.vk_j) {// определить, нажимает ли игрок j // Fire if (this.hero.ss.size () <= 4 && this.hero.islive == true) {this.hero.shotenemy (); }} // панель должна быть перекрашена this.repaint (); } @Override public void keyRELEDED (KeyEvent E) {// TODO Auto GENEREDETED STUB} public void run () {while (true) {try {thread.sleep (100); } catch (Exception e) {e.printstackTrace (); } this.hitenemytank (); // Функция определяет, поражает ли пуля противника мне это. Hitme (); this.repaint (); }}}5. Результаты теста
Желтый игрок, ударил игрока
Враги пожарные пули
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.