Advertisement
Guest User

MinionGame

a guest
Nov 28th, 2014
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.27 KB | None | 0 0
  1. import java.awt.Color;
  2. import java.awt.EventQueue;
  3. import java.awt.Font;
  4. import java.awt.FontMetrics;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.RenderingHints;
  8.  
  9. import javax.swing.ButtonGroup;
  10. import javax.swing.JFrame;
  11. import javax.swing.JRadioButton;
  12. import javax.swing.JSlider;
  13. import javax.swing.JButton;
  14. import javax.swing.JPanel;
  15.  
  16. import java.awt.event.ActionListener;
  17. import java.awt.event.ActionEvent;
  18.  
  19. public class MinionGUI {
  20.    
  21.     /*
  22.      * Minion Spiel mit GUI v1.2 -- Vincent Mathis, Tilman Jungewelter
  23.      *  
  24.      * Fuer den Grundaufbau des Codes und das Layout von den
  25.      * Elementen wurde das WindowBuilder Plugin fuer Eclipse verwendet.
  26.      *
  27.      * Die Spiellogik wurde zuerst fuer eine Konsolenanwedung
  28.      * entwickelt und anschließend fuer ein GUI umgeschrieben.
  29.      *
  30.      * Der Computer versucht die Anzahl der Minions auszugleichen,
  31.      * dadurch ist der Spieler immer zueltzt am Zug, sobald keine
  32.      * Minions außer Norbert mehr vorhanden sind.
  33.      *
  34.      * Dadurch kann der Spieler aber die selbe Taktik verwenden.
  35.      * Sobald der Spieler durch ziehen von Minions die Anzahl der
  36.      * linken und rechten Seite ausgeglichen hat, ist es dem
  37.      * Computer nicht mehr möglich zu gewinnen. Außnahme fuer den
  38.      * Fall, dass der Spieler sie Seiten wieder in Ungleichgewicht versetzt.
  39.      *
  40.      * Die Minions werden als Rechtecke durch die graphics Methode dargestellt.
  41.      * Da der Computer unmittelbar nach dem Spieler zieht, ist es schwer
  42.      * zu erkennen was passiert ist. Deshalb werden die vorheringen
  43.      * Spielzüge durch Text ausgegeben.
  44.      *
  45.      * Die "Steuerung" des Spiels erfolgt rundenbasiert, d.h. der Spieler kann
  46.      * sich für links oder rechts entscheiden (mithilfe eines RadioButtons) und einen
  47.      * Wert zwischen 1-3 auswaehlen (Slider). Durch das betätigen des Buttons
  48.      * wird der Zug ausgefuehrt. Bei Spielende erscheint eine Textausgabe, der Button
  49.      * kann verwendet werden um das Spiel neuzustarten (die Werte werden neu initialisiert)
  50.      *
  51.      */
  52.  
  53.    
  54.     // Variablen
  55.     private JFrame frame;
  56.     private int norbert, anzahl, links, rechts;
  57.     private char seite;
  58.     private boolean running = true;
  59.     private boolean won;
  60.     private String win = "Gewonnen! :)";
  61.     private String loss = "Verloren! :(";
  62.     private String stringSpieler, stringComputer, btnText;
  63.  
  64.     // Main Methode erstellt neues "Fenster" und setzt es sichtbar
  65.     public static void main(String[] args) {
  66.         EventQueue.invokeLater(new Runnable() {
  67.             public void run() {
  68.                 try {
  69.                     MinionGUI window = new MinionGUI();
  70.                     window.frame.setVisible(true);
  71.                 } catch (Exception e) {
  72.                     e.printStackTrace();
  73.                 }
  74.             }
  75.         });
  76.     }
  77.  
  78.     public MinionGUI() {
  79.         init();
  80.         gui();
  81.     }
  82.  
  83.     // Initialisierung der Position, etc.
  84.     public void init() {
  85.         norbert = (int) (11 * Math.random()); // Zufallszahl zwischen 0 und 11, Position von Norbert.
  86.         links = norbert; // Anzahl der Minions links von Norbert.
  87.         rechts = 10 - norbert; // Anzahl der Minions rechts von Norbert.
  88.         stringComputer = "";
  89.         stringSpieler = "";
  90.         btnText = "Ziehen";
  91.     }
  92.    
  93.     // JPanel mit Graphics fuer die Kaestchen
  94.     public class gPanel extends JPanel {
  95.         public void paintComponent(Graphics g) {
  96.             // Antialiasing fuer Text
  97.             Graphics2D g2 = (Graphics2D) g;
  98.             g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  99.             RenderingHints.VALUE_ANTIALIAS_ON);
  100.             // Löscht alle gezeichneten Objekte bei jedem Aufruf
  101.             g.setColor(getBackground());
  102.             g.fillRect(0, 0, 550, 70);
  103.             // Minions links von Norbert
  104.             g.setColor(new Color(255, 220, 50));
  105.             for(int i = 0; i < links; i++) {
  106.                 g.fillRoundRect(norbert*40 - 40 - i*40, 0, 30, 30, 10, 10);
  107.             }
  108.             // Minions rechts von Norbert
  109.             for(int j = 0; j < rechts; j++) {
  110.                 g.fillRoundRect(40 + norbert*40 + j*40, 0, 30, 30, 10, 10);
  111.             }
  112.             // Norbert
  113.             g.setColor(new Color(220, 40, 40));
  114.             g.fillRoundRect(norbert*40, 0, 30, 30, 10, 10);        
  115.             // Ausgabe der letzten Spielzuege:
  116.             g.setColor(Color.DARK_GRAY);
  117.             g.setFont(new Font("Courier", Font.PLAIN, 14));
  118.             g.drawString(stringSpieler, 0, 50);
  119.             g.drawString(stringComputer, 0, 65);
  120.             // Game gewonnen/verloren:
  121.             if(!running) { // Wenn running false gesetzt wird (in playerZug oder computerZug)
  122.                 g.setColor(getBackground());
  123.                 g.fillRect(0, 0, 550, 40);
  124.                 g.setFont(new Font("Tahoma", Font.PLAIN, 20));
  125.                 FontMetrics fm = g.getFontMetrics();
  126.                 if(won) { // won ebefalls von player Logik oder computer Logik gesetzt
  127.                     g.setColor(new Color(110, 220, 40));
  128.                     g.drawString(win, getWidth()/2 - fm.stringWidth(win) / 2, 20); // zeichne Text "Gewonnen"
  129.                 } else {
  130.                     g.setColor(new Color(220, 40, 40));
  131.                     g.drawString(loss, getWidth()/2 - fm.stringWidth(loss) / 2 , 20); // zeichne Text "Verloren"
  132.                 }
  133.             }
  134.         }
  135.     }
  136.    
  137.     // Graphical User Interface Elemente + Buttonlistener (Befehle wenn der Spieler den Knopf drückt)
  138.     private void gui() {
  139.         // Frame, Layout, Exit
  140.         frame = new JFrame();
  141.         frame.setBounds(100, 100, 470, 155);
  142.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Beendet das Programm wenn X gedrückt wird
  143.         frame.getContentPane().setLayout(null); // Layout der Elemente = absolut (pixel positionen)
  144.        
  145.         // Kaestchen fuer linke Seite
  146.         final JRadioButton rdbtnLinks = new JRadioButton("Links");
  147.         rdbtnLinks.setSelected(true);
  148.         rdbtnLinks.setBounds(8, 86, 70, 23);
  149.         frame.getContentPane().add(rdbtnLinks);
  150.        
  151.         // Kaestchen fuer rechte Seite
  152.         final JRadioButton rdbtnRechts = new JRadioButton("Rechts");
  153.         rdbtnRechts.setBounds(77, 86, 88, 23);
  154.         frame.getContentPane().add(rdbtnRechts);
  155.        
  156.         // Nur ein Kaestchen kann gewae¤hlt werden
  157.         ButtonGroup group = new ButtonGroup();
  158.         group.add(rdbtnLinks);
  159.         group.add(rdbtnRechts);
  160.        
  161.         // Slider fuer Anzahl der zu ziehenden Minions
  162.         final JSlider slider = new JSlider();
  163.         slider.setMinorTickSpacing(1);
  164.         slider.setValue(2);
  165.         slider.setPaintTicks(true);
  166.         slider.setMinimum(1);
  167.         slider.setMaximum(3);
  168.         slider.setBounds(162, 87, 165, 27);
  169.         frame.getContentPane().add(slider);
  170.  
  171.         // Graphics Panel hinzufuegen (public class gPanel)
  172.         final JPanel gPanel = new gPanel();
  173.         gPanel.setBounds(12, 12, 440, 70);
  174.         frame.getContentPane().add(gPanel);
  175.        
  176.         // Button hinzufuegen
  177.         JButton btnStart = new JButton(btnText);
  178.         btnStart.addActionListener(new ActionListener() {
  179.             public void actionPerformed(ActionEvent arg0) { // Button listener
  180.                 if(rdbtnLinks.isSelected()) seite = 'l'; // char 'seite' wird l
  181.                 else seite = 'r'; // char 'seite' wird r
  182.                 anzahl = slider.getValue(); // int anzahl = Wert des Auswahl Sliders
  183.                 if(running){ // falls das Spiel noch laeuft
  184.                     playerZug(); // fuehre den Zug des Spielers aus (Methode playerZug)                
  185.                     computerZug(); // fuehre den Zug des Computers aus (Methode computerZug)
  186.                     if(!running) {
  187.                         btnStart.setText(btnText);
  188.                     }
  189.                 } else { // Ansonsten soll der Button das Spiel neustarten
  190.                     won = false;
  191.                     running = true;
  192.                     init(); // Position von Norbert neu bestimmen (erneute Initialisierung)
  193.                     btnStart.setText(btnText);
  194.                 }
  195.                 gPanel.repaint(); // rufe paintComponent in gPanel auf (zeichne alles erneut)
  196.             }
  197.         });
  198.        
  199.         btnStart.setBounds(328, 85, 116, 25);
  200.         frame.getContentPane().add(btnStart);      
  201.     }
  202.    
  203.     // Spieler Logik
  204.     public void playerZug() {
  205.         // Hat Spieler links ausgewaehlt?
  206.         if(seite == 'l') {
  207.             if(links - anzahl < 0) { // Wenn der Spieler mehr Minions ziehen will als vorhanden sind
  208.                 won = false; // Spieler verliert
  209.                 running = false;
  210.                 btnText = "Nochmal";
  211.             } else { // Ansonsten ziehe die Anzahl von der linken seite ab.
  212.                 links -= anzahl;
  213.                 stringSpieler = "Spieler:     " + anzahl + " Minions von der linken Seite gezogen.";
  214.             }
  215.         } else if(seite == 'r') { // entrsprechend der rechten Seite
  216.             if(rechts - anzahl < 0) {
  217.                 won = false;
  218.                 running = false;
  219.                 btnText = "Nochmal";
  220.             } else {
  221.                 rechts -= anzahl;
  222.                 stringSpieler = "Spieler:     " + anzahl + " Minions von der rechten Seite gezogen.";
  223.             }
  224.         }  
  225.     }
  226.    
  227.     // Computer Logik
  228.     public void computerZug() {
  229.         // pruefe ob keine Minions vorhanden sind, bevor computer zieht.
  230.         if (links == 0 && rechts == 0) {
  231.             // Spieler hat gewonnen da Computer Norbert ziehen muss.
  232.             won = true;
  233.             running = false;
  234.             btnText = "Nochmal";
  235.         } if(links > rechts) { // pruefe ob links mehr Minions stehen als rechts
  236.             anzahl = links - rechts; // ziehe soviel ab, dass beide seiten gleich viele Minions haben
  237.             if(anzahl < 1) anzahl = 1; // setze die Anzahl der zu ziehenden Minions auf mindestens 1
  238.             if(anzahl > 3) anzahl = 3; // setze die Anzahl der zu ziehenden Minions auf maximal 3
  239.             links -= anzahl; // ziehe die Anzahl der Minions von der linken Seite ab
  240.             stringComputer = "Computer:    " + anzahl + " Minions von der linken Seite gezogen.";
  241.         } else { // entsprechend fuer rechte Seite:
  242.             anzahl = rechts - links;
  243.             if(anzahl < 1) anzahl = 1;
  244.             if(anzahl > 3) anzahl = 3;
  245.             rechts -= anzahl;  
  246.             stringComputer = "Computer:    " + anzahl + " Minions von der rechten Seite gezogen.";
  247.         }  
  248.         // pruefe ob keine Minions vorhanden sind (und ob das spiel nicht zuvor beendet wurde), nachdem der Computer gezogen hat.
  249.         if (running && links == 0 && rechts == 0) {
  250.             // Spieler hat verloren, da Spieler Norbert ziehen muss.
  251.             won = false;
  252.             running = false;
  253.             btnText = "Nochmal";
  254.         }
  255.     }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement