C - Zufälliges Würfeln

Protonchen

Cadet 1st Year
Registriert
Dez. 2013
Beiträge
9
Hallo liebe Mitlgieder! Vielleicht kann mir jemand helfen, habe folgendes Programm erstellt, bzw. das ist die MINIMINIMINI-Version vom ganzen Programm!

PHP:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <conio.h>
 
 
int zahl[3];                        // 3 Werte
int anz;
char ausg[3][14];
 
/*******************************************************************/
//Funktion zufallszahl
void wuerfel(int zahl[], int anz)
{
    int i;
    for (i=0; i<anz;i++)
    
                                            //srand(time(0));  //bei 5 Würfel egal
    zahl[i]=1+rand()%3;
    return;
}
 
 
//Ausgabe Würfel switch case
void zeichnen (int wert1, int wert2, int wert3)
    {
        int z,s;
        for (z=0;z<3;z++)
            {for (s=0;s<14;s++)
                 ausg[z][s]=' ';
                 }                              //Array mit Leerzeichen initialisieren
               
            
    
     switch (wert1)                             //Werte fuer Wuerfel 1 in Array eintragen
        
            { case 1:
            ausg[1][1]='x';
            break;
        
            case 2:
            ausg[1][1]='x';
            ausg[1][2]='x';
            break;
        
            case 3:
            ausg[0][1]='x';
            ausg[1][1]='x';
            ausg[2][1]='x';
            break;
            }
          
      switch (wert2)                            //Werte fuer Wuerfel 2 in Array eintragen
        
            { case 1:
            ausg[1][6]='x';
            break;
        
            case 2:
            ausg[1][6]='x';
            ausg[1][7]='x';
            break;
        
            case 3:
            ausg[0][6]='x';
            ausg[1][6]='x';
            ausg[2][6]='x';
            break;
            }
          
        switch (wert3)                            //Werte fuer Wuerfel 3 in Array eintragen
        
            { case 1:
            ausg[1][11]='x';
            break;
        
            case 2:
            ausg[1][11]='x';
            ausg[1][12]='x';
            break;
        
            case 3:
            ausg[0][11]='x';
            ausg[1][11]='x';
            ausg[2][11]='x';
            break;
            }
                   
     //Wuerfel zeichnen 
     printf("---- ---- ----\n");
   
     for (z=0;z<3;z++)
            {
                       for (s=0;s<14;s++)
                           {
                                        printf("%c",ausg[z][s]);
                                        }
                       printf("\n");
                       }
          
      printf("---- ---- ----\n");             
    }
 
 
 
/******************* MAIN *************************/
 
int main(int argc, char **argv)
{
 
    srand(time(0));                    //definiert man hier nochmal damit es WIRKLICH zufaellig ist!
    wuerfel (zahl,3);              //ruft die Funktion auf; 5... alle 5 Wuerfel
    
    zeichnen(zahl[0], zahl[1], zahl[2]);
 
 
char hold[]={49,50,51},h;
int i,f=1;
  
      printf("\nWeiter w%crfeln=<enter>\n",129);
 
    do
    {
    printf("hold?\t<%c>\t<%c>\t<%c>\r",hold[0],hold[1],hold[2]);
    h=getch();
    f=h;
   
    for (i=0;i<5;i++)
        {
            if (hold[i]==h)
            {
                hold[i]=219;    // 219 ist Ascii fuer viereckiges Zeichen...
            }
            }                      
    }
    while (f!=13);  //Abbruchbedingung ENTER Ascii = "13" CR
 
 
    return 0;
}


Ich möchte es nun schaffen, je nachdem welche Zahlen ich bei der hold-Funktion eingebe, dass nochmal gewürfelt wird, aber nur die würfel welche ich nicht "holde",

sprich, wähle ich 2 und 3, dann soll nur der erste würfel nochmal gewürfelt werden und 2 und 3 unverändert bleiben, wähle ich nur 2 sollen nur der erste und 3 würfel nochmal gewürfelt werden und der 2. bleibt unverändert!

eigentlich habe ich das mit 5 würfeln programmiert, aber nur mal zum verständnis hier mit 3, damit ich vielleicht das system dahinter durchblicke :-(

Würde mich über Hilfestellungen sehr freuen!
Danke!
 
Gib der Funktion, die Würfelt mit, welche Variablen aktualisiert werden sollen. Zum Beispiel so:

Code:
void wuerfel(int *zahl, int *welche, int anz) {
    int i;

    for(i = 0; i < anz; i++)
        if(welche[i])
            zahl[i] = [...];
}

[...] (main)

    welche[0] = 1;
    welche[1] = 0;
    welche[2] = 1;

    wuerfel(zahl, welche, 3);

[...]

Allgemein gibt es viel an dem Programm zu verbessern und auch mein Vorschlag ist nichts, das ich wirklich machen würde, aber ich denke, es wird dir kaum helfen, wenn ich jetzt 3578929258 großartige Methoden aufwerfe, am Ende doch das selbe zu erreichen. Sowas kommt hier eigentlich immer, wenn ein Neuling etwas postet, deshalb warne ich im Vorfeld davor, sich das zu Herzen zu nehmen, bevor man etwas fortgeschrittener ist. Frustration wäre die unweigerliche Folge.
 
Hallo! Danke für die schnelle Antwort, leider versteh ich das noch nicht so ganz wie du das meinst :-(
 
Also, wo genau dein Problem liegt, müsste ich dann schon noch wissen, bevor ich dir weiter helfen kann.
 
Also er meint, dass du der wuerfel-Funktion ein weiteren Parameter mitgeben sollst, die ihr sagt, welche Würfel du überhaupt ändern sollst. (Der Parameter kann bspw. ein int-Array sein, das !=0 ist, falls der Würfel mit den Index gewürftelt werden soll).

BTW: Globale Variablen vermeiden, auch wenn man dann mehr Funktionsparameter braucht. Was nicht global sein muss, soll nicht global sein.

BTW2: Deine Ausgaberoutine könnte man schön kompakt machen:
Code:
void zeichnen(int*werte,int anzahl){
	static const char layout[7][3][4]={{},//0, gibt's nicht
		{
			"   ",
			" x ",
			"   "
		},
		{
			"x  ",
			"   ",
			"  x"
		},
		{
			"x  ",
			" x ",
			"  x"
		},
		{
			"x x",
			"   ",
			"x x"
		},
		{
			"x x",
			" x ",
			"x x"
		},
		{
			"x x",
			"x x",
			"x x"
		}
	};
	for(int i=-1;i<4;++i){
		for(int j=0;j<anzahl;++j)
			if(i==-1||i==3)
				printf(" ---  ");
			else
				printf("|%s| ",layout[werte[j]][i]);
		printf("\n");
	}
}
Mich erinnert dein Programm an Kniffel, willst du das nachprogrammieren?
 
Hancock schrieb:
BTW2: Deine Ausgaberoutine könnte man schön kompakt machen:
Sowas meine ich mit Verschlimmbesserungsvorschlägen, die man ignorieren sollte. Falls das nicht offensichtlich ist.

Die Erklärung meines Vorschlags zur Sache ist allerdings richtig.
 
Danke erstmal für alle Antworten, ich scheitere leider komplett an der Umsetzung, neuer zusätzlicher Parameter etc... von der Logik her klar, aber wie ich dass nun so definiere und einbaue das es läuft :freak:

Sobald ich das mit dem "Halten" hinbekommen habe kann ich gern mal mein ganzes Programm reinstellen :-) Bin was C programmieren betrifft echt blutiger Anfänger, deswegen scheinen meine Programmierversuche oftmals eher übertrieben und so manches ist überflüssig, aber ich habs eher übersichtlich, vor allem wenn man sich noch so gut wie gar nicht auskennt :-(

Hancock schrieb:
Mich erinnert dein Programm an Kniffel, willst du das nachprogrammieren?

Es wird zum Schluss (hoffentlich:D) Würfelpoker ;-)

LG
 
Was fällt dir schwer? Wie du es schreiben musst, oder wo?
Falls du mit der Syntax Probleme hast, hilft dir der Compiler gerne weiter (aktiviere alle Warnungen). (Sonst im Notfall auch Google bzw. wir).
Falls du nicht weißt, wie man etwas schreiben soll, Blatt Papier und darauf rummalen hilft da oft.
 
wie und wo, leider :-(
Aber, möchte hier nicht dass jemand mein Programm für mich schreibt, sobald ich nachher ein bisschen Zeit habe, werde ich mal bisschen basteln und die Ergebnisse hier teilen, vielleicht kann mir dann ja jemand von euch ein bisschen weiterhelfen! :-)
Ergänzung ()

ich kapituliere :-(, verstehe , je mehr ich versuche, gar nichts mehr :-((((((
 
Zuletzt bearbeitet:
Das wäre eine schöne Aufgabe um in C++ gelöst zu werden. Denn ganz so leicht ist sie nicht (Um nicht zu sagen, für einen anfäger in C ziemlich schwierig). Wie mir scheint, hängt es bei dir an einem Übertragungsweg, um einer Funktion explizit zu sagen, welche Würfel sie Aktualisieren soll. Die für einen Anfänger verständlichste Methode finde ich, würde darin bestehen, einen String mit fester Größe als Parameter zu übergeben.

Also dein Array Zahl repräsentiert meiner Meinung nach den Würfel. Würfel 1, Zahl[0], ist z.B. 3 und Würfel 3, Zahl[2], ist 5. (lass den Array für den Anfang einfach Global)
Du erstellst eine funktion Wurfeln(), welche als Parameter einen String akzeptiert. z.B. Wurfeln("101"); Aktualisiert Würfel 1&3. Auf die Elemente eines solchen C-Strings kannst du wie auf einen eindimensionales Array zugreifen.

Code:
void wurfeln(const char conf[3])
{
	printf("%s\n\n", conf);
	for(int n=0; n<3; n++)
	{
		if(conf[n] == '1'){printf("J");} //Du musst keine hex codes verwenden. 'A' ist für den compiler z.B. 0x41
		printf("%c\n", conf[n]);
	}
	return;
}

Wenns noch fragen gibt melde dich!

Hm du programmierst sicherlich mit Codeblocks oder so, das macht das ganze für einen Anfänger noch mühsamer. Ich würd dir Visual Studio (2012) empfehlen, da macht Programmieren einfach Spaß. Kapitulieren ist immer Schlecht. versuch dich an was leichterem.
 
Zuletzt bearbeitet:
Ich würde dir raten nicht mit C anzufangen. Ist zwar bekannt und verbreitet, aber auch eine der ältestenen und einsteigerunfreundlichsten Sprachen. Ich würde dir stark zu Python oder (falls Windows) C# raten.

C/C++ ist sehr schwer zu verstehen am Anfang, weil man viel Verwaltungskram machen muss, der vom eigentlichen Programmieren ablenkt und erst mittelfristig verständlich ist.

Allgemeiner Tip: Versuch dein Problem in möglichst viele kleine Teilprobleme zu zerlegen und frag dann primär nach den Teilproblemen. Dann ist es auch leicht gute Tips zu geben.
 
das Problem ist, ich MUSS damit programmieren und muss auch C verwenden, ist eine einsemestrige Vorlesung auf meiner Uni und nun soll ich das Spiel als Projekt programmieren :-(
 
C ist die Einfachste Sprache nach ASM. Einmal das Grundprinzip verstanden und es läuft. Verwaltungskram ist Bonuswissen, für den Anfang reicht ja zu wissen was Debug/Release und statisch linken ist. Programmierst ja nicht mit notepad und ner konsole. Ich finde es gewissermaßen berechtigt, dass Technische Studiengänge soetwas mitbringen. Ich mach dir mal ein Grundgerüst schön kommentiert ;)

Was ist es genau für ein Spiel?
 
Zuletzt bearbeitet:
Das hat man uns auch gesagt, wenn man C verstanden hat dann kann man auf dem Wissen schön weiter aufbauen :-) ;-)
Leider tu' ich mich sehr schwer da ich von ner AHS komme und noch NIE in meinem Leben programmiert habe.
Es SOLLTE Würfelpoker werden ...

Also einfach nur diese hold-Funktion, wo ich auswählen kann welche Würfel (bei meiner ''großen'' Version sind es dann 5 Würfel) ich nach einer Runde eben ''halten'' will und welche nochmal gewürfelt werden sollen, danach wird abgebrochen und es kommt eine Abfrage, ob man den spielstand speichern möchte, aber erstmal ist dieses ''halten'' eine Monster-Hürde für mich, da merkt man halt dass ich nicht wirklich sattelfest im programmieren bin :( wobei ichs gern wär, finde es eigentlich sehr lustig was man damit alles so machen kann :)
 
Ok, dann gehen wir nur mal auf die halte-Logik näher ein. Was genau ist deine Idee? Wie wolltet du sie programmieren?

Grundsätzlich muss ja folgendes passieren:
- Drei Würfel werden gewürfelt.
- Spieler wird gefragt, ob er Würfel 1 behalten möchte
- Wenn nein Würfel jetzt neu Würfeln
- Wiederholen für die weiteren Würfel

Schreib dir Kommentare über die einzelnen Bestandteile des Algorithmus, um besseren Überblick zu behalten.

Das neuwürfeln kannst du als ein Unterproblem betrachten. Die Wüfelergebnisse kannst du in einem Array speichern, das so viele Einträge wie Würfel enthält. Außerdem hat dich ja schon jemand darauf hingewiesen, dass man bei Chars nicht immer die ASCII-Tabelle braucht:
Code:
char blubb = 'c';
if (blubb == 'c') {
 ...
}

Außerdem: Variablen sinnvoll benennen, dann kann man dir auch viel leichter helfen.

edit: Noch mehr Anmerkungen:
- Der Zeichnen-Routine kannst du einfach das Array-übergeben, anstatt der einzelnen Zahlen
- Globale Variablen sollten (fast) immer vermieden werden, lieber als Parameter durchreichen, wo benötigt und in main/Unterfunktion deklarieren.

Im Übrigen warst du in deinem ersten Post schon nicht so weit von einer Lösung weg, ich glaube, dass du primär mal den Code aufräumen solltest, damit du wieder selbst weißt, was du tun willst.
 
Zuletzt bearbeitet:
mhm ich dachte da war ich meilenweit von entfernt :-(

nicht auslachen, ich hatte schonmal vor einigen Tagen den primitivsten Versuch überhaupt gestartet, nämlich einfach die Anzahl der zahlen in meiner Funktion wuerfel zu ändern....

wuerfel(zahl,1) // nur 1. Zahl zufällig
wuerfel(zahl,2)//ersten beiden zahlen nochmal
usw...

dann dachte ich, es würde vielleicht auch so gehen:
wuerfel(zahl,1&&2)
oder wuerfel(zahl,1&&3)...

falsch gedacht, geht nicht :-(

uijeh, ihr müssts euren 'Spaß' mit mir haben, ich denke ich lass den Anfänger echt sehr heraushängen :(

PHP:
wuerfel (zahl,1);   				//nur 1. Zahl nochmal ändern	
	printf("%d\n",zahl[0]);
	printf("%d\n",zahl[1]);
    printf("%d\n",zahl[2]);

	printf("\n\n");
	
	zeichnen(zahl[0],zahl[1],zahl[2]);
 
Jeder war mal Anfänger, manche sind nur zu arrogant, um sich daran zu erinnern. :D

Einen guten Tip habe ich. Um einen bestimmten Würfel zu ändern, kann du einfach die Stelle des Würfels im Array überschreiben.
Code:
char[] wuerfel = {'2', '5', '2'}; //Array der Länge ist 3, also Indizes 0, 1, 2
...
// der Spieler will den zweiten Würfel ändern
wuerfel[1] = neuwuerfeln();
...
// oder
neuwuerfeln(wuerfel, 1);
// und in neuwuefeln
void neuwuerfeln(char *wuefel, int wuerfelIndex) {
  ...
  wuefel[wuerfelIndex] = ...; //hier den neugewürfelten Wert setzen
}
(alles ungetestet :) )
Deine Idee mit dem "Und" für die Auswahl der Würfel geht leider nicht. Du kannst aber stattdessen die Neuwürfel-Funktion mehrfach mit alle Indizes aufrufen, die der Spieler ändern will.
Davor musst du aber erstmal ermitteln, was der Spieler eigentlich ändern will. Am besten also das Problem zerlegen, in dem du ihn für jeden Würfel einzeln fragst. Dann musst du auch immer nur einen Würfel in "Neuwürfeln" ändern können.
 
Zuletzt bearbeitet:
Der in der Initialisierung des Würfel-Arrays? Den hab ich nur zwecks Beispieldaten gesetzt. Da musst du halt am Anfang einmal für jeden Array-Index würfeln und den Wert im Array eintragen.

Vllt ist dein Hauptproblem, dass du die Anzahl der Würfel beim würfeln verwendest (was zu initialiseren des Arrays auch ok ist). Zum Neuwürfeln willst du aber den Index eines bestimmten Würfels verwenden: Den, der neu gewürfelt werden soll.
 
Zurück
Oben