C - Zufälliges Würfeln

Sodale hat etwas länger gedauert war kurz weg ;)
Ich habe dir mal hier Das in etwa so aufgebaut wie es ich machen würde. Das sollte dir die größte Hürde nehmen.
Zur erinnerung, Arrays fangen mit 0 an zu zählen, Also eine wurfel[n]=5 ist eine 6 (in meinem Programm).

Code:
int wurfel[5];

void zeichnen()
{
	static const char gfx[5][4] = {"OOO","XOO","OXO","OOX","XOX"}; //Grafik aller mögliche Kombinationen, die Ein Würfel Waagrecht haben kann
	static const int db[6][3] = {{0,2,0},{1,0,3},{1,2,3},{4,0,4},{4,2,4},{4,4,4}}; //Datenbank für Übersetztung von Würfelwert zu Grafik (Schau sie dir an, du wirst verstehen)
	
	for(int r=0; r<3; r++) //Alle Würfelzeilen durchgehen
	{
		for(int w=0; w<5; w++) //Alle würfel durchgehen
		{
			printf("%s", gfx[db[wurfel[w]][r]]); //Magie :D Lös es von innen her auf für besseres Verständnin, wandelt Würfelzahl mit der db in Grafik um
			if(w<4){printf("|");} //Am ende kein | Symbol
		}
		printf("\n"); //Nächste Zeile
	}
}

void wurfeln(const char conf[5])
{
	for(int n=0; n<5; n++)
	{
		if(conf[n] == '1'){wurfel[n] = rand()%6;} //gewählte würfel neu würfeln
	}
	return;
}

int main(int argc, char **argv)
{
	srand(time(0));

	wurfeln("11111"); //initialisierung
	zeichnen();
	printf("3+4 Neu Wuerfeln\n");
	wurfeln("00110"); //entweder
	//wurfel[2] = rand()%6; wurfel[3] = rand()%6; //oder
	//die oder variante ist besser, falls du jedes mal frägst ob Würfel x beibehalten werden soll, die entweder variante, wenn man auf einmal seine Wahl im Format 10101 eingibt.
       //Werte die beibehalten werden sollen, einfach keinen neuen zufallswert zuweisen.
	zeichnen();

	system("pause");
	return 0;
}
 
Zuletzt bearbeitet:
?


PS: muss ehrlich gestehen, kann damit kaum was anfangen weil sehr viele Begriffe dabeisind die mein Compiler nicht versteht :(
 
Win32-API geschwurbels. Unportierbar und natürlich auch komplett idiotisch, es hier zu posten, denn es hilft niemandem und wäre sogar noch weniger hilfreich, wenn es denn dann noch wenigstens funktionierender Code wäre.

Ich kann nur auf mein Ignoranzgebot verweisen.

€: Und Tigerarsch: Echt jetzt, wenn du schon vor jemandem, der gerade anfängt den Schwanz auspacken willst, mach es doch bitte richtig.
 
Zuletzt bearbeitet:
Grundlegend würde ich es so machen:
Du schreibst dir mehrere Funktionen. Eine, die prinzipiell nur würfelt und die Arrays füllt (also hier die Würfelwerte). Diesen Code würde ich zum Start des Vorganges einfach einmal laufen lassen, dann sind alle Würfel "gefüllt".

Nun kommt der eigentliche Teil deines Holdens:
Hier bietet sich mMn eine einfache Schleife an. Diese fragt nach jedem Würfeldurchgang ab, ob noch einmal gewürfelt werden soll (Y/N) und entsprechend abbricht, wenn man "N" eingibt. (Kann man sicher auch einfacher und kompakter gestalten, für das Verständnis evtl aber doch ganz gut). Dann fragst du ab, welche Würfel geholdet werden sollen/neu gewürfelt werden sollen, z.B. als "1,3". Das würde bedeuten Würfel 1 und Würfel 3 sollen hier neu gewürfelt werden.
Diese Werte kannst du dann per Splitter(-funktion) in die einzelnen Zahlen 1 und 3 zerlegen und kannst somit die entsprechenden Würfel neu würfeln lassen. Die alten lässt du einfach so.

Dazu musst du natürlich noch die ein oder anderen Fehler abfangen etc. aber das gehört nun auch einfach dazu. Viel lesen und testen, und auch mal nebenbei ein anderes Projekt haben, wo man kleine Dinge schnell und effizient testen kann, ohne das gesamte Programm jedes mal starten zu müssen! Das vermeidet Fehler und fördert das Verständnis ;)

Code:
int[] würfeln(int[] würfel){	//würfel[] = neu zu belegender Würfel
	//füllen des Würfels, wie du schon hattest mit Randomizer
	return newWürfel;
}

static void main(...){
	[...]
	//Abfrage der neu zu würfelnden Würfel
	printf("Welche Würfel neu belegen?");
	temp = getInput();				//getInput() = Pseudofunktion, jenachdem wie du deinen Input verarbeitest (Array,...)
	for(jeden in Temp enthaltenen Würfel){
		if(würfelNr == 1){			//wahlweise auch per Switch - Case komfortabel lösbar
			neuBelegterWürfel = würfeln(DeinWürfel1_Array);
			alterWürfel = neuBelegterWürfel;
		}
		else if(würfelNr == 2){
			neuBelegterWürfel = würfeln(DeinWürfel2_Array);
			...
		}
		...
	}
	[...]
}

An dieser Stelle würden sich Pointer auch sehr anbieten und den ganzen Code schlanker machen (denke ich mal), aber das übersteigt wohl derzeitig erstmal deine Kenntnisse und dein Verständnis. Falls du dir das nicht zumuten willst mach es später oder gar nicht.

Ich möchte aber auch darauf hinweisen, dass dieser Code absoluter Pseudocode ist! Er soll bloß Gerüst und Hilfe sein. Wenn überhaupt :D

LG und ich hoffe helfen zu können
Nero
 
Strukturtechnisch:
Wir brauchen eine Würfelfunktion, die braucht keine Parameter.
Code:
int wuerfeln();//Gibt eine Zahl zwischen 1 und 6 zurück
Wir brauchen ein Datenspeicher, der uns sagt, welchen Wert die Würfel haben.
Code:
int wuerfel[3];
Wir brauchen ein Datenspeicher, der uns sagt, welche Würfel wir festhalten sollen.
Code:
int haelt[3]={};
Wir brauchen eine Funktion, die uns die Würfel anzeigt.
Code:
void print_wuerfel(int *wuerfel);
Wir brauchen eine Funktion, die neu würfelt
Code:
void shuffle(int *wuerfel,int *haelt);//Inhalt von wuerfel wird verändert
Wir brauchen eine Funktion, die unser haelt-Array manipuliert (so wie es eingegeben wird).
Code:
ask_holds(int*haelt);//Inhalt von haelt wird verändert
Logik: Abwechselnd würfeln und fragen, welche festgehalten werden sollen.
Code:
shuffle(wuerfel,haelt);
for(int runde=0;runde<RUNDEN;++runde){
print_wuerfel(wurfel);
ask_holds(haelt);
shuffle(wuerfel,haelt);
}
print_wuerfel(wurfel);
Wenn du jetzt diese Funktionen stur ausprogrammierst, sollte es (ansatzweise) funktionieren.
 
Zurück
Oben