Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

21

05.07.2011, 14:38

Naja, ich mache es meistens so wie ich denke, dass es am Sinnvollsten ist!
Wenn ich z.B. eine Variable Score habe, die erst während des Spiels hochgezählt wird, aber von anfang an Angezeigt werden soll, initalisieren ich mit 0! ;)

Kommt wahrscheinlich immer ganz darauf an, wofür man die Variable braucht! ;)

Mfg Harry222

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

22

05.07.2011, 15:08

In diesem fall ist aber kein Wert, der nicht vom Spieler bestimmt wird sinnvoll.
Im Allgemeinen sollte man sich schon etwas Mühe geben wenn man schon eine Komplettlösung postet.
Oder es am besten gleich sein lassen. Dem Threadersteller bringt es nichts wenn er den funktionierenden Code hat(besonders wenn er nicht gerade sauber ist...)
Ich hab hier mal etwas aufgeräumt und ordentlich eingerückt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

23

05.07.2011, 16:00

Sorry! Danke, das du es nochmal ordentlich gemacht hast!

Eine kleine Sache noch:
Die Variable Wiederholen könnte man sich eigentlich auch noch sparen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while(true)
{
    char Index;
    cin >> Index; // nimmt die Eingabe des Spielers an; Spieler X beginnt, dann folgt Spieler O

    if (Spielfeld[(int)(Index - '0'] != 'O' && Spielfeld[(int)(Index - '0')] != 'X')
    {
        Spielfeld[(int)(Index - '0')] = PlayerMark; //prüft ob das Feld noch frei ist wenn ja wird es besetzt

        // Die Eingabe war korrekt! Schleife verlassen...
        break;
    }
    else
    {
        // fehlerhafte Eingabe! Schleife wiederholen...
        continue;
    }
}


Mfg Harry222

24

05.07.2011, 17:00

So, der Code ist nun fertig und funktionsfähig :thumbsup: .

Nochmals danke für eure Hilfe!

Den Code von NachoMan werd ich mir heut abend nochmal in Ruhe ansehen und meinen eigenen Code, wo nötig erweitern.

Eine Frage bleibt mir allerdings noch offen:

Um die Elemente des Arrays Spielfeld anzusprechen hab ich jetzt

C-/C++-Quelltext

1
[Index - '0']
benutzt.
Funktioniert soweit auch.
Allerding wurde keine Spielfeld Änderung vorgenommen als ich

C-/C++-Quelltext

1
[((int)Index - 0)
benutzt habe.
Auch umgekehrt hat die Konversation von einer int in einen char nicht funktioniert.

Wenn ich aber zum Beispiel eine int in einen char konvertieren möchte ist:

C-/C++-Quelltext

1
2
int iInt        = 1;
        char cChar  =(char) iInt 

richtig, oder?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

25

05.07.2011, 17:24

Die Variable Wiederholen könnte man sich eigentlich auch noch sparen:

Eine Schleife sollte vorzugsweise durch ihre Bedingung beendet werden. Dann kann es nicht passieren, dass ein anderer Programmierer sich wundert, dass sie abgebrochen wird obwohl die Bedingung erfüllt ist.

@Rexona: Zeichen werden im Computer durch Zahlen Symbolisiert weil er nur Zahlen kennt. std::cout interpretiert ein Char als Zeichen, obwohl es eigentlich eine Zahl ist. Führe mal diesen Zeile aus:

C-/C++-Quelltext

1
std::cout << "48 als Zahl interpretiert: " << 48 << std::endl << " 48 als Zeichen interpretiert: " << static_cast<char>(48) << std::endl;

oder anders herum:

C-/C++-Quelltext

1
std::cout << " '0' als Zeichen interpretiert: " << '0' << std::endl << " '0' als Zahl interpretiert: " << static_cast<int>('0') << std::endl;

Du siehst, 'i' oder auch '0' steht für einen Wert der nach der ACSII Tabelle ausgewertet wird.
Deshalb kann man damit auch rechnen. Die Zahlen von 0 bis 9 sind in der Tabelle zum glück in der richtigen Reihenfolge. Um den Zahlenwert und nicht die Wert, der für das Zeichen steht, müssen wir nur '0' oder 48 Subtrahieren.
Beispielrechnung mit '5' also 53 in der ACSII Tabelle:
'5'-'0' = 5
53-48 = 5
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

26

05.07.2011, 19:53

Ok, hab ich halbwegs verstanden :D

Ich habe gerade das nochmal ausprobiert:

C-/C++-Quelltext

1
2
3
4
int test;
    char fünf = '5';
    test = (int)fünf;
    std::cout << test << std::endl;


herauskam 53.

Heißt also, wenn ich einen char in eine int konvertiere, muss ich immer mit '0' oder 48 subtrahieren, richtig?

Jetzt mal angenommen, ich würde ein Spiel mit 16 Feldern machen, da ich 10 ja nicht in einen char packen kann müsste ich einen int array erstellen, oder?
Und dann den int Wert in einen char konvertieren um ihn dann gegen den char PlayerMark auszutauschen,oder?

Und da dann auch Index eine int sein muss(richtig?), wie kann ich im Falle das sich der Spieler vertippt, auf sagen wir R,
dies nachprüfen?

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

27

05.07.2011, 20:18

Heißt also, wenn ich einen char in eine int konvertiere, muss ich immer mit '0' oder 48 subtrahieren, richtig?

Nein! Du verstehtst das falsch!

Du möchtest doch, dass der Spieler eine Zahl zwischen '0' und '8' eingibt. Das ist dann der char Wert! Als int Wert wäre das 48.
Wenn du nun aber 48 als Index für dein Array nimmst, wäre das völlig falsch, weil du eigentlich 0 als int Wert dafür brauchst, also:
'0' = 48
'0' - 48 = 48 - 48 = 0

'1' = 49
'1' - 48 = 49 - 48 = 1

Wenn du nun zum Beispiel als Eingabe 'A', 'B', usw. verwendest und 'A' Feld 0 sein soll gilt:
'A' = 65
'A' - 65 = 65 - 65 = 0

'B' = 66
'B' - 65 = 66 - 65 = 1

Du musst also nicht immer '0' subtrahieren, nur in diesem Fall ('0', '1', usw.) ist das nunmal nötig! ;)

Und da dann auch Index eine int sein muss(richtig?), wie kann ich im Falle das sich der Spieler vertippt, auf sagen wir R,
dies nachprüfen?
Wenn der in int umgewandelte Wert größer als 8 oder kleiner als 0 ist!

Mfg Harry222

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

28

05.07.2011, 20:26

Das funktioniert natürlich nur bei einstelligen Zahlen.
Das Entgegennehmen von chars würde in dem fall eigentlich nur Sinn machen, wenn du noch weitere Eingaben, wie z.b. q für Quit auswertest.
Wenn du das aber nicht willst kannst du auch gleich ein Integer entgegen nehmen und dir das ganze Umrechnen sparen. Dann gibts auch keine Probleme mit mehrstelligen Zahlen.

Willst du beides, also Quit und mehrstellige Zahlen musst du einen String(also ein chararray oder, wenn du ihn schon kennst, std::string) entgegen nehmen und je nach Inhalt anders reagieren. Ist das erste Zeichen im String eine Ziffer wandelst du ihn in ein int um. Um einen String in einen Integer zu konvertieren solltest du aber std::atoi benutzen. Ist es aber ein Buchstabe wie z.b. q, beendest du das Programm oder ähnliches.

Achja, versuch dir C++-Casts anzugewöhnen. Die gibt es nicht ohne Grund. ;)

Zitat

Heißt also, wenn ich einen char in eine int konvertiere, muss ich immer mit '0' oder 48 subtrahieren, richtig?

Nur wenn der Char eine Ziffer ist. Wenn du z.b. A ein gibst kommt natürlich blödsinn raus.

In dem Code sieht man aber, dass du ein gutes Grundverständniss bzw. Potenzial hast. Viele Anfänger haben Probleme mit der Gewinnbedingung oder der Programmsteuerung. Deine Fehler zeugen, soweit ich das einschätzen kann, weniger von fehlenden logischen Verständniss als von zu fehlender Übung. Bleib also am Ball!
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (05.07.2011, 20:32)


29

05.07.2011, 22:12

Danke nochmals euch beiden :D

Dass das Subtrahieren mit 48 nur für diesen speziellen Fall gilt, hätt ich mir auch denken können :whistling: :D

Zitat

Wenn der in int umgewandelte Wert größer als 8 oder kleiner als 0 ist!
Gute Idee, werd ich versuchen irgendwo mal einzubringen :thumbsup:

Zitat


Achja, versuch dir C++-Casts anzugewöhnen. Die gibt es nicht ohne Grund. ;)
Die kenn ich garnicht 8|
Allerdings, geh ich davon aus das es sich um das hier handelt:

Zitat

static_cast<int>('0')
Stimmt doch, oder?

Hab hier nen kleines Tut gefunden, ist das soweit in Ordnung?


http://www.online-tutorials.net/c-c++-c/…-58.html#casten

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

30

05.07.2011, 22:16

Lernst du nicht mit einem Buch?
Wenn ja solltest du dir unbedingt eins zulegen. C++ ist viel zu Komplex um es sie mit einem Tutorial zu lernen. C++ für Spieleprogrammierer ist eine sehr gute Einführung. Stell dich aber darauf ein noch einige kaufen zu müssen wenn du bei C++ bleibst und möglichst guten Code produzieren willst. Bei leichteren Sprachen sinds wahrscheinlich ein paar weniger.^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (05.07.2011, 22:27)


Werbeanzeige