Die Beispiele in diesem Artikel teilen Ihnen den spezifischen Code der Java -Implementierung Tetris für Ihre Referenz. Der spezifische Inhalt ist wie folgt
Tetris Design -Ideen
Tetris spielt seit ihrer Kindheit. Jeder kennt die Regeln. In der Vergangenheit dachte ich, dass das Ding sehr Spaß machte, aber ich konnte einfach nicht gewinnen. Jetzt habe ich gelernt, selbst einen zu schreiben und jeden Tag zu üben!
Tastaturbetrieb:
Linker Schlüssel: Beweg dich nach links; Richtiger Schlüssel: Nach rechts bewegen;
UP -Schlüssel: Ändern Sie die Form und niedrigere Schlüssel: Beschleunigen Sie den Tropfen (kein Problem, keine weitere Berichtigung)
Wenn die Quadrate einer Reihe voll sind, wird diese Zeile beseitigt. Die Beseitigung einer Reihe von Quadraten erhält 10 Punkte. Derzeit habe ich die Ebenen nicht festgelegt. Babys, die es mögen, können die Ebenen selbst festlegen;
Woher kamen diese quadratischen Formen? Es wurde von uns selbst entworfen. Die gängigen Formen sind: i Type, t Type, L -Typ, Tianzi -Gittertyp usw., füge sie selbst hinzu!
Also, was ist passiert? Tatsächlich ist es nur ein 4*4 -Array. Natürlich können Sie N*n glücklich entwerfen, Sie haben das letzte Wort!
Ich habe unten ein Beispiel gegeben, um Ihnen zu sagen, warum die Formen, die Sie sehen, im Voraus geändert werden können, 0 leer und 1 ein Füllstoff ist, damit Sie Formen in Ihrem Spiel erstellen können!
Vergessen Sie es: Setzen Sie einfach das Bild ein und sehen Sie zuerst den Code aus, den die Ergebnisse ausgeführt haben:
Mag es? Wenn Sie es mögen, tun Sie es einfach direkt. Vielleicht ist der Code nicht gut genug geschrieben. Bitte verzeihen Sie mir. Ich werde mehr zusammenfassen, wenn ich zurückblicke und den Code weiter aktualisiere.
Gamepanel -Klasse: Die Game Interface -Klasse wird der gesamte Block fallen gelassen und angezeigt, und die Logik des Spiels langsam wird in dieser Klasse implementiert.
Paket Tetris; Import Java.awt.graphics; Import Java.awt.event.ActionEvent; Import Java.awt.event.ActionListener; Import Java.awt.event.Keyevent; Import Java.awt.Event.Keuryer; javax.swing.jpanel; import javax.swing.timer; public class Gamepanel erweitert JPanel implementiert KeyListener {private int maprow = 21; private int mapcol = 12; private int mapGame [] [] = new int [Maprow] [MAPCOL]; // Öffnen Sie einen zweidimensionalen Array-Raum, um unsere Karteninformationen privater Timer-Timer zu speichern; private int Score = 0; // zeichnen Sie den Score Random Random = New Random () auf; private int curshapetype = -1; private int curshapestate = -1; // Setzen Sie den aktuellen Formtyp und den aktuellen Formstatus Private int NextShapeType = -1; private int NextShapestate = -1; // Legen Sie den Typ und den Status der Blockgruppe fest, die beim nächsten Mal private int posx = 0 erscheint; private int posy = 0; Private Final Int -Formen [] [] [] = new int [] [] {// t Glyphen werden gegen den Uhrzeigersinn gespeichert. {{0,0,0,0, 1,1,1,1,1,0,0,0,0, 0,0,0,0,0}, {0,1,0,0,0, 0,1,0,0,, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,es 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,es 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,es 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,es {0,1,1,0, 1,1,0,0, 0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0}, //Z-shaped { {1,1,0,0,0, 0,1,1,0,0,0,0,0}, {0,1,0,0, 1,1,0,0, 1,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {0,1,0,0, 1,1,0,0, 1,0,0,0,0,0,0}, //J glyphs are stored in counterclockwise order { {0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,0,0}, {1,1,1,0, 0,0,1,0,0,0,0,0,0,0,0}, {1,1,0,0, 1,0,0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0,0}, //L glyphs are stored in counterclockwise order { {1,0,0,0,0, 1,0,0,0,0, 1,1,0,0,0,0,0,0,0,0}, {0,0,1,0, 1,1,0,0, {0,0,1,0, 1,1,0,0,, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0 nicht jedoch jedoch jedoch nicht. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0 nicht jedoch jedoch jedoch nicht. 0,0,0,0,0,0,0,0}, {1,1,0,0, 0,1,0,0,0,0,0,0}, {1,1,1,0,, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}}}}; Private int RowRect = 4; Private int colrect = 4; // Hier betrachten wir das gespeicherte Bild als 4*4 zweidimensionales Array. Obwohl wir ein eindimensionales Array verwenden, um es oben zu speichern, müssen wir es dennoch als zweidimensionales Array betrachten, um eine private int-Rechtexponation zu implementieren = 10; public Gamepanel () // Konstruktor ---- Erstellen Sie eine gute Karte {Createrect (); initmap (); // initialisieren Sie diese Karte setwall (); // wall // createct () setzen; Timer = neuer Timer (500, neuer TimerListener ()); Timer.Start (); } class TimerListener implementiert actionListener {public void actionPerformed (actionEvent e) {bewegtown (); }} public void setwall () // Spalte 0 und 11 sind beide Wände, und Zeile 20 ist auch Wände {für (int i = 0; i <Maprow; i ++) // Zeichnen Sie die Spalte zuerst {mapGame [i] [0] = 2; MAPGame [i] [11] = 2; } für (int j = 1; j <mapcol-1; j ++) // Zeichnen Sie die letzte Zeile {MAPGame [20] [j] = 2; }} public void initmap () // Diese Karte initialisieren, die Wand -ID ist 2, die Space -ID ist 0 und die Block -ID ist 1 {für (int i = 0; i <maprow; i ++) {für (int j = 0; j <mapcol; j ++) {MAPTGAME [i] [J] = 0; }}} public void createrect () // Block erstellen --- Wenn der aktuelle Blocktyp und der aktuelle Zustand existiert, setzen Sie das nächste Mal, wenn nicht, den aktuellen Zustand und tippen Sie {if (curshapetype == -1 && curshapestate == -1) // Der aktuelle Blockzustand ist 1. Curshapestate = random.Nextint (Formen [0] .Length); } else {curshapeType = nextShapeType; Curshapestate = NextShapestate; } NextShapeType = random.nextint (formes.length); NextShapestate = random.Nextint (Formen [0] .Length); posx = 0; posy = 1; // Erstellen Sie ein Quadrat in der oberen linken Ecke der Wand, wenn (GameOver (posx, posy, curshapetype, curshapestate) {joptionpane.showConfirplidialog (null, "Spielende!", "Tipp", joptionpane.ok_option); System.exit (0); }} public boolean GameOver (int x, int y, int Shapetype, int Shapestate) // Beurteilen Sie, ob das Spiel {if (isOrnomove (x, y, Shapetype, Shapestate)) {return false; } Return true; } public boolean isornomove (int x, int y, int Shapetype, int formestate) // Beurteilen Sie, ob die aktuelle Zahl bewegt werden kann. Here we emphasize that the coordinates of x and y refer to the upper left target of a two-dimensional array of 4*4 (the array describing the figure) { for(int i = 0; i < rowRect ; i++) { for(int j = 0; j < colRect; j++) { if(shapes[ShapeType][ShapeState][i*colRect+j] == 1 && MAPGame [x+i] [y+j] == 1 || }}} return true; } public void Turn () // drehen {int temp = curshapestate; Curshapestate = (Curshapestate+1) % Formen [0] .Länge; if (isOrnomove (posx, posy, curshapetype, curshapestate)) {} else {curshapestate = temp; } repaint (); } public void bewegt () // Bewegung nach unten {if (isOrnomove (posx+1, posy, curshapetype, curshapestate)) {posx ++; } else {addtomap (); // Fix diese Zeile in der Karte Checkline (); CreateRect (); // Erstellen Sie einen neuen Block} Repaint (); } public void moveleft () // links bewegen {if (isOrnomove (posx, posy-1, curshapetype, curshapestate)) {posy--; } repaint (); } public void moveright () // nach rechts bewegen {if (isOrnomove (posx, posy+1, curshapetype, curshapestate)) {posy ++; } repaint (); } public void AddToMap()//Fix the fallen image into the map { for(int i = 0; i < rowRect; i++) { for(int j = 0; j < colRect; j++) { if(shapes[curShapeType][curShapeState][i*colRect+j] == 1) { mapGame[posx+i][posy+j] = Formen [Curshapetyp] [Curshapestate] [i*colrect+j]; }}}} public void Checkline () // Überprüfen Sie, ob in diesen Zeilen vollständige Zeilen {int count = 0; für (int i = maprow-2; i> = 0; i--) {count = 0; für (int j = 1; j <mapcol-1; j ++) {if (mapGame [i] [j] == 1) {count ++; } sonst brechen; } if (count> = MAPCOL-2) {für (int k = i; k> 0; k--) {für (int p = 1; p <mapcol-1; p ++) {mapGame [k] [p] = MAPGame [k-1] [p]; }} Punktzahl += 10; i ++; }}} public void Paint (Graphics g) // Fenster {super.paint (g) neu aufstellen; for(int i = 0; i < rowRect; i++)//Draw the falling block { for(int j = 0; j < colRect; j++) { if(shapes[curShapeType][curShapeState][i*colRect+j] == 1) { g.fillRect((posy+j+1)*RectWidth, (posx+i+1)*RectWidth, RectWidth, Rechtekte); }}} für (int i = 0; i <maprow; i ++) // Zeichnen Sie die Blockinformationen, die auf der Karte behoben wurden. Rechtekte); } if (MAPGame [i] [j] == 1) // DAI AND SMALE Square }}} g.drawstring ("Score ="+ Score, 225, 15); G.Drawstring ("Next Square:", 225, 50); für (int i = 0; j <colrect; j ++) {if (formes [nextShapeType] [NextShapestate] [i*colrect+j] == 1) {g.FillRect (225+ (j*rechtexte), 100+ (i*rektwidth), rektwidth, rektwidth); }}}} public void newGame () // Das Spiel beginnt erneut {Score = 0; initmap (); Setwall (); CreateRect (); Repaint (); } public void stopgame () // Das Spiel pausiert {Timer.Stop (); } public void contingame () {timer.start (); } @Override public void keytyPed (keyEvent e) {} @Override public void keypresse KeyEvent.vk_up: // Up ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------— KeyEvent.vk_right: // rechts ---- Moveright (); brechen; }} @Override public void keyRepest (keyEvent e) {// Todo automatisch generierter Methode Stub}} GameFrame -Klasse: Der Eingangsport des gesamten Spiels, um es unverblümt auszudrücken, ist es eine Klasse mit der Main () -Funktion. Diese Klasse implementiert einige Designs der Spielschnittstelle, die Sie als kleine Benutzeroberfläche verstehen können.
Paket Tetris; import Java.awt.event.ActionEvent; Import Java.awt.event.ActionListener; Import Javax.swing.jframe; Import Javax.swing.jmenu; ActionListener {private int widthFrame = 500; private int heightframe = 600; Private JMenu-Menü = new JMenu ("game"); // Erstellen eines Menüs privat JMenuitem Newgame = Menü private JMenuitem stopgame = Menü.Add ("Spielepause"); private JMenuitem Goongame = Menü.Add ("Game Fortsetzung"); Privat JMenu Menutwo = New Jmenu ("Hilfe"); // Erstellen Sie ein zweites Menü Private JMenuitem überGame = Menutwo.add ("Über das Spiel"); Gamepanel gamepanel = new Gamepanel (); public GameFrame () // Konstruktor {addKeyListener (Gamepanel); newGame.AddactionListener (this); exitgame.addactionListener (this); stopegame.addactionListener (this); Goongame.AddactionListener (this); überGame.AddactionListener (dies); this.add (Gamepanel); JMenuBAR -Menü = new JMenuBar (); Menü.Add (MenüOne); Menü.Add (Menutwo); this.setJMenubar (Menü); this.settitle ("tetris"); this.setBounds (50, 10, WidthFrame, Heightframe); this.setvisible (true); this.setDefaultCloseOperation (jframe.exit_on_close); } public void actionPerformed (actionEvent e) {if (e.getSource () == newGame) // Das Spiel beginnt erneut {Gamepanel.newGame (); } if (e.getSource () == exitgame) // Game exit {System.exit (0); } if (e.getSource () == STOPGame) // Game Pause {Gamepanel.StopGame (); } if (e.getSource () == goongame) // Game Fortsetzung {Gamepanel.Continuegame (); } if (e.getSource () == ÜberGame) // Über Spielinformationen {joptionpane.showMessagedialog (null, "linke und rechte Tasten bewegen, Rotation nach oben erstellen", "Eingabeaufforderung", joptionpane.ok_option); }} public static void main (String [] args) {new GameFrame (); }}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.