Mastermind in C#

10/26/2012 17:22 Rullx3#1
Hey leute ich habe ein kleines problem, in der Schule haben wir die aufgabe bekommen Mastermind zu programmieren ( ein Spiel ) , es soll keine Grafische oberfläche haben, nur eine einfache konsolen anwendung.
Es gibt 10 Versuche , aus 6 verschiedenen farben soll man die 4 richtigen die per zufall ausgewählt wurden herrausfinden.
Für den anfang haben wir in der Schule mit 4 Farben angefangen , der lehrer hat uns aber leider nicht gezeigt wie wir eine random funktion einbauen sondern uns nur auf irgendwelche websites verwiesen.
Code:
	#include <stdio.h>
	#include <stdlib.h>
	#include <time.h>

	int main (void){
	 
	char f1='R'; // farbe 1
	char f2='B';// farbe 2 
	char f3='G';// farbe 3
	char f4='Y';//farbe 4
	

	char r1;// raten 1
	char r2;//raten 2
	char r3;//raten 3
	char r4;// raten 4
	
	int schwarz=0;// wieviele farben richtig sind (counter)
	int weiss=0;// wieviele positionen richtig sind (counter)
	int v=0; // ausgabe falls verlieren (counter)
	
	srand(time(NULL));
	int random  = rand()% 6+1;
    

	if(random==1 ) printf("%c\n",f1);            
        if(random==2 ) printf("%c\n",f2);
        if(random==3 ) printf("%c\n",f3);
        if(random==4 ) printf("%c\n",f4);
         
	do {

	printf("Bitte geben sie 4 Farben an R,B,G,Y in beliebiger Reihenfolge\n");
	scanf("%c %c %c %c",&r1,&r2,&r3,&r4);
	fflush(stdin);
	if (r1==f1)weiss ++;
	else if (r1==f2 || r1==f3 || r1==f4)schwarz ++;	
	
        if (r2==f2)weiss ++;
	else if(r2==f1 || r2==f3 || r2==f4)schwarz ++;
		
	if (r3==f3)weiss ++;
	else if(r3==f1 || r3==f2 || r3==f4)schwarz ++;
	
	if (r4==f4)weiss ++;
	else if(r4==f2 || r4==f3 || r4==f1)schwarz ++;
		
        printf ("Anzahl richtiger Farben Schwarz %i , anzahl richtiger pos weiss %i\n",schwarz,weiss);
	printf ("===============================================================\n");
   
    if (weiss==4) printf("SIE HABEN GEWONNEN!\n");
    else v ++;
    if (v==10) printf("NIETE , LEIDER VERLOREN\n");
    }while (weiss !=4);
    
    
    system("PAUSE");
	return 0;
	}
das ist mein bisheriger code, ich hoffe ihr könnt mir mit der random funktion helfen ich bin gerade richtig am verzweifeln ._.
ps. der lehrer verwies uns darauf das wir dies mit der do while schleife lösen sollen bzw das programm schreiben und keine for schleifen nutzen sollen weil wir die noch nicht im unterricht hatten .
10/26/2012 17:25 MoepMeep#2
[Only registered and activated users can see links. Click Here To Register...]
10/26/2012 17:34 Rullx3#3
Ich versteh trotzdem nicht ganz wie ich es nun anstellen soll das er mir 4 zahlen von 1-4 random mischt und ich diese als die farben deklarieren soll? :(
10/26/2012 17:41 RunzelEier#4
PHP Code:
double uniform_deviate int seed )
{
   return 
seed * ( 1.0 / ( RAND_MAX 1.0 ) );
}
int r uniform_deviate rand() ) * ( );
uniform_deviaterand() ) * ( 

btw:c#?
10/26/2012 17:47 Rullx3#5
Ja wir programmieren in C# mit Visual Studio :x aus deinem code werde ich nicht schlau ._.
10/26/2012 17:48 Nightblizard#6
Okay, lass mich dir in deiner noch jungen Programmiererlaufbahn ein paar gut gemeinte Ratschläge geben.

1. Was ihr da programmiert ist kein C# sondern C. (dafür reißen dir manche Spinner in den Foren den Kopf ab)
2. Benenn deine Variablen anständig. "f1"? "r1"? "schwarz" und "weiß" speicher einen Counter? Da blickt keiner durch.
3. Gewöhne dir schnellstmöglich an sauber einzurücken. Nach jedem { wird in den folgenden Zeilen eins weiter eingerückt und nach jedem } eins weniger. Siehe: [Only registered and activated users can see links. Click Here To Register...]


@Topic:
Wo ist das Problem? In deinem Code unten nutzt du rand doch bereits indem du Zufallszahlen von 1 bis 7 erstellst.
10/26/2012 17:53 Rullx3#7
Tut mir leid eben C ^^
F1 und R1 hat unser lehrer uns vorgeben , wo nutze ich unten den rand mit zufallszahlen von 1-7?;o
Mein problem besteht darin das ich die zufallsfunktion nicht verstehe und ausserdem nicht verstehe wie ichdie zahlen die mir dann ausgegeben werden mit den farben verknüpfen soll, im endeffekt sollen ja die farben gemischt werden und die muss man erraten , desweiteren dürfen keine zahlen doppelt vorkommen was bei mir der fall ist
10/26/2012 18:00 MoepMeep#8
Sag deinem Leher mal bitte, er soll nichts Unterrichten was er nicht kann. Der Informatik Unterricht an Schulen ist echt eine zumutung.
10/26/2012 18:01 Rullx3#9
Leider ist es Programmier unterricht bei meiner schulischen ausbildung :(
Das schlimmste ist er faselt irgendwas und sagt dann macht mal und niemand hat eine ahnung wie es geht oder wie man die funktionen richtig anwenden soll.
10/26/2012 18:04 MoepMeep#10
Dann beschwer dich.
10/26/2012 18:45 Nightblizard#11
Quote:
Originally Posted by MoepMeep View Post
Dann beschwer dich.
Und du meinst deswegen stellen die in der Schule nen Programmierer mit nem Gehalt von 60€/h ein? Wo lebst denn du? Ich wandere sofort aus!

@Topic:

Du nutzt das doch hier:
Code:
int random  = rand()% 6+1;
Der Modulo (%) Operator berechnet dir den Rest einer Division. 5 % 2 == 1 (5 /2 = 2 Rest 1).
Wenn du jetzt also z.B. folgendes machst
Code:
123456876543 % 5
dann erhälst du eine Zahl zwischen 0 und (ausschließlich) 5. Wenn du also nun Zahlen zwischen 1 und 5 erstellen willst, dann machst du halt folgendes:

Code:
1278654567 % 5 + 1
Das erstellt dir eine Zahl zwischen 0 und (ausschließlich) 5 und rechnet darauf dann nochmal +1. 0+1 == 1 und 4+1 == 5. Zwischen 1 und 5!

Ich denke damit solltest du vorran kommen.
10/26/2012 19:29 MoepMeep#12
Quote:
Originally Posted by Nightblizard View Post
Und du meinst deswegen stellen die in der Schule nen Programmierer mit nem Gehalt von 60€/h ein? Wo lebst denn du? Ich wandere sofort aus!
Lieber garkeinen als so einen Unterrricht.
10/26/2012 20:54 RunzelEier#13
wenn der lehrer meint, dass wäre c#, dann sollte er in der tat nicht unterrichten.

hier mal mein code einwenig erläutert:
bei diesem code geht es um die gleichverteilung der Ergebnisse
wenn modulo 5, wie in dem beispiel über mir, kein ganzer teiler von RAND_MAX ist hast du keine gleichverteilung der ergebnisse.

rand() gibt eine zahl zwischen 0 und RAND_MAX zurück
daher macht die funktion uniform_deviate aus dem seed eine zahl zwische 0 und 1.

um nun auf eine zahl zwischen 1 und 4 zu kommen
müssen wir das ergebnis noch einwenig bearbeiten.
uniform_deviate gibt einen wert zwischen 0 und 1 zurück.

wenn wir einen wert zwischen 1 und 2 zurück bekommen wollen können wir dem ergebniss einfach 1 addieren.
wenn wir einen wert zwischen 2 und 3 zurück bekommen wollen können wir das ergebniss einfach mit 2 addieren.
wenn wir einen wert zwischen 76 und 77 zurück bekommen wollen, ...
das prinzip sollte klar sein.

wenn wir einen wert zwischen 0 und 2 zurück bekommen wollen können wir das ergebniss einfach mit 2 multiplizieren.
wenn wir eine wert zwischen 0 und 4 zurück bekommen wollen können wir das ergebniss einfach mit 4 multiplizieren.

wenn wir beides verbinden kommen wir auf den code, den ich vorhin gepostet habe.
wir erzeugen uns mit uniform_deviate eine zahl zwischen 0 und 1, multiplizieren das mit 3 und erhalten eine zahl zwischen 0 und 3.
anschließend addieren wir noch 1 und erhalten eine zahl zwischen 1 und 4

double uniform_deviate ( int seed )
{
return seed * ( 1.0 / ( RAND_MAX + 1.0 ) );
}
int r = 1 + uniform_deviate( rand() ) * ( 4 - 1 ) ;
10/27/2012 19:29 Rullx3#14
Danke habs nun hinbekommen , könnte mir nur jemand dabei helfen das die farben nicht doppelt ausgewählt werden?;O
10/27/2012 20:18 Nightblizard#15
Was hälst du davon dein Hirn selber mal zu benutzen? Mach dir ein paar Gedanken, programmiers runter und wenn es dann noch Fragen gibt, dann postest du deinen Code und sagst uns wo es noch hängt.
Wir machen hier nicht deine Hausaufgaben für dich, nur damit du dann in den Prüfungen durchfällst.