Schere-Stein-Papier Spiel

Status
Nicht offen für weitere Antworten.

Antoras

Top Contributor
Hallo,

ich hatte vor ein kleines Spiel zu programmieren, das jeder kennt. Das ging bisher so weit auch ganz gut. Nur hab ich jetzt das Problem, dass mir im Label LBover - so scheint es mir auf jeden Fall mal - irgendwas x-beliebiges angezeigt wird.

Hier mal der Code: SchereSteinPapierSpiel

Hab ich da einfach einen scheiß rein geschrieben, oder fehlt bei den if-Abfragen noch irgendwas?
 
S

SlaterB

Gast
1.
x ist im ganzen Programmverlauf 0, ich verstehe nicht, wieso du ein Dreier-Array wuerfel hast und in alle Felder schaust,
während du den Computertipp immer in wuerfel[x] = wuerfel[0] schreibst

2.
deine Siegesbedingungen sind noch mal zu überdenken,
Schere soll tipp = 0; sein, dann gewinnt Schere aber sowohl gegen 1 als auch gegen 2,
0 kann gar nicht verlieren, denn keine Zahl von 0 bis 2 ist kleiner als 0

3.
nächstes Mal ein Frame oder besser JFrame bauen, dann kann das jeder testen ohne es unnötig umzuschreiben zu müssen zu xy zu
 

Antoras

Top Contributor
Zu 3.:

Ich programmier erst seit Anfang des Schuljahres. Und unser Lehrer hat uns bisher nur mit der etwas zweckmäßigen Oberfläche eines FlowLayouts arbeiten lassen. Ich kenne deshalb noch kein JFrame und hab mir bisher auch nicht die Mühe gemacht danach zu suchen, weil ich es nie gebraucht hab. Das werd ich jetzt dann mal nachholen.

Zu 2.:

Stimmt, das kann gar nicht funktionieren. Da hab ich wohl nicht weit genug gedacht. Aber wie soll ich das anders lösen? Mit > und < geht das ja gar nicht anders. Was für eine Möglichkeit gäbe es denn da noch?

Zu 1.:

Das x sollte eigentlich eine Zufallszahl sein, und nicht unbedingt 0. Ich benutz das x dreimal, damit bei jedem Klick auf den Buttton jedes Mal neu gewürfelt wird.
 
S

SlaterB

Gast
2.
wenn beide das gleiche haben, dann ist Unentschieden,
bleiben noch sechs weitere Fälle, die wirst du schon in einzelnen ifs abhandeln können,
das muss übrigens nur einmal geschehen, nicht pro Button neu

wobei du sogar zusammenfassen und else nutzen kannst:
if (gleich) -> unentschieden
else if (1 vs 2 or 2 vs 3 or 3 vs 1) -> gewonnen
else -> verloren


1.
wirf das Array am besten ganz weg, du brauchst einfach nur
int computerTipp = Zufallszahl 0-3,
auch nur einmal nicht pro Button einzeln,

der Button bestimmt eigentlich nur, ob der Tipp des Anwenders 0, 1 oder 2 ist,
der Rest kann einheitlicher Code sein
 

Antoras

Top Contributor
1. Array hab ich jetzt draußen.

2. Wie gebe ich dieses else if(1 vs 2) an? Else if ist klar, aber das versus? Ich kenn keinen Befehl der genau das beschreibt. Würdest du mir da auch noch helfen und den Befehl mir nennen?
 
S

SlaterB

Gast
if (tippUser == 1 && tippComputer == 2) {
gewonnen
}

nicht alles wörtlich nehmen ;)
 

Antoras

Top Contributor
Meine neue action-Methode:

Code:
public boolean action(Event e, Object o)
	{		
		if(e.target == BTschere)
		{
			TF.setText("");
			tipp = 0;
			if (wuerfel == tipp)
			{
				LBover.setText(String.valueOf("Unentschieden!"));
			}
				else if (wuerfel == 1)
				{
					LBover.setText(String.valueOf("Sie haben gewonnen!"));
				}
					else
					{
						LBover.setText(String.valueOf("Sie haben verloren!"));
					}			
		}
		if(e.target == BTstein)
		{
			TF.setText("");
			tipp = 1;
			if (wuerfel == tipp)
			{
				LBover.setText(String.valueOf("Unentschieden!"));
			}
				else if (wuerfel == 2)
				{
					LBover.setText(String.valueOf("Sie haben gewonnen!"));
				}
					else 
					{
						LBover.setText(String.valueOf("Sie haben verloren!"));
					}
		}
		if(e.target == BTpapier)
		{
			TF.setText("");
			tipp = 2;
			if (wuerfel == tipp)
			{
				LBover.setText(String.valueOf("Unentschieden!"));
			}
				else if (wuerfel == 1)
				{
					LBover.setText(String.valueOf("Sie haben gewonnen!"));
				}
					else
					{
						LBover.setText(String.valueOf("Sie haben verloren!"));
					}
		}
		TF.setText(String.valueOf(wuerfel));	
		validate();
		return true;
	}

Jetzt hab ich das Problem, dass der das Textfeld nicht aktualisiert. Eigentlich müsste der das doch aber machen, ich lösch es mit TF.setText(""); ja immer wieder. Wo liegt der Fehler?
 
S

SlaterB

Gast
ich kann deinen Code nicht ausprobieren, da wuefel eine unbekannte Variable ist,

kürzer:

Code:
	public boolean action(Event e, Object o) {
		int tippPC = 2;
		int tipp = 0;
		if (e.target == BTschere) {
			tipp = 0;
		} else if (e.target == BTstein) {
			tipp = 1;
		} else if (e.target == BTpapier) {
			tipp = 2;
		}
		if (tipp == tippPC) {
			LBover.setText("Unentschieden!");
		} else if ((tipp == 0 && tippPC == 2)) || (..) || (..)) {
			LBover.setText("Sie haben gewonnen!");
		} else {
			LBover.setText("Sie haben verloren!");
		}
		return true;
	}
 

Antoras

Top Contributor
Hab es jetzt verkürzt, trotzdem wird nicht neu gewürfelt wenn ich auf einen anderen Button klicke. Nochmal der Code, jetzt vollständig:

Code:
import java.awt.*;
import java.applet.*;

public class SchereSteinPapierSpiel extends Applet
{
	private int tipp;
	private int wuerfel = (int)(Math.random()*3);
	//String replace(char oldchar ,char newchar);
	FlowLayout FL = new FlowLayout();
	
	Label lbHead = new Label("Treffen Sie eine Wahl:");
	Label lbCom = new Label("Der Computer hat gewählt:");
	Label lbOver = new Label("");
	
	Button btSchere = new Button("Schere");
	Button btStein = new Button("Stein");
	Button btPapier = new Button("Papier");
	
	TextField tf = new TextField(4);
	
	public void init()
	{
		setLayout(FL);
		add(lbHead);
		add(btSchere);
		add(btStein);
		add(btPapier);
		add(lbCom);
		add(tf);
		add(lbOver);
	}
	public boolean action(Event e, Object o)
	{		
		if(e.target == btSchere)
		{
			tipp = 0;
		}
			else if(e.target == btStein)
			{
				tipp = 1;
			}
			else if(e.target == btPapier)
			{
				tipp = 2;
			}
		if(tipp == wuerfel)
		{
			tf.setText("");
			lbOver.setText("Unentschieden!");
		}
			else if((tipp == 0 && wuerfel == 2) || (tipp == 1 && wuerfel == 0) || (tipp == 2 && wuerfel == 1))
			{
				tf.setText("");
				lbOver.setText("Sie haben gewonnen!");
			}
				else
				{
					tf.setText("");
					lbOver.setText("Sie haben verloren!");
				}
		tf.setText(String.valueOf(wuerfel));
		validate();
		return true;
	}
}

Ist immer noch ein normales Applet, für ein JFrame brauch ich noch ein bisschen.
 
S

SlaterB

Gast
> trotzdem wird nicht neu gewürfelt wenn ich auf einen anderen Button klicke

ja weil nirgendwo der Code dafür steht,
schreibe doch einfach

wuerfel = (int)(Math.random()*3);
in den ActionListener, und schon ist der Code da?!
 

Antoras

Top Contributor
Stimmt, ich trottel. Langsam blick ich gar nichts mehr. Aber das wird schon irgendwann mal.

Ich bin leider noch immer nicht fertig.
Ich würde gern die 0, 1 und 2 mit Schere, Stein und Papier ersetzen. Und das in dem Textfeld. Nach Codes, die ich gefunden hab, hab ich das gebaut: "0".replace("0" , "Schere"); Das steht in der action-Methode. Es geht nur nicht. Fehlt da noch was? Macht das Textfeld Probleme?

Und tut mir leid, dass ich so viel Hilfe brauch.
 
S

SlaterB

Gast
Zahlen kann man passende Strings zuordnen, ja,
replace auf String ist eine Java-Operation, ja,
wenn du noch Probleme hast, dann ist ist dein Code gewiss fehlerhaft, ja,

mehr kann man weiß Gott nicht sagen ohne Code oder Beschreibung

--------

allgemein:

String st = "5";
st.replace("5","6");
dann ist st immer noch "5", es muss
st = st.replace("5","6");
lauten

--------

verwende übrigens lieber eh ein String[3] {"Schere", .. ,..}
Tipp == 0 -> in array[0] steht der passende Tipp
 

Antoras

Top Contributor
Der replace-Befehl geht noch immer nicht:

Code:
import java.awt.*;
import java.applet.*;

public class SchereSteinPapierSpiel extends Applet
{
	private int tipp, wuerfel;
	String st = "0";                                                           //<-------------------------------------------
	FlowLayout FL = new FlowLayout();
	
	Label lbHead = new Label("Treffen Sie eine Wahl:");
	Label lbCom = new Label("Der Computer hat gewählt:");
	Label lbOver = new Label("");
	
	Button btSchere = new Button("Schere");
	Button btStein = new Button("Stein");
	Button btPapier = new Button("Papier");
	
	TextField tf = new TextField(4);
	
	public void init(){
		setLayout(FL);
		add(lbHead);
		add(btSchere);
		add(btStein);
		add(btPapier);
		add(lbCom);
		add(tf);
		add(lbOver);
	}
	public boolean action(Event e, Object o){		
		wuerfel = (int)(Math.random()*3);
		if(e.target == btSchere){
			tipp = 0;
		}	else if(e.target == btStein){
			tipp = 1;
			}	else if(e.target == btPapier){
				tipp = 2;
				}
		if(tipp == wuerfel){
			tf.setText("");
			lbOver.setText("Unentschieden!");
		}	else if((tipp == 0 && wuerfel == 2) || (tipp == 1 && wuerfel == 0) || (tipp == 2 && wuerfel == 1)){
			tf.setText("");
			lbOver.setText("Sie haben gewonnen!");
			}	else{
				tf.setText("");
				lbOver.setText("Sie haben verloren!");
				}
		tf.setText(String.valueOf(wuerfel));
		st = st.replace("0" , "Schere");                              //<--------------------------------------
		validate();
		return true;
	}
}
 
S

SlaterB

Gast
replaceAll, aber völlig egal,
ein Array ist einfacher und schöner
 

Antoras

Top Contributor
replaceAll geht auch nicht :cry:

Und wie soll ich ein String Array realisieren? Meine IDE nimmt String[] nicht an.
 

Antoras

Top Contributor
Ok, das String Array geht jetzt. Hab mist gebaut.

Trotz allem wird nichts umgewandelt. Was ist jetzt noch falsch?

Code:
import java.awt.*;
import java.applet.*;

public class SchereSteinPapierSpiel extends Applet
{
	private int tipp, wuerfel;
	String st[] = {"0" , "1" , "2"};
	FlowLayout FL = new FlowLayout();
	
	Label lbHead = new Label("Treffen Sie eine Wahl:");
	Label lbCom = new Label("Der Computer hat gewählt:");
	Label lbOver = new Label("");
	
	Button btSchere = new Button("Schere");
	Button btStein = new Button("Stein");
	Button btPapier = new Button("Papier");
	
	TextField tf = new TextField(4);

	public void init(){
		setLayout(FL);
		add(lbHead);
		add(btSchere);
		add(btStein);
		add(btPapier);
		add(lbCom);
		add(tf);
		add(lbOver);
	}
	public boolean action(Event e, Object o){		
		wuerfel = (int)(Math.random()*3);
		if(e.target == btSchere){
			tipp = 0;
		}	else if(e.target == btStein){
			tipp = 1;
			}	else if(e.target == btPapier){
				tipp = 2;
				}
		if(tipp == wuerfel){
			tf.setText("");
			lbOver.setText("Unentschieden!");
		}	else if((tipp == 0 && wuerfel == 2) || (tipp == 1 && wuerfel == 0) || (tipp == 2 && wuerfel == 1)){
			tf.setText("");
			lbOver.setText("Sie haben gewonnen!");
			}	else{
				tf.setText("");
				lbOver.setText("Sie haben verloren!");
				}
		tf.setText(String.valueOf(wuerfel));
		st[0] = st[0].replaceAll("0" , "Schere");
		validate();
		return true;
	}
}
 
S

SlaterB

Gast
erzählt doch mal mit deutschen Worten, was das Programm machen soll und was falsch ist,
erwartest du, dass das jemand ausführt und sich selber überlegt, was wohl falsch ist?

st[0] = st[0].replaceAll("0" , "Schere");
verstehe ich übrigens nicht,
du hast ein Array mit 0 drin, gut, das kannst du durch Schere ersetzen,
aber was bringt das?

- das Array wird nirgendwo verwendet
- wenn dann führe das Ersetzen einmal am Anfang durch, wieso in jeder Action-Ausführung nochmal?
wenn es einmal ersetzt ist, dann bringen weitere replaceAll doch nix
- warum schreibst du nicht von Anfang an 'Schere' in das Array an diese Position?

du siehst: erst mal überlegen, was das Programm machen soll,
und immer anderen erklären
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben