HILFE - Zufallszahlen - Komische Symbole
-
ich poste mal den code(bis jetzt)
int main(void) { int startTime = 0; int endTime = 0; startTime = clock()/CLOCKS_PER_SEC; endTime = (clock()/CLOCKS_PER_SEC) - startTime; srand( (unsigned)time(NULL) ); printf("Mein Spielautomat"); printf("\n\n"); printf("Spielzeit: %d sec", endTime); printf("\n\n"); spielStarten(); printf("\n\n"); return 0; } void spielStarten(void) { char zeichen[3] = { '0', '0', '0' }; int i = 0; int j = 0; char eingabe = 0; int punkte = 0; printf("-------------------"); printf("\n|"); for(i=0; i<3; i++) { printf("%3c |", zeichen[i]); } printf("\n-------------------"); printf("\n(Dr\201cken Sie eine beliebige Taste)"); printf("\n\n"); i = 0; eingabe = getch(); printf("-------------------"); printf("\n|"); while(i < 3) { for(j=0; j<i; j++) { printf("%3c |", zeichen[j] = getZeichen()); } i++; } printf("\n-------------------"); punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]); printf("\n\n"); printf("Ihre Punkte: %d", punkte); } void ausgeben(char *a, char *b, char *c) { } int berechneErgebnis(char a, char b, char c) { /* 1.ziffer * 100 + 2.ziffer * 10 + 3.ziffer a = 10, b = 11, c = 12 wenn 2 oder 3 ziffern gleich sind, dann erg *2 bzw *3 */ int erg = 0; if(a > '9') a = a - 'A' + 10; else a -= 48; if(b > '9') b = b - 'A' + 10; else b -= 48; if(c > '9') c = c - 'A' + 10; else c -= 48; erg = 100*a +10*b + c; if( (a==b) && (a==c) ) erg *=3; else if( (a==b) || (a==c) || (b==c) ) erg *=2; return erg; } char getZeichen(void) { int i = 0; char j; fflush(stdin); i = 1 + ( rand() % 13 ); if( (i>=1) && (i<=9) ) { j = intToChar(i); } if(i==10) j = 'A'; if(i==11) j = 'B'; if(i==12) j = 'C'; return j; } char intToChar(int i) { return (char)i + 48; }
die letzte funktion (die ja überflüssig ist) hab ich noch nicht rausgenommen.
problem ist, glaube ich der Aufruf von spielStarten();
da geht das zeichen[0] nicht mit, also char a bekommt nicht zeichen[0] sondern zeichen[1]...
vielleicht rechnet er deswegen falsch...danke für die mühe!!
-
ich glaub ich hab den fehler. der liegt in spielStarten()
da muss die while-schleife weg und in der for j<3 schreiben, dann rechnet er es auch richtig aus!ich hätte eine andere fragen, gibt es eine möglichkeit, die zufallszahlen anzuzeigen und mit tastendruck zu stoppen??
also wenn ich tastedrücke, soll er los laufen (0-9 und abc) anzeigen und sobald die nächste taste gedrückt wird, soll das nächste feld laufen, bis alle 3 felder was anzeigen.
hättest du da ne idee??danke dir vielmals für die hinweise!!! man lernt immer was dazu!
-
Ich benutze mal nen Auszug aus deinem Programm:
int berechneErgebnis(char a, char b, char c) { printf ( "%d %d %d\n", a, b, c ); return 0; } int main (void) { char zeichen[3] = { '0', '1', '2' }; berechneErgebnis ( zeichen [0], zeichen [1], zeichen [2] ); return 0; }
Da sehe ich keine Probleme, bei der Parameterübergabe.
Ein Problem hast du hier:
i = 1 + ( rand() % 13 );
Mach mal aus der 13 eine 12
Und das hier:
startTime = clock()/CLOCKS_PER_SEC; endTime = (clock()/CLOCKS_PER_SEC) - startTime;
ergibt eine ziemlich kurze Spielzeit.
-
soll eigentlich ein spiel automat werden, wo man drauf drückte (beliebige taste) und die anzeige verändert wird, beim nächste tastendruck dann das 2.feld und dann das 3.feld.
so das alle 3 irgendwann was anzeigen und dann erst die punkte berechnet werden.
dann hab ich warhscheinlich auch eine längere spielzeit lol.hast du da eine idee, wie man das realisieren könnte?? kbhit() vielleicht?? und sleep(400) (sind glaub ich 400ms) so das man überhaupt was sieht.
aber ich wüsste nicht wie ich die zufallszahlen anzeigen lassen könntetips für mich??
Danke!
-
MandaJohn schrieb:
soll eigentlich ein spiel automat werden, wo man drauf drückte (beliebige taste) und die anzeige verändert wird, beim nächste tastendruck dann das 2.feld und dann das 3.feld.
so das alle 3 irgendwann was anzeigen und dann erst die punkte berechnet werden.
dann hab ich warhscheinlich auch eine längere spielzeit lol.Jo, aber wenn du den Code so lässt, dann ändert das nix und die Spielzeit bleibt gleich. Ein paar Mikrosekunden oder so. Du stoppst ja, bevor das Spiel überhaupt angafangen hat.
Hast du den Zufallswert geändert?1 + ( rand() % 13 );
kann auch mal 13 werden.
Du wolltest aber einen Maximalwert von 12 haben, oder?MandaJohn schrieb:
hast du da eine idee, wie man das realisieren könnte?? kbhit() vielleicht?? und sleep(400) (sind glaub ich 400ms) so das man überhaupt was sieht.
aber ich wüsste nicht wie ich die zufallszahlen anzeigen lassen könntetips für mich??
Danke!Ist das Programm für die Schule oder ist das dein privates Interesse?
Mach erstmal den Code vernünftig.
Ansonsten geht das mit der WinApi oder mit Curses oder so, je nach OS.
-
ja das mit rand() % 13 hab ich auf 12 geändert...
das ist eine aufg. die wir bekommen haben. und wenn ich stecke, so wie bei der berechnung, dann frag ich hier...
aber ich versuch es auch alleine, nich das ich nur auf antworten warte lol
ich denke so lern ich ja auch dazu...
das mit kbhit() und sleep versuch ich mal...vielleicht klappts jadanke für deine hilfe!!
gruß
manda
-
#include <windows.h> #include <stdio.h> #define CONSOLE_Y 80 void geilomat_set_pos ( int x, int y ) { COORD xy; xy.X = (short)x; xy.Y = (short)y; SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), xy ); } void geilomat_clear_line ( int y ) { int i = 0; geilomat_set_pos ( 0, y ); while ( i++ < CONSOLE_Y ) putchar(' '); } void geilomat_clear_display () { geilomat_set_pos ( 5, 5 ); printf ( "0" ); geilomat_set_pos ( 7, 5 ); printf ( "0" ); geilomat_set_pos ( 9, 5 ); printf ( "0" ); } void geilomat_welcome () { geilomat_set_pos ( 5, 0 ); puts (" - Geilomat Version 1.0.0.1 - Beta. -\n"); geilomat_set_pos ( 5, 1 ); puts ("Welcome to Geilomat! Hit any key to start.\n\n"); geilomat_clear_display (); getch(); } void geilomat_init () { srand((unsigned)time( NULL )); } int geilomat_get_random_number () { return 1 + rand() % 12; } char geilomat_int_to_char ( int a ) { if ( a < 10 ) return a + 48; else return a + 55; } int geilomat_display_number ( int x, int y ) { int sleep_time = 100; int n = 0; int number = 0; while ( n++ < 10 ) { geilomat_set_pos ( x, y ); number = geilomat_get_random_number ();; printf ( "%c", geilomat_int_to_char(number) ); Sleep(sleep_time); } return number; } int geilomat_calculate ( int a, int b, int c ) { return 100 * a + 10 * b + c; // oder was auch immer :D } void geilomat_run () { int a = 0, b = 0, c = 0; int result = 0; geilomat_clear_display (); a = geilomat_display_number ( 5, 5 ); // Hier kannst du noch dein getch() einbauen. b = geilomat_display_number ( 7, 5 ); // Hier kannst du noch dein getch() einbauen. c = geilomat_display_number ( 9, 5 ); // Hier kannst du noch dein getch() einbauen. result = geilomat_calculate ( a, b, c ); geilomat_set_pos ( 5, 7 ); printf ( "Your points: %d\n", result ); } void geilomat_good_bye () { geilomat_set_pos ( 5, 9 ); puts ("Good Bye!"); puts(""); } int main (void) { geilomat_init (); geilomat_welcome (); do { geilomat_clear_line ( 7 ); geilomat_clear_line ( 8 ); geilomat_run (); geilomat_set_pos ( 5, 8 ); Sleep ( 1000 ); printf ( "To play again hit 'y', hit any other key to quit." ); } while ('y' == getch ()); geilomat_good_bye (); return 0; }
Hab dir was zum wach werden getippt,
vielleicht kannst du was davon verwerten. Eventuell den einen oder anderen Funktionsnamen ändern
Die einzelnen Startkommandos mit getch() kannst du in der run - Funktion einbauen.
Gruß,
B.B.
-
wow...erstmal da durch steigen...
aber da muss man erstmal drauf kommen
danke dir viel mals!!ich probier mal was ich verwenden könnte...
gruß
manda
-
Alles klar, gutes Gelingen!
Gruß,
B.B.
-
hat sich alles erledigt! Danke an B.B!!! (hab das auf meine weise bisschen einfacher gemacht :))
gruß
manda