Java-Simon Sagt
Momentan habe ich die GUI für ein "simon sagt" Spiel, das einzige problem das ich habe ist die Umsetzung der Spiel-Logik (mein Aktueller code generiert eine Sequenz und display user input, aber nicht speichern Sie die erstellte Sequenz, oder vergleichen Sie es mit der Eingabe). Ich weiß, dass ich entweder einen queue-oder stack, aber ich kann nicht herausfinden, wie zu implementieren, die entweder von diesen, um ein funktionierendes Spiel.
Kann mir bitte jemand helfen, hier ist, was ich so weit gekommen:
Treiber:
import javax.swing.JFrame;
public class Location
{
public static void main (String[] args)
{
JFrame frame = new JFrame ("Location");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new LocationPanel());
frame.pack();
frame.setVisible(true);
}
}
"Position Panel" ("Simon sagt" Spiel-Logik):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Random;
public class LocationPanel extends JPanel
{
private final int WIDTH =300, HEIGHT=300; //dimensions of window
private int[] xLoc, yLoc; //locations for target boxes
/* 0 1
2 3 */
private int timer; //timer for displaying user clicks
private int xClick, yClick; //location of a user click
private int sTimer; //timer for displaying target
private int[] target; //choice of target
private int currTarget;
private int numTargets;
private JButton pushButton; //button for playing next sequence
public LocationPanel()
{
xLoc = new int[4];
yLoc = new int[4];
xLoc[0] = 100; yLoc[0] = 100;
xLoc[1] = 200; yLoc[1] = 100;
xLoc[2] = 100; yLoc[2] = 200;
xLoc[3] = 200; yLoc[3] = 200;
timer = 0;
sTimer = 0;
xClick = -100; yClick = -100;
target = new int[10];
currTarget = -1;
pushButton = new JButton("Next Sequence");
pushButton.addActionListener(new ButtonListener());
add(pushButton);
addMouseListener(new MouseHandler());
setPreferredSize (new Dimension(WIDTH, HEIGHT));
setBackground (Color.white);
}
public void paintComponent(Graphics page)
{
super.paintComponent(page);
//draw four target area boxes
page.setColor(Color.black);
for (int i=0; i<4; i++)
{
page.drawRect(xLoc[i]-20, yLoc[i]-20, 40, 40);
}
//if are displaying a target, draw it
if (sTimer>0)
{
page.setColor(Color.blue);
page.fillOval(xLoc[target[currTarget]]-15, yLoc[target[currTarget]]-15, 30, 30);
sTimer--;
repaint();
}
if (sTimer == 0)
{
if (currTarget < numTargets - 1)
{
currTarget++;
sTimer = 500;
}
else
{
sTimer--;
}
}
//if are displaying a user click, draw it
if (timer>0)
{
page.setColor(Color.red);
page.fillOval(xClick-15, yClick-15, 30, 30);
timer--;
repaint();
}
}
//when the button is pressed, currently the program selects a single
//random target location and displays the target there for a short time
private class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Random gen = new Random();
numTargets = target.length;
for (int i = 0; i < target.length; i++)
{
int insert = gen.nextInt(4);
if(i == 0)
target[i] = insert;
else
{
while(insert == target[i - 1])
insert = gen.nextInt(4);
target[i] = insert;
}
}
currTarget = 0;
sTimer = 500;
repaint();
}
}
//when the user clicks the mouse, this method registers the click and
//draws a circle there for a short time
private class MouseHandler implements MouseListener, MouseMotionListener
{
//the method that is called when the mouse is clicked - note that Java is very picky that a click does
//not include any movement of the mouse; if you move the mouse while you are clicking that is a
//"drag" and this method is not called
public void mouseClicked(MouseEvent event)
{
//get the X and Y coordinates of where the mouse was clicked
xClick = event.getX();
yClick = event.getY();
System.out.println("(" + xClick + "," + yClick + ")");
//the repaint( ) method calls the paintComponent method, forcing the application window to be redrawn
timer = 50;
repaint();
}
//Java requires that the following six methods be included in a MouseListener class, but they need
//not have any functionality provided for them
public void mouseExited(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mousePressed(MouseEvent event) {}
public void mouseMoved(MouseEvent event) {}
public void mouseDragged(MouseEvent event) {}
}
}
- "Clean Code" von Robert Martin. Kann deine Frage nicht beantworten, aber das Buch hilft letztlich.
- Für uns, die nicht wissen, das Spiel, hätte man mindestens ein link zu einer Beschreibung.
- Warum kannst du nicht beantworten? Warum wird das Buch helfen?
- Ich denke, dass die Erklärung in wiki wird klar, ein paar Dinge für dich: en.wikipedia.org/wiki/Queue_(data_structure)
- Nun, ich bin verwirrt, wie zu vergleichen, um den input der angegebenen Reihenfolge
- Ebermann: ich vermute, das soll-Modell Simon.
- Damnit, ich setzte ein Kopfgeld auf die falsche Frage...wieder einmal, vielen Dank für die tollen Antworten, aber ich löste es, nach den ersten 2...
- Wenn man diese gelöst, bitte markieren Sie die Antwort, die Ihnen geholfen die.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie die Javadoc für die Queue -
Queue (Java 2 Platform SE 5.0)
Starten Sie die Speicherung der erzeugten Sequenz in Ihrem
ButtonListener
. Erstellen Sie eine Queue in IhremButtonListener
:Füllen der queue mit den randoms, wie Sie zu generieren.
Dann, in Ihrem
mouseClicked
event-handler, pop Elemente aus der Warteschlange und überprüfen, um zu sehen, ob Sie das gleiche wie mit der Maus angeklickt region.Beschreibung dieses schien kompliziert, also habe ich eine Konsole Beispiel:
Spielen :
new SimonSays(new Random(/*for fixed results enter seed*/), 3).play();
.Brauchen Sie nur rewire-play-Methode.
Ich würde speichern Sie die erstellte Sequenz in einem
List
. Dann erhalten SieIterator
dieser Liste.(*) Nun muss man nur vergleichen der Benutzereingabe mit der Liste Element den Iterator verweist. Wenn es anders ist: Abbruch, wenn es das gleiche: rufen Sie
next()
auf den iterator und wiederholen Sie den Vorgang bei der * * * bis Sie ging durch die komplette Liste.Gut man könnte ein
Queue
auch als gmoore schrieb. Das Prinzip bleibt das gleiche, statt einen iterator rufen Sieremove()
oderpoll()
aus der Warteschlange.Sollten Sie nicht brauchen etwas mehr als eine
ArrayList
. Ersetzen Sie Ihreint[] target
mit:Wenn es ist Zeit, um ein neues zufälliges Ziel Nummer der Reihenfolge verwenden:
Für die Anzeige Sie können die aktuelle Ziel-Nummer mit:
Verwenden Sie eine andere variable zu verfolgen, die position der Benutzer-Eingabe, wie Sie zu spielen es zurück, z.B.
int currUser
. Legen Sie es auf 0 in jeder Runde und der Schrittweite, denn Sie bekommen die Reihenfolge richtig, indem Sie mittargets.get(currUser)
. Sie können auch ersetzennumTargets
mittargets.size()
.Wenn es ist Zeit zu beginnen: