Nummern-Ratespiel (Simulationen)
Schreiben Sie ein Programm, bei dem die Anwenderin (Spielerin) eine ganze Zahl zwischen 1 und 100 erraten muss. Dabei gibt das Programm immer nur aus, ob die gesuchte Zahl größer oder kleiner als der letzte Versuch ist. Schreiben Sie vorab ein Unterprogramm, das eine (Pseudo-)Zufallszahl zwischen 1 und 100 erzeugt (siehe Kongruenzmethode). Diese Zufallszahl darf der Spielerin natürlich während des Ratens nicht angezeigt werden.
Zusatzaufgabe: Schreiben Sie auch die Umkehrung. Das Programm soll diejenige Zahl raten, die Sie sich als Spielerin oder Spieler vorab gemerkt hatten.
2 Kommentare
8 Lösung(en)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int eingabe;
int zufallszahl = (int) ( Math.random() * 100 + 1 );
Scanner sc = new Scanner( System.in );
do {
System.out.print( "Ihr Tipp: " );
eingabe = sc.nextInt();
if ( eingabe > zufallszahl )
System.out.println( "Zu gross" );
else if ( eingabe < zufallszahl )
System.out.println( "Zu klein" );
else
System.out.println( "Jawohl, " + zufallszahl + " !" );
} while ( eingabe != zufallszahl );
}
}
import static utility.Einlesen.*;
/*------------------------*/
/* Zusatzaufgabe */
/*------------------------*/
/* Kopieren != Kapieren */
public class Main {
public static void main(String[] args) {
new Main().top();
}
int oberezahl = 101;
int unterezahl = 1;
int mittelwert = 0;
String antwort = "";
int i = 0;
void top() {
while (!antwort.equals("ja")) {
i++;
zahlraten();
System.out.println(mittelwert);
pruefen();
if (antwort.equals("nein")) {
zahlen();
}
}
if (i == 1) {
System.out
.println("Der Computer brauchte nur einen Versuch um deine Zahl zu erraten!");
} else {
System.out.println("Der Computer brauchte " + i
+ " Versuche um deine Zahl zu erraten.");
}
}
public void pruefen() {
antwort = einlesenString("Ist die geratene Zahl richtig? [ja/nein]");
if (!antwort.equals("ja") && !antwort.equals("nein")) {
System.out.println("Nur 'ja' oder 'nein' eingeben!");
pruefen();
}
}
public void zahlraten() {
if (i > 1) {
mittelwert = (oberezahl + unterezahl) / 2;
}
if (i == 1) {
mittelwert = (int) (Math.random() * 100 + 1);
}
}
String hoehe;
public void zahlen() {
hoehe = einlesenString("Ist Ihre Zahl hoeher oder tiefer? [h/t]");
if (!hoehe.equals("t") && !hoehe.equals("h")) {
System.out.println("Nur 't' oder 'h' eingeben!");
zahlen();
}
if (hoehe.equals("h")) {
unterezahl = mittelwert;
}
if (hoehe.equals("t")) {
oberezahl = mittelwert;
}
}
}
Lösung von: Mattias Pliska (Credit Suisse)
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int iZahl;
int iZufall;
//Zufallszahl generieren
srand(time(NULL));
iZufall = rand() % 99 + 1;
do {
//Die Zahl abfragen
system("cls");
printf("Bitte geben sie eine Ratezahl ein: ");
scanf("%i", &iZahl);
fflush(stdin);
//Prüfen ob die eingegebene Zahl kleiner oder grösser ist
if(iZahl > iZufall) {
system("cls");
printf("Ihre Zahl ist groesser als die geheime Zahl!");
getchar();
} else if(iZahl < iZufall) {
system("cls");
printf("Ihre Zahl ist kleiner als die geheime Zahl!");
getchar();
}
//Geht raus wenn die Zahlen gleich sind
} while(iZahl != iZufall);
system("cls");
printf("Die Zahl %i ist richtig!", iZahl);
getchar();
return 0;
}
Lösung von: Elias Zech (Optics Balzers)
/*******************\
| BASIS-AUFGABE: |
| userin errät zahl |
\*******************/
let
// die zu erratende zahl
solution = Math.floor(Math.random() * 101 + 1),
// geratene zahl der userin
guess = prompt('Gib eine Zahl zwischen 1 und 100 ein:');
while (guess != solution) {
if (guess > solution) guess = prompt(`Meine Zahl ist kleiner als ${guess}`);
else guess = prompt(`Meine Zahl ist größer als ${guess}`);
}
alert(`Jepp! Meine Zahl ist ${solution}.`);
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
/********************************\
| ZUSATZ-AUFGABE: |
| computer errät zahl der userin |
\********************************/
let min = 1,
max = 101,
guess = 50;
// eingabemaske
document.write(`
<div id="field">
<p id="display">Denke dir eine Zahl zwischen 1 und 100.<br>Ist deine Zahl <b>${guess}</b>?</p>
<button onclick="checkMyGuess(-1)">Kleiner.</button>
<button onclick="checkMyGuess(1)">Größer.</button>
<button onclick="checkMyGuess(0)">Ja, stimmt!</button>
</div>
`);
let display = document.getElementById('display');
// im grunde eine binärsuche
function checkMyGuess(inp) {
switch (inp) {
case -1: max = guess; break;
case 1: min = guess; break;
case 0:
alert("Wusst ich's doch!");
document.getElementById('field').remove();
}
guess = Math.floor(min + Math.ceil(max - min) / 2);
display.innerHTML = (`Ist deine Zahl <b>${guess}</b>?`);
}
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
import java.util.Random;
import java.util.Scanner;
public class RateSpiel {
public static void main(String[] args) {
int min = 1;
int max = 100;
Random random = new Random();
int value = random.nextInt(max + min) +min;
System.out.println(value);
int zahl;
do {
System.out.println("Gebe eine Zahl ein.");
Scanner sc = new Scanner(System.in);
zahl = sc.nextInt();
System.out.println(zahl);
if(zahl > value) {
System.out.println("Deine Zahl ist zu gross.");
}
else if (zahl < value) {
System.out.println("Deine Zahl ist zu klein.");
}
else {
System.out.println("Du hast die Zahl erraten.");
}
} while (zahl != value);
}
}
Lösung von: Name nicht veröffentlicht
// NET 6.x | C# 10.x | VS-2022
var min = 1;
var max = 100;
var maxAttempts = Math.Ceiling(Math.Log(max, 2));
Console.WriteLine($"Denke Dir eine Zahl zwischen {min} und {max}.");
Console.WriteLine($"Ich brauche maximal {maxAttempts} Versuche. :)");
var guess = 0;
var attempts = 1;
while(min <= max) {
guess = (min + max) / 2;
Console.WriteLine($"Ist es die Zahl {guess}?");
Console.Write("(g)rößer/(k)leiner/(j)a: ");
var read = (Console.ReadLine()??"").ToLower()[0];
if (read == 'g') min = guess + 1;
else if (read == 'k') max = guess - 1;
else if (read == 'j') { Console.WriteLine($"Erraten! {attempts} Versuch(e)."); break; }
else { Console.WriteLine("Falsche Eingabe! (g/k/j)"); continue; }
attempts++;
}
if (min > max || attempts > maxAttempts) Console.WriteLine("Da hat wohl jemand geschummelt?!");
else Console.WriteLine($"Die gesuchte Zahl lautet: {guess}");
Lösung von: Jens Kelm (@JKooP)
// C11
#include <stdio.h>
#include <math.h>
#define MIN_NUM 1
#define MAX_NUM 100
int main(void) {
const unsigned int MAX_ATTEMPTS = ceil(log2(MAX_NUM));
printf("Denke Dir eine Zahl zwischen %u und %u.", MIN_NUM, MAX_NUM);
printf("\nIch benoetige maximal %u Versuche. :)", MAX_ATTEMPTS);
unsigned int guess, attempts = 1, min = MIN_NUM, max = MAX_NUM;
char read;
while (min <= max) {
guess = (min + max) / 2;
printf("\nIst es die Zahl %u?", guess);
printf("\n(g)roeßer/(k)leiner/(j)a: ");
fflush(stdout);
scanf("%c%*c", &read);
if (read == 'g') min = guess + 1;
else if (read == 'k') max = guess - 1;
else if (read == 'j') { printf("\nErraten! %u Versuch(e).", attempts); break; }
else { printf("\nFalsche Eingabe! (g/k/j)\n"); continue; }
attempts++;
}
if (min > max || attempts > MAX_ATTEMPTS)
printf("\nDa hat wohl jemand geschummelt?!");
else
printf("\nDie gesuchte Zahl lautet: %u", guess);
}
Lösung von: Jens Kelm (@JKooP)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 1 |
Schwierigkeit: | k.A. |
Webcode: | 4i5d-58ws |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |
Kommentare (2)
/* 8=======================D <- Penis :D */
können Sie mir diesen erklären?
Extrem gute Lösung Herr Pliska! Sie haben wahrscheinlich einen IQ von mindestens 180 Punkten.