HILFE - Zufallszahlen - Komische Symbole

Manda

Erfahrenes Mitglied
Hallo Leute,
ich stehe gerade (wahrscheinlich) auf dem Schlauch und komme nicht weiter...Deswegen meld ich mich mal bei euch und hoffe auf hilfe..
Ziel:
- Spielautomat entwickeln, der zu anfang 0 0 0 anzeigt.
- dann auf tastendruck eine zufallszahl (1-12) erzeugt wird und ausgegeben wird
(A = 10, B = 11, C = 12 und <9 einfach die Zahl anzeigen, sonst Buchstaben)
- dann die Punkte berechnen(nach Formel, siehe Code...)

Problem:
- Punkte berechnen :( bei mir gibt er total komische Zeichen aus und keine Zahl
die Funktionsnamen mit Rückgabe und Parameter ist Vorgegeben , soll am besten nicht verändert werden.


Code: Hab den kommentiert...hoffe ihr versteht es!
C:
int main(void)
{
   spielStarten();
   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: %c", punkte);
}

void ausgeben(char *a, char *b, char *c)
{
	
}

//parameterliste ist VORGABE mit char, und return mit int!!
int berechneErgebnis(char a, char b, char c)
{
	//1.ziffer * 100 + 2.ziffer * 10  + 3.ziffer
	//a=10, b=11, c=12
	//2ziffer gleich, erg*2 ; 3ziffern gleich, erg*3 [<-DAS FEHLT NOCH!!]
	//kann man die Berechnung "kürzer" gestalten?
	//sieht unschön aus :(
	int erg = 0;
	
	if(a < 9)
		a = a * 100; // WARUNUNG: '=': Verkuerzung von 'const int ' in 'char'?
	if(a == 'A')
		a = 10 * 100;
	if(a == 'B')
		a = 11 * 100;
	if(a == 'C')
		a = 12 * 100;

	if(b < 9)
		b = b * 10;
	if(b == 'A')
		b = 10 * 10;
	if(b == 'B')
		b = 11 * 10;
	if(b == 'C')
		b = 12 * 10;

	if(c < 9)
		c = c;
	if(c == 'A')
		c = 10;
	if(c == 'B')
		c = 11;
	if(c == 'C')
		c = 12;
	
	erg = a + b + c;

	return erg;
}

char getZeichen(void)//hier das zufallszeichen holen
{	
	int i = 0;
	char j;
	
	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;
}

Ich sag schonmal DANKE im Vorraus!!
(hoffe ich konnte es verständlich erklären)
Schönen Gruß
Manda
 
Moin!

Also, ohne mal den ganzen Code zu prüfen: vielleicht reicht es ja schon die deplazierten Asterisk in intToChar zu korrigieren und das übergeben per Referenz bleiben zu lassen:
Code:
char intToChar(const int i)
{
    return (char) i + 48;
}

/* ... */
char cKonvertiert[2];
int nZahl = 5;
char cZahl = 7;
cKonvertiert[0] = intToChar(nZahl);
cKonvertiert[1] = intToChar((int) cZahl);

Gruß
Enum
 
Zuletzt bearbeitet:
Die pointer hab ich da weggenommen. Dann fiel mir ein, dass ein char nur Werte bis 255 speichert, somit müsste ich in Berechnung die Werte auf int casten, um rechnen zu können.

Bei diesem Aufruf aus spielStarten()
punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]);
will ich in berechneErgebnis(char a, char b, char c)
nur mal die Werte anzeigen lassen, die a haben würde. Ich schreibe folgendes:

int x, y, z;
x = (int)a - '0';
printf("HIER: %d", x);
ich kriege aber NIE das 0.element sondern immer das 1.element. WARUM
bsp.: zahlen: 1 4 C -> Anzeige für a: 4 .... hier sollte aber die 1 stehen, ich kriege die 4. mach ich beim Aufruf was falsch?

Gruß
Manda
 
Also, erstens fällt mir bei getzeichen auf: Beim rand()%13 gehört %12 hin, weil die Zahlen sonst bei dir von 1 bis 13 gehen

Im main ist das:
C++:
while(i < 3)
{
   for(j=0; j<i; j++)        
   {            
      printf("%3c  |", zeichen[j] = getZeichen());    
   }  
   i++;   
}
wohl eher so gedacht, das die while-Schleife rundherum wegkommt?
und bei der for-Bedingung dann halt j<3 schreiben

Und da die Punkte ja vermutlich kein Buchstabe sein werden, beim letzten printf im main %d verwenden

Punkteberechnung: 2 grobe Sachen: Erstens rechnest du mit den ASCII-Werten
und zweitens, sowas wie
if(c==a)
c=x;
if(c==b)
c=y;

Solte besser vorm zweiten (und allen folgenden) if noch ein else enthalten

C++:
int berechneErgebnis(char a, char b, char c)
{
  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;
  int e=100*a+10*b+c;
  if(a==b&&a==c)e*=3;
  else if(a==b||a==c||b==c)e*=2;
  return e;
}

Die drei if-else sind nur dazu da, um deine sog. "inttochar"-Aktion wieder umzudrehen, da man die Werte zwar zum Ausgeben gerauchen kann, aber nicht zum Rechnen
Da wären nämlich 1 bis 9=49 bis 57, und A B C=65 66 67

Ab dem int e dann die Eigentliche Punkteberechnung

Falls du sie noch kürzer willst, hier ein Einzeiler :)
return((100*a+10*b+c)*((a==b&&b==c)?3: ((a==b||a==c||b==c)?2:1)));

Gruß

@Enum: So, wie es aufgerufen wurde, hätte das schon gepasst
Edit2:
1+rand()%13 ergibt zahlen von 1 bis 13
es sollen aber Zahlen von 1 bis 12 herauskommen...
und wo ist überhaupt dein Beitrag? ich hab ihn nur per email bekommen
Ausserdem: Was du in deinem ersten Beitrag by Reference genannt hast, ist wohl doch eher by Value
 
Zuletzt bearbeitet:
Hi @sheel
Danke erstmal für die Antwort!
was ist wenn b = C wäre(also b den Wert 12 hätte) Oder auch b=B(also 11 wäre)
in deiner if-abfrage, fragst du nur die 10 ab oder
er rechnet zwar jetzt, aber leider noch das falsche ergebnis.

if(a>'9')a=a-'A'+10;
else a-=48;

hättest da noch eine idee ich muss halt gucken was für eine zahl/buchstabe die 1.ziffer ist, und dann die *100 nehmen. die 2.ziffer * 10 dazu addieren und dann die +3.ziffer.
bsp: A 9 B -> A ist ja 10, 10*100 = 1000 und 9*10=90 und B ist ja 11
also 1000 + 90 + 11 = 1101
hoffe du hast noch einen tip für mich!!

gruß
manda
 
Das mit 0-9 und ABC wird in den if´s beides behandelt :)

Und was ist am Ergebnis falsch?
So wie ich das verstanden habe, muss das die 1. zahl mal 100 + z2 *10 +z3
sein, und falls zwei gleiche vorkommen das ganze doppelt, und falls alle drei gleich sind das ganze dreifach?

Übrigens, wieviel Beiträge vom Enumerator siehst du auf dieser Seite?
Ich sehe einen, aber hab einen zweiten per Email bekommen, der hier NICHT zum sehen ist ?
 
hi @sheel,
ich seh nur einen beitrag von Enumerator...hat mehrere geschickt
zurück zu den ifs
irgendwie krieg ich aber ein falsches ergebnis, bei der Berechnung.
das mit der Rechnung hast du richtig verstanden. Ich glaube bei dem Aufruf aus spielStarten()
punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]);
stimmt was mit dem zeichen[0] nicht. ich habe versucht, das mal auszugeben, das gibt er nie aus. er gibt mir für char a immer zeichen[1] aus, nicht zeichen[0].
und rechnet wahrscheinlich falsch weiter.
verstehst was ich meine ich kriege garkein zugriff auf zeichen[0]...
oder rufe ich das falsch auf?

gruß
manda
 
Komischer Enumerator-schaffts doch tatsächlich, unsichtbar zu schreiben :)
Das im Email von ihm ist aber Unsinn, besser nicht ins Programm schreiben

Meine Funktion hab ich grad getestet, ohne dem ganzen Programm rudherum rechnet si das richtige Ergebnis aus (von deinem 1101-Beispiel oben)

Und wegen dem zeichen[0]: Ich hab keine Ahnung/den Überblick verloren, welche Änderungen von wem du zurzeit in deinen Code übernommen hast, poste ihn bitte nocheinmal
 
Zuletzt bearbeitet:
hallo @sheel...hier nich mal der code (bis jetzt)
C++:
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)
{
	//noch offen...
}

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)//hier das zufallszeichen holen
{	
	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;
}

Danke erstmal für deine Mühe!!
 
1: Ich hab dich schon drauf hingewiesen, im Spielstarten musst du das while(i<3) ums for herum entfernen und beim for j<3 statt j<i schreiben

2: Hab ich auch schon gesagt: Beim rand() im getzeichen %12 statt %13 schreiben :rolleyes:

3: Ich hab dich (auch beim getzeichen) auch schon drauf hingewiesen, dass bei den 4 ifs bei 3 davon ein else noch hingehört (nicht beim obersten!)
Also
else if(i==10)...

Genauer lesen!
 
Zurück