1. Anforderungen Beschreibung
1. Funktionsanforderungen
In der Phase der funktionalen Anforderungen an die Analyse der Analyse besteht unsere Hauptaufgabe darin, festzulegen, welche Dienste das System anbieten muss, welche Funktionen die Software erledigt, und sie diesen Personen zur Verfügung stellen. Funktionale Anforderungen sind eine grundlegende Anforderung für die Softwareentwicklung und ein unverzichtbarer Bestandteil der Nachfrageanalyse. Panzerkrieg ist ein klassisches Spiel. Dieses Spiel hat einige der Erfahrungen der Vorgänger gelernt. Insgesamt ist das Spiel in beide Seiten des Feindes und uns unterteilt. Die Panzer, die hauptsächlich an der Schlacht teilnehmen, werden von den Spielern kontrolliert. Die feindlichen Panzer können auf dem Bildschirm intelligent und zufällig erscheinen und sich bewegen, um eine bestimmte Anzahl von Kugeln zu starten. Spieler können in dem angegebenen Bereich Tanks bewegen. Wenn eine Kugel den Spieler trifft, stirbt der Spieler und das Spiel endet; Feindliche Panzer laufen intelligent. Da sie ein gewisses Maß an Intelligenz haben müssen, erscheinen sie zufällig auf dem Bildschirm und drehen sich frei, z. B.: die Lenkung zu kennen, wenn sie auf eine Grenze stoßen; Kugeln laufen: Die Tanks werden von Spielern und Feuerkugeln gemäß verschiedenen Panzerpositionen kontrolliert. Wenn sie das Ziel treffen, wird ein Explosionseffekt erzeugt. Es wird auch auf dem Bildschirm verschwinden.
2. Anforderungen an die Systemleistung
Die auf Computersysteme basierenden Leistungskonfigurationsanforderungen des Spiels sollen sicherstellen, dass das Programm schnell und stabil ausgeführt wird und beim Ausführen rechtzeitig reagieren kann. Wenn der Panzer des Spielers im Spiel zerstört wird, fordern Sie sofort Informationen über den Fehler des Spiels und reagieren rechtzeitig, um die Regelanforderungen des Spiels zu erfüllen. Darüber hinaus ist es auch erforderlich, sicherzustellen, dass die Größe des Hauptfensters beim Spielen des Spiels nicht nach Belieben geändert werden kann, um die Spielbarkeit zu gewährleisten.
3. Funktionslösungen
Die Code -Nutzungsrate ist im Spiel sehr gut. Schließlich ist es eine Echtzeitarbeit. In jeder Millisekunde werden viele Kugeln abgefeuert und die Koordinatenbewegung vieler Panzer. Ich habe die Anzahl der Kugeln verglichen, die unzählige Male auf den Tank getroffen haben, und die Tastaturüberwachungsereignisse, die Implementierung der Thread -Schnittstelle und das Zeichnen von Neutrauen und Erfrischung. Das Gefühl der Logik muss stark sein, und die objektorientierte Anzeige wird vollständig angezeigt. Sogar die Beziehung zwischen ihnen ist unklar und es ist leicht, unerwartete Situationen zu haben. Um die Schönheit und die Explosion in das Spiel zu verleihen, erfordert es, dass beim Sterben des feindlichen Panzers ein kurzes und schnelles Karussell fester Stellen auf der Außenpanel, um einen Explosionseffekt zu erzielen, einen Explosionseffekt erzielen.
Im Allgemeinen umfassen die grundlegenden Funktionen, die in Panzerschlachten ausgefüllt werden sollen,: Grafische Schnittstelle, Unterschiede in den Tankstilen mit Feind zu mir, Tanks können Kugeln abfeuern, um den Gegner anzugreifen, aber die Teamkollegen nicht anzugreifen, und Tanks setzen bestimmte Gesundheitspunkte.
2. Analyse der Hauptfunktionen
Bei der Entwicklung des Tankkriegsspiels werden den Benutzern die Hauptfunktionen zur Verfügung gestellt. Zuerst müssen Sie einen Panzer zeichnen.
1. Zeichnen Sie den Player -Tank: Sie müssen eine Farbe () auf die JPanel -Panel einstellen und die ungefähre Form des Tanks mit einer Bürste zeichnen.
2. Die Tanks der Spieler können sich bewegen: Wenn sich der Tank bewegt, müssen sie die Koordinaten des Panzers ändern und das Panel ständig neu streichen. Wenn sich die Tanks jedoch bewegen, kann die Ereignisüberwachungsmechanismus (Tastaturüberwachung) in der Panelklasse implementiert werden. Wenn der Spieler die W/D/S/A -Taste drückt, kann er sich nach oben, nach links und rechts bewegen.
3. und zeichnen Sie feindliche Panzer auf meine Zeichenpapierfarbe (); Da feindliche Tanks und Spielertanks auf derselben Schnittstelle liegen, müssen sie auf derselben Zeichenbrett gezogen werden.
4. Die Tanks der Spieler können Kugeln abfeuern: Wenn ein Spieler Kugeln feuern möchte, müssen er eine Ereignisquelle benötigen. Wenn der Benutzer die J -Taste drückt, wird die Ereignisüberwachung sofort eine Kugel abfeuern, muss jedoch vor den Augen des Benutzers angezeigt werden, um den Effekt zu erkennen, also zeichnet Malen () die Kugel auf das Panel. Da die Kugel gestartet wird und sich ständig in Richtung der Start bewegt, müssen die Koordinaten der Kugel ständig geändert werden, und die Kugelgeschwindigkeit muss angemessen sein, sodass sie mit Threads implementiert werden muss und das Panel ständig neu gezeichnet wird, um den Effekt zu erkennen.
5. Spieler können Kugeln in Folge abfeuern und bis zu fünf steuern: Wenn der Spieler die Anzahl der Kugeln steuern möchte, muss er herausfinden, ob die Anzahl der überlebenden Kugeln weniger als 5 beträgt, wenn der Spieler die J -Taste drückt. Wenn die Bedingungen erfüllt sind, wird eine Kugel erstellt. Wenn der Spieler mehr als fünf Kugeln abfeuert, wird die Feuerfunktion des Systems nicht mehr aufgerufen. Da das Starten von Kugeln nicht nur eine Kugel abfeuert, stellt sie eine Reihe von Kugeln auf, um jeweils eine Kugel zu erzeugen, um zu wissen, dass die Kugeln sterben, wenn sie die Grenze treffen und sterben.
6. Wenn der Panzer des Spielers den feindlichen Panzer trifft, verschwindet er und erzeugt einen Explosionseffekt. Erstens ist es notwendig zu bestimmen, ob die Kugel des Tanks des Spielers den Feind trifft, sodass es eine Funktion gibt, um den Feind ständig zu beurteilen. Wenn die Kugel auf dem feindlichen Panzer läuft, muss das Leben des Panzers enden und eine Bombe erzeugt und eine Bombe in Paint () gezogen wird;
7. Der Tank des Feindes kann sich intelligent bewegen: Wenn sich der Tank nur bewegen kann, muss er zufällig die Bewegungsrichtung erzeugen. Aufgrund der konstanten Bewegung wird die Methode in die Lauffunktion des Threads geschrieben und der Faden in den Schlaf gesteuert, um das Problem der Bewegungsgeschwindigkeit zu erreichen.
8. Feindtanks können Kugeln abfeuern: Stellen Sie beim Zeichnen des Feindes einen bestimmten Schläbchen in den Faden, um Kugeln mit unterschiedlichen Richtungen und unterschiedlichen Panzern zu erzeugen, und nehmen Sie jede Kugel auf das Panel heraus und zeichnen sie;
9. Wenn die feindliche Kugel den Spieler trifft, verschwindet der Spieler: Nehmen Sie immer jede Kugel des Feindes heraus und vergleichen Sie ihn mit dem Tank des Spielers. Wenn die Kugel den Spieler berührt, verschwindet die Explosion des Spielers.
3. Summary Design
• Rollenattributeinstellungen
Panzer: Der Ort, an dem der Tank erzeugt wird, die Farbe verschiedener Tanks, die Lebenskennung des Tanks, die Geschwindigkeit der Tankbewegung und Tanks in verschiedene Richtungen;
Spielertank: Nachdem er die grundlegenden Eigenschaften des Panzers erbte, wird er auf der Grundlage der zweiten Basis realisiert, und der Spielertank bewegt sich frei auf und ab und links und rechts. und der Player -Tank hat die Funktion, Kugeln zu schießen und zu schießen;
Feindtank: Nach der Erben der grundlegenden Tankmerkmale müssen die intelligente Bewegung des feindlichen Panzers erkennen.
Kugeln: Kugeln müssen eine Koordinatenposition, Geschwindigkeit, Gesundheit und Kugeln in der Lage sein, sich zu bewegen, und Kugeln müssen auch die Todesfunktionsmethode implementieren.
Bombe: Die Koordinaten der Bombe, des Lebens und der Effektmethodefunktion des allmählich verschwundenen Lebens;
• Funktionale Eigenschafteneinstellungen
Zeichenpapier: Paint () sollte den Player -Tank, den feindlichen Panzer zeichnen und den Explosionseffekt des Todesstabs anzeigen;
Ereignisüberwachung: Wenn der Benutzer WDSA drückt, sollte der entsprechende Spielertank die Richtung ändern. Wenn der Benutzer J abfeuert, befindet sich eine Kugel in Richtung des Starts und sollte bis zum Tod laufen, es sei denn, er trifft den Feind.
Drücken Sie den Tank: Wenn die Kugel auf einen feindlichen Panzer trifft, wird eine Explosion erzeugt und zum Explosionssatz hinzugefügt, und die Explosionsinformationen werden auf der Oberfläche gezogen.
Feinde trafen den Spieler: Nehmen Sie die sogenannten Feinde im Spiel heraus und die Kugeln jedes Feindes passen zu meinem Panzer, um festzustellen, ob er ihn treffen soll.
Die Spieler trafen den Feind: Nehmen Sie jede Kugel des Spielers aus, passen Sie jeden feindlichen Panzer an, um festzustellen, ob er ihn treffen soll. und die Urteile im Zusammenhang mit dem Schlagen des Tanks in den Thread Run () eingeben, um kontinuierliche gleichzeitige Urteile zu fällen;
Das spezifische Funktionsanalysediagramm lautet wie folgt:
• Diagramm zur Analyse von Tankcharakterattributanalyse
Funktionales Zeichnungsplatine -Analysediagramm
Tank Xmind Gesamtanalysediagramm
Tankzeichenattribut Xmind Diagramm
Tankfunktionsattribute Xmind Diagramm
Iv. Systemimplementierung
• Mitglieder.Java
//MEMMBERS.JAVAPACKAGE MYTANK9; Import Java.util. boolean islive = true; public bomb (int x, int y) {this.x = x; this.y = y; } // Health public void lifedown () {if (Life> 0) {Life--; } else {this.islive = false; }}} class Shot implementiert runnable {int x; int y; int direkt; int Geschwindigkeit = 1; boolean islive = true; public shot (int x, int y, int direkt) {this.x = x; this.y = y; this.direct = Direct; } public void run () {while (true) {try {thread.sleep (50); } catch (Ausnahme e) {e.printstacktrace (); } Switch (direkt) {Fall 0: y- = Geschwindigkeit; brechen; Fall 1: x+= Geschwindigkeit; brechen; Fall 2: y+= Geschwindigkeit; brechen; Fall 3: x- = Geschwindigkeit; brechen; } // Bestimmen Sie, ob das Feld die Kante trifft, wenn (x <0 || x> 400 || y <0 || y> 300) {this.islive = false; brechen; }}}} Klasse Tank {// Tank Horizontaler Koordinate int x = 0; // g vertikale Koordinate int y = 0; // Tankrichtung // 0 zeigt das obere an, 1 zeigt rechts an, 2 zeigt niedriger an. 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 direkt; } public void setDirect (int direkt) {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; }} // feindliche Panzerklasse Feindtank erweitert Tank implementiert Runnable {int Times = 0; // einen Vektor definieren, der feindliche Kugeln speichern kann. } @Override public void run () {// Todo automatisch generierte Methode Stub while (true) {switch (this.direct) {case 0: // zeigt an, dass sich der Tank nach (int i = 0; i <30; i ++) {// feindliche Panzerbewegungen in meinem Bereich in meinem Bereich if (y> 0) {{y- = specy; } try {thread.sleep (50); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } } brechen; Fall 1: für (int i = 0; i <30; i ++) {if (x <400) {x+= Geschwindigkeit; } try {thread.sleep (50); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } } brechen; Fall 2: für (int i = 0; i <30; i ++) {if (y <300) {y+= Geschwindigkeit; } try {thread.sleep (50); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } } brechen; Fall 3: für (int i = 0; i <30; i ++) {if (x> 0) {x- = Geschwindigkeit; } try {thread.sleep (50); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } } brechen; } // Bestimmen Sie, ob Sie dem Tank ein neues Kugel hinzufügen müssen. Times ++; if (Times%2 == 0) {if (isLive) {if (ss.size () <5) {shot s = null; Switch (Direct) {case 0: // Erstellen Sie eine Kugel S = New Shot (x+10, y, 0); // die Kugel dem Vektor ss.add (s) hinzufügen; brechen; Fall 1: s = neuer Schuss (x+30, y+10, 1); ss.add (s); brechen; Fall 2: s = neuer Schuss (x+10, y+30, 2); ss.add (s); brechen; Fall 3: s = neuer Schuss (x, y+10, 3); ss.add (s); brechen; } // Starten Sie den Bullet -Thread Thread t = neuer Thread (s); t.start (); }}} // den Tank zufällig eine neue Richtung generieren. }}}} // Mein Tankklasse erweitert den Tank {vector <Sot> s = new vector <Sot> (); Schuss S = NULL; Public Hero (int x, int y) {super (x, y); } // Fire public void shotenemy () {switch (this.direct) {case 0: // Erstellen einer Kugel s = new Shot (x+10, y, 0); // Fügen Sie die Kugel dem Vektor ss.add (s) hinzu; brechen; Fall 1: s = neuer Schuss (x+30, y+10, 1); ss.add (s); brechen; Fall 2: s = neuer Schuss (x+10, y+30, 2); ss.add (s); brechen; Fall 3: s = neuer Schuss (x, y+10, 3); ss.add (s); brechen; } Thread t = neuer Thread (s); t.start (); } // Panzerwechsel public void moveUp () {y- = speed; } // Tank Moveright () {x+= Geschwindigkeit; } public void bewegung () {y+= Geschwindigkeit; } public void moveleft () {x- = Geschwindigkeit; }} • MyTankGame4.java
//Mytankgame4.java/* * Funktion: Panzerspiel 2.0 * 1: Zeichnen Sie den Tank * 2: Mein Tank kann sich nach oben und unten bewegen Explosion: 1 Erstellen Sie zuerst drei Bilder; java.awt.event.*; import Java.io.file; Import Java.util MyTankGame4 () {mp = new mypanel (); t.start (); this.add (MP); // Registrieren Sie sich, um dies zu hören. this.setSize (400, 300); this.setDefaultCloseOperation (jframe.exit_on_close); this.setvisible (true); }} Klasse mypanel erweitert JPanel implementiert Keylistener, runnable {// Definieren Sie einen My Tank Hero = Null; // Definieren Sie den Tankvektor des Feindes <Feindel> ETS = New Vector <fegetank // Definieren Sie das Umschalten von drei Bildern, um ein Bombenbild zu bilden. Bild Bild2 = NULL; Image Image3 = null; // public mypanel () {Hero = neuer Held (100,100); // Initialisierung des feindlichen Panzers für (int i = 0; i <Ensizierung; i ++) {// das feindliche Tankobjekt Feind und feindliche und neue Feind (i+1)*50, 0) erstellen; etsetColor (0); etsetDirect (2); // Starten Sie den feindlichen Tank -Thread t = neuer Thread (et); T.Start (); // verhandeln eine Kugel mit dem feindlichen Panzerschuss S = neuer Schuss (etx+10, et al.+30,2); etss.add (s); Thread T2 = neuer Thread (s); t2.Start (); // beitreten ETS.Add (et); } try {image1 = imageio.read (neue Datei ("bomb_1.gif")); Image2 = imageio.read (neue Datei ("bomb_2.gif")); Image3 = imageio.read (neue Datei ("bomb_3.gif")); } catch (Ausnahme e) {e.printstacktrace (); } // Drei Bilder initialisieren // image1 = Toolkit.getDefaulttoolkit (). GetImage (panel.class.getResource ("/bomb_1.gif")); // image2 = Toolkit.getDefaulttoolkit (). Toolkit.getDefaulttoolkit (). GetImage (panel.class.getResource ("/bomb_3.gif")); } // public void paint (Grafik g) {Super.Paint (g) neu ausgestattet; G.FillRect (0, 0, 400, 300); // Zeichnen Sie Ihren eigenen Panzer, wenn (Hero.islive == true) {this.drawtank (Hero.getX (), Hero.gety (), G, this.hero.direct, 1); } // Entfernen Sie jede Kugel aus SS und zeichnen Sie für (int i = 0; i <hero.s.size (); i ++) {// Nehmen Sie die Kugeln auf Myshot = Hero.Ss.get (i); // Zeichnen Sie eine Kugel und zeichnen Sie eine Kugel. Wie zeichne ich mehrere Kugeln? traversal if (myshot! } if (myshot.islive == false) {// Entfernen Sie die Kugel aus dem SS Vector Hero.Ss.remove (MyShot); }} // Zeichnen Sie die Bombe für (int i = 0; i <bombs.size (); i ++) {bomb b = bombs.get (i); if (b.life> 6) {g.drawimage (image1, bx, by, 30,30, this); } else if (b.life> 4) {g.drawimage (image2, bx, von, 30,30, this); } else {g.drawimage (Image3, bx, by, 30,30, this); } // Reduzieren Sie den Gesundheitswert von B b.lifedown (); // Wenn der Gesundheitswert der Bombe == 0, kicken Sie ihn heraus, wenn (b.life == 0) {bombs.remove (b); }} // den feindlichen Panzer für (int i = 0; i <ets.size (); i ++) {EnemyTank et = Ets.get (i) zeichnen; if (etsislive) {this.drawtank (etsgetX (), etsgety (), g, etsgetDirect (), 0); // Zeichnen Sie die feindliche Kugel für (int j = 0; j <ets.size (); j ++) {Shot EnemyShot = ets.get (j); if (fegeemyShot.islive) {g.draw3Drect (fegeemyShot.x, fegeded.y, 1, 1, falsch); } else {// der feindliche Panzer starb etss.remove (fegedshot); }}}}}}}}} // ob die feindliche Kugel mich öffentliche void hitme () {// jeden feindlichen Panzer für (int i = 0; i <this.ets.size (); i ++) {// den feindlichen Tank Enemytank Eets.Get (i) entfernen; if (et.islive == true) {for (int j = 0; j <etss.size (); j ++) {// Nehmen Sie den Bullet Shot EnemyShot = etss.get (j) heraus; if (fegeemyShot.islive == true) {this.hittank (fegeemyShot, Held); }}}}}}}}} // Ob meine Kugel auf den feindlichen Panzer trifft, public void HitenemyTank () {// Bestimmen Sie, ob der feindliche Panzer getroffen wird (int i = 0; i <Hero.S.S.SIZE (); i ++) {Shot MyShot = HeroS.Get (i); // // // // //, um zu bestimmen, ob das Bullet gültig ist, wenn das Bullet (MyShot) gültig ist (MyShot.s.s.s. i). Aus jedem Panzer und Richter für (int j = 0; j <ets.size (); j ++) {EnemyTank et = Ets.get (j); if (etsislive == true) {this.hittank (myshot, et); }}}}}}}}}}} // um eine Funktion zu schreiben, um zu bestimmen, ob die Kugel auf den Tank public void hittank (Shot S, Tank et) {Switch (etsirect) {// Wenn die feindliche Panzerrichtung die obere oder untere Fall ist 0: Fall 2: Fall 2: Fall 2: Fall 2: if (sx> et.x && s.x <etx+20 && S.y> et. bombs.add (b); } Fall 1: Fall 3: if (sx> etx && s.x <etx+30 && S.y> et. Bombe B = neue Bombe (etx, ety); bombs.add (b); }}}}}}} // Zeichnen Sie den Tank public void Dractank (int x, int y, graphics g, int direct, int type) {// Tank Typ Switch (Typ) {case 0: g.setColor (color.cyan); brechen; Fall 1: G.SetColor (color.yellow); brechen; }// Tank direction switch(direct) {// Up case 0:// Draw the tank on the left g.fill3DRect(x, y, 5, 30, false);// DrawLine(x+10, y+15, y+15, 5, 30, false);// Draw the middle rectangle g.fill3DRect(x+5, y+5, 10, 20, false);// Draw the original shape g.fillOval(x+5, y+10, 10, 10); // Zeichnen Sie die gerade Linie G.Drawline (x+10, y+15, x+10, y); brechen; Fall 1: // nach rechts // das obere Rechteck zeichnen G.Fill3Drect (x, y, 30, 5, Falsch); // Zeichnen Sie das untere Rechteck G.Fill3Drect (x, y+15, 30, falsch); // Zeichnen Sie den unteren Rechteck G.Fill3Drect (x, y+15, 30, 5, falsch). brechen; Fall 2: // Zeichnen Sie den Tank unter G.Fill3Drect (x+15, y+10, x+30, y+10); // Den Tank auf der rechten Seite zeichnen G.Fill3Drect (x+15, y+10, x+30, y+10); // Zeichnen Sie den Tank auf der rechten G.Fill3Drect (x+15, Y, 5, 30, FALSE). y+5, 10, 20, false); // Zeichnen Sie das Rechteck G.Fill3Drect (x+5, y+5, 10, 20, false); // Drawline (x+10, y+10, 10, 10); // Zeichnen Sie eine gerade Linie G.Drawline (x+10, y+15, x+10, y+30); brechen; Fall 3: // links // Zeichnen Sie das obere Rechteck G.Fill3Drect (x, y, 30, 5, Falsch); // Das untere Rechteck zeichne G.Fill3Drect (x, y+15, 30, 5, falsch); // Zeichnen Sie den mittleren Rechteck G. fill3Drect (x+5, y+5, 20, 10, FALSE). 10); // Drawline (x+15, y+10, x, y+10); brechen; }} // Drücken Sie die Taste und verarbeiten Sie sie. A links s down d nach rechts w up. @Override public void keytyped (keyEvent e) {// todo automatisch generierte Methode Stub} @Override public void kectored (keyEvent e) {// Todo auto-generierter Methode Stub if (e.getKeyCode () == KeyeVent.vk_w) {this.setDirect (); 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.Movedown (); } else if (e.getKeyCode () == KeyEvent.vk_a) {this.hero.setDirect (3); this.hero.Moveleft (); } if (e.getKeyCode () == KeyEvent.vk_j) {// Bestimmen Sie, ob der Spieler J // Fire if (this.hero.ss.Size () <= 4 && this.Hero.islive == true) {this.hero.shotenemy (); }} // Panel muss neu gestrichen werden.Repaint (); } @Override public void keyRepest (keyEvent e) {// Todo automatisch generierte Methode Stub} public void run () {while (true) {try {thread.sleep (100); } catch (Ausnahme e) {e.printstacktrace (); } this.hitenemyTank (); // Funktion bestimmt, ob die Kugel des Feindes mich thit tht.hitme (); this.Repaint (); }}}5. Testergebnisse
Gelb ist der Spieler, den Spieler schlägt
Feinde feuern Kugeln
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.