leichte Aufgabe /anfänger

regnitzfan

Grünschnabel
Hallo,

ich brauche Hilfe.


ich soll so ein zahlenspiel machen. Es geht darum, dass ein computer sich eine zahl ausdenkt und der computer versucht sie dann zu erraten und bekommt immer nur gesagt, ob die zahl größer oder kleiner ist als die gedachte zahl oder ob sie dieser entspricht.

mal ein auszug daraus: fette war vorgegeben und darf ich auch nicht ändern.

nur leider macht das Programm keine ausgabe.


protected int checkGuess(int myGuess) {
int result;



int max=100;
int min=1;

int toBeGuessed = min + ((int)(Math.random() * (max - min + 1)));




{while (myGuess!=toBeGuessed)

myGuess= min + ((int)(Math.random() * (max - min + 1)));

{if (myGuess<toBeGuessed)
min=myGuess; }
{if (myGuess>toBeGuessed)
max=myGuess;

} }







System.out.println("The " + ++numberOfGuesses + ". guess is \"" + myGuess + "\" and it is " + (result < 0 ? "too small." : result > 0 ? "too high." : "PERFECT!"));
return result; }
 
Code bitte immer in [ code ] [ / code ] (natürlich ohne Leerzeichen)******

1. Frage: warum denn
max - min + 1
und nicht
max - min?

2. du solltest dir unbedingt noch einmal die Java-Syntax ansehen. Deine geschweiften Klammern gehören nicht vor
Code:
while( Bedingung )
und
Code:
if( Bedingung )
, sondern dahinter!.

3. Les doch noch mal die Aufgabenstellung. Bei deinem Code wäre es sinnlos, das Ergebnis aus
Code:
result
zurückzugeben. Ich vermute, der while-Block ist gar nicht nötig. Aber besser noch mal nachlesen.

4. wer auch immer dir den letzten Brocken vorgetischt hat, sag ihm, dass das unnötig kompliziert ist!

5. du definierst die Variable
Code:
numberOfGuesses
nicht. vielleicht solltest du auf die Fehlermeldungen beim kompilieren und ausführen achten und die hier posten.
 
Zuletzt bearbeitet:
Willkommen bei tutorials.de :)

Mit deiner while-Schleife willst du doch sicher nicht nur die erste Zeile danach, sondern die beiden folgenden if auch mit wiederholen?

Die {} Klammern sind einfach falsch gesetzt.
Es wird nur immer myguess=min+... wiederholt

So wäre es korrekt:

Java:
while (myGuess!=toBeGuessed)
{
    myGuess= min + ((int)(Math.random() * (max - min + 1)));

    if (myGuess<toBeGuessed)
        min=myGuess;
    if (myGuess>toBeGuessed)
        max=myGuess;
}

Gruß

PS: Um den Code auch so wie ich in einer Box darzustellen: [code=java]...[/code]
Macht das Ganze besser lesbar/übersichtlicher.

PPS @ genodeftest: mit dem Tag noparse kannst du dir bei der Tagerklärung auch die Leerzeichen sparen
Und für entsprechendes Syntaxhighlighting kannst du statt code auch java, cpp ... nehmen.
 
Zuletzt bearbeitet:
@sheel: Danke für den Hinweis, wusste ich noch nicht (die [code][/code] Tags haben es bisher auch getan, aber Syntax highlighting ist natürlich noch besser!)
 
hi,

Danke für eure antworten, hab alles nochmals überarbeitet. Laut aufgabenstellung soll zuerst ein programm geschrieben werden, bei dem Computer gegen Computer zahlen rät. also der eine denkt sich eine Zahl aus und der andere errät diese dann systematisch und an der anderen Stelle soll ein Mensch gegen einen Computer raten und der computer denkt sich die zahl aus.

Ich hab von meinem lehrer viel code vorgegeben. ich poste mal meine lösung bis jetzt. Ich fänds nett, wenn ihr die vielleicht korrigieren könntet, weil ich sitze jetzt echts chon lange drübe rund komme nicht weiter und der macht immer jeden fertig, wenn er dummes zeug hinschreibt.. :/




Code:
/**
 * In this game, I will first choose a secret random number, and one of us (either you or me) must guess it iteratively... <br/>
 * All I will reveal for a guess is whether the guess is higher or lower than the secret random number in my mind.<br/>
 * You may use everything that is provided to you in this class, but<br/>
 * DO NOT CHANGE ANYTHING except for the bodies of the methods marked with "ToDo"!
 * 
 */
public class ChildrensGame {
	/**
	 * The smallest possible number I may choose.
	 */
	protected final int MIN;

	/**
	 * The greatest possible number I may think of.
	 */
	protected final int MAX;

	/**
	 * Just for statistics...<br/>
	 */
	protected long numberOfGuesses = 0;

	/**
	 * The secret number between {@link #MIN} and {@link #MAX} (both inclusive) to be guessed.
	 */
	protected final int toBeGuessed;

	/**
	 * Let the games begin (here)!<br/>
	 * There is no need for you to change this method in any way (but you should test your code with different min/max-values...)!<br/>
	 * The secret number to be guessed is chosen between {@link #MIN} and {@link #MAX} (both inclusive).<br/>
	 * @see <a href="http://download-llnw.oracle.com/javase/6/docs/api/java/lang/Math.html#random()">Math.random()</a>
	 * @param args If you don't provide one (whatever), I'll play by myself - otherwise you can puzzle it out...
	 */
	public static void main(String[] args) {
		int min = 1;
		int max = 100;
		int toBeGuessed = min + ((int)(Math.random() * (max - min + 1)));
		ChildrensGame childrensGame = new ChildrensGame(min, max, toBeGuessed);
		if (args.length > 0) {
			childrensGame.playWithYou();
		} else {
			childrensGame.playByMyself();
		}
	}

	/**
	 * Initialises a new game.<br/>
	 */
	protected ChildrensGame(int min, int max, int toBeGuessed) {
		this.MIN = min;
		this.MAX = max;
		this.toBeGuessed = toBeGuessed;
	}

	/**
	 * Checks whether {@code myGuess} is less than, equal or greater than the real secret number {@link #toBeGuessed} and returns the "encoded result" correspondingly.
	 * @param myGuess This is the guess to be evaluated.
	 * @return
	 * <table>
	 * <tr><td>-1</td><td>: if {@code myGuess} is less than the secret value {@link #toBeGuessed}.</td></tr>
	 * <tr><td>0</td><td>: if {@code myGuess} is exactly the the secret value <i>(yeah!)</i></td></tr>
	 * <tr><td>1</td><td>: if {@code myGuess} is greater than the secret value.</td></tr>
	 * </table>
	 */
	protected int checkGuess(int myGuess) {
		int result;

	  
				 










//oben das ist vorgegeben und den block hier hab ich selbst verfasst


				  if(myGuess < toBeGuessed)
				    result = -1;
				  else if(myGuess > toBeGuessed)
				    result = 1;
				  else
				    result = 0;
				 








// das ist wieder vorgegeben



			

		System.out.println("The " + ++numberOfGuesses + ". guess is \"" + myGuess + "\" and it is " + (result < 0 ? "too small." : result > 0 ? "too high." : "PERFECT!"));
		return result;
	}

	/**
	 * I'll choose the secret number {@link #toBeGuessed} and a human player must try to guess it.
	 */
	protected void playWithYou() {{











//das ist wieder selbst verfasst





		    int toBeGuessed;    
		    int myGuess;        
		    int numberOfGuesses;        
		    boolean checkGuess = false;}       

		    public playWithYou()    
		      numberOfGuesses = 1;            
		        
		        generateRandomNum();    
		        System.out.println("Bitte geben Sie ihre Zahl ein: "); 
		    
		    
		        
		        
		        while(checkGuess=false){         
		                           
		            
		                readInput();    
		                compare();     // Vergleicht in jedem Schleifendurchgang die neue Eingabe des Nutzers mit der Zufallszahl.
		        
		        }}
		    
		    private void compare() {
		
		
	}

			private void readInput() {
		
		
	}

			public void generateRandomNum(){
		        System.out.println("***Zufallszahl wurde erzeugt***");
		        Random ran = new Random();
		        toBeGuessed = ran.nextInt(101);
		    
		    
		    public void readInput();{    /* Hier wird die Eingabe des Nutzers eingelesen.
		                         
		        try{
	
		 myGuess = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
		        }catch(Exception e){
		            e.printStackTrace();
		        }
		    }
		    
		    public void compare();               
		    
		        if (myGuess < toBeGuessed){
		            System.out.println("Ihre Zahl ist zu klein!");
		            numberOfGuesses++;      

		        }
		        else if (myGuess > toBeGuessed){
		            System.out.println("Ihre Zahl ist zu groß!");
		            numberOfGuesses++;
		        }
		        else{
		            System.out.println("Sie haben richtig geraten! :)\Sie benötigten dafür " + numberOfGuesses + " Versuche.");
		            numberOfGuesses++;
		            checkGuess = true;           

		        }}}
		    
		







// das ist wieder vorgegeben









	

	/**
	 * I'll just pretend that I don't know the value {@link #toBeGuessed} and puzzle myself over it just like a human player.<br/>
	 * I will do my best to find the secret number within as few steps as possible!
	 */
	protected void playByMyself(){

	}
			//  TODO
	/**
	 * Helper infrastructure, used to read human input.
	 */
	protected int inputInt() {
		try {
			java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
			while(true) {
				System.out.print("Tell me your guess: ");
				String inputString = reader.readLine();
				if (inputString == null) throw new java.io.EOFException();
				try {
					return Integer.parseInt(inputString);
				} catch (NumberFormatException e) {
					System.out.println("- Your input (\"" + inputString + "\") is not a valid number! Try again...");
				}
			}
		} catch (Throwable throwable) {
			System.err.println();
			System.err.println("- Sorry, it just doesn't work here with you... I'll shut down now!");
			System.exit(1);
			return 0;
		}
	}
 
Entfern doch wenigstens ersteinmal die Compilerfehler...
Wenigstens die Klammern und Strichpunkte werden doch kein Problem sein.

edit: Ich muss mich korrigieren.
Es sind nicht nur Klammern und Strichpunkte; es ist grauenhaft.
Hast du keinen Compiler?
 
Zuletzt bearbeitet:
Hier bitte, so würde es gehen.
Ich hab alle Kommentare entfernt (da die meisten wirklich unnötig waren und alles nur unübersichtlich gemacht haben).

Weiters gibt es jetzt keine doppelten Methoden mehr, die unterschiedliche Namen aber den selben Sinn haben.
Wenn dein Lehrer dir schon Methodenköpfe vorgibt, solltest du die nicht nur füllen, sondern die Methoden dann auch aufrufen, statt noch eine eigenen Methode für das Gleiche dazuzuschreiben

Etwas zu tun hast du jetzt aber trotzdem noch ;)
Ich war nicht sonderlich genau damit, was nicht geändert werden darf.

Java:
import java.io.*;

public class ChildrensGame 
{
	protected final int MIN;
	protected final int MAX;
	protected final int toBeGuessed;

	protected boolean checkguess;
	protected long numberOfGuesses;

	public static void main(String[] args) {
		int min = 1;
		int max = 100;
		int toBeGuessed = min + ((int)(Math.random() * (max - min + 1)));
		ChildrensGame childrensGame = new ChildrensGame(min, max, toBeGuessed);
		if (args.length > 0) 
			childrensGame.playWithYou();
		else
			childrensGame.playByMyself();
	}

	protected ChildrensGame(int min, int max, int toBeGuessed) {
		if(max<min)max=min;
		this.MIN = min;
		this.MAX = max;
		this.toBeGuessed = toBeGuessed;
		numberOfGuesses=0;
	}


	protected void playWithYou() {
		System.out.println("Bitte geben Sie ihre Zahl ein: "); 
		while(checkGuess(readInput())!=0){}
	}

	protected void playByMyself(){
		int tempmin=MIN;int tempmax=MAX;int g,r;
		System.out.println("Bitte geben Sie ihre Zahl ein: "); 
		while(true){
			g=tempmin+((int)((tempmax-tempmin)/2));
			System.out.println(""+g);
			r=checkGuess(g);
			if(r==0)break;
			if(r<0)tempmin=g;
			if(r>0)tempmax=g;
		}
	}

	protected int checkGuess(int myGuess) {
		int result=(myGuess<toBeGuessed)?(-1):((myGuess>toBeGuessed)?(1):(0));
		System.out.println("The " + (++numberOfGuesses) + ". guess is \"" + myGuess + "\" and it is " + (result < 0 ? "too small." : result > 0 ? "too high." : "PERFECT!"));
		return result;
	}

	protected int readInput(){
		int i=0;
		try{
			i = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return i;
	}
};

Gruß

PS: Der gesamte Code hat jetzt nicht mehr 247, sondern nur noch 67 Zeilen...was einmal Aufräumen so alles bewirken kann :D
 
Zuletzt bearbeitet:
Zurück