Datentyp Char = Buchstabe + Zahl? o.O

HCWD

Erfahrenes Mitglied
Servus.

Erst frisch an C++ ran gesetzt und schon hab ich die ersten Probleme mit dieser Programmiersprache.

Ich wollte ein Spiel programmieren namens "Tick Tack Toe" (sollte jedem bekannt sein :-)).
Beim Anzeigen der Felder (sind Zahlen um zu wissen, welches Feld man ankreuzt), soll analysiert werden ob im Array, dass 0 oder 1 zugewiesen bekommt, das Feld vom Spieler angekeuzt wurde oder nicht. Das ist so mal das Vorwissen meines Problemes.

Jetzt zum eigentlichen Teil:
Habe alles schön und gut programmiert. Jedoch häng ich jetzt an einer Methode in meiner Klasse.

Code:
char check(int n)
{
                if(feld[n] == 0)
	{
		n++;
		return n;
	}
	else
	{
		if(feld[n] == 1)
			return 'X';
		else
			return 'O';
	}
}

mit hilfe dieses Codes wollte ich analysieren, ob das gegebene Feld benutzt wurde oder noch zum ankreuzen frei steht. Jetzt kann ich beim Anzeigen nicht das gewünschte Resultat erkennen, den die Zahlen in den Feldern werden problemlos ausgegeben (if)!
Aber wenn ich zum else komme, (2. IF), dann gibt er mir statt das X oder das O, nur den Wert des Buchstaben aus. Für X steht da 79 und für O ne andere Zahl.

Mit welchem Datentyp könnte ich das Problem lösen?
 
Vielleicht gehts mit enum:
Code:
enum status
{
    1, 2, 3, 4, 5, 6, 7, 8, 9,
    O, X,
}

Dann kannst du dein Array mit dem Datentyp status erstellen. Jedes Feld im Array kann dann einen der Zustände 1-9, O, X enthalten.

Ich weiss nicht wirklich ob das zu deinem Code passt. Evtl. musst du dein Programm anpassen.
Da ich auch ein C++ newbie bin, garantiere ich für nichts. Es gibt villeicht auch eine elegantere Lösung.

Edit: Weshalb brauchst du die Zahlen 1-9? Du kannst ja die aktuelle Position im Array über die Array-Operatoren [i][j] ansprechen.
Du brauchst nur ein enum mit 'O', 'X', '0' (=Feld leer).

Übrigens würde ich ein 3x3-Array benützen. Macht doch mehr Sinn bei einem Spiel, dass auf einem 3x3-Spielfeld stattfindet.


Gruss LukeS
 
Zuletzt bearbeitet:
Mit der Mehrdimensionalität bin ich noch nicht ganz sicher... Somit will ich erst mal das Grundlegende perfekt beherschen...

Jedoch danke ich dir für deine Tips... Werde diese gleich versuchen auszutesten... Ach und das Relevante wäre nur die Zahl 0, 1 und 2 zuzüglich dem X und dem O. :-)

Ich werde hier dann reinschreiben, ob es geklappt hat. ;-)
 
1.

du kannst getrost ein eindimensionales array nehmen, und die 9 Felder vom TicTacToe sind dann im array an den stellen 0-8

ein mehrdimensionales array ist in C so ausgelegt, das es im speicher wie ein eindimensionales aussieht, also die zeile nacheinander angereiht werden

der einzige unterschied liegt beim zugriff, bei mehrdimensionalen array mit 3x3 kann man dann zbsp. mit a[1][0] zugreifen, also das element an 2. zeile, 1. spalte

da das ganze im speicher hintereinander liegt, kann man auf das selbe array-element auch mit a[1*3+0] zugreifen, wobei 3 die anzahl der spalten ist
somit kannst du getrost beim eindimensionalen array bleiben, weil bei dir nur die werte 0-8 sind, und die umrechnung welche zahl welches feld ist, noch schnell im kopf geht

2.

ich versteh den sinn von deiner Check methode mal gar nicht

dem array wird 0 oder 1 zugewiesen, wobei dann 0 dafür steht, das nichts angekreuzt wurde, nehme ich mal an
wenn 1 im array steht, heißt das, es wurde wasangekreuzt, aber wie willst du dann unterscheiden ob der benutzer ein X oder ein O gemalt hat?

du solltest für dein array einen selbst definierten datentyp nehmen, wie bereits von lukes beschrieben. n ist bei dir ein integer, wenn du nix im array hast (also a[n]==0) , lieferst du integer n++ als character zurück ==> irgendwas kann da nicht stimmen

wenn der wert 0 drin steht, musst sowas wie 0 liefern
bei x lieferst ein x
bei o lieferst ein o zurück

dazu musst einen enum mit {0, o, x} oder so verwenden und dann lieferst einfach einen character zurück des sollte schon gehen
und wenn du wirklich nur die ordinalzahlen von den characters kriegst, mit chr() und ord() bekommst zu jeder ascii-zahl den character bzw. zum character die ascii-zahl

mfg
 
Zuletzt bearbeitet:
Zurück