scanf Eingabe mit Arrayindex verknüpfen
-
Hallo Ihr
,
ich habe vor mit scanf Eingaben auf Arrayinhalte zuzugreifen und diese auszuwerten.
Nun meine Frage:
mein zweidimensionales Array mit 8 Zeilen und 8 Spalten (wobei die Zeilen mit Zahlen von 1-8 und die Spalten von a-h bezeichnet werden) soll über Ersatzbezeichner für die Indices angesprochen werden.
Ich möchte also eine Eingabe via scanf tätigen (z.B. a1) und diese dann in einen Arrayindex umwandeln (z.B. array[0][0]).Wie kann ich das am einfachsten realisieren? Ich dachte an #define das funktioniert leider nicht wie gedacht.
Vielen Dank für jede Hilfe.
-
Datentyp* const a1 = &a[0][0];
Oder auch alternativ (nicht zu empfehlen):
#define a1 a[0][0]
Aber irgendwie kommt mir das reichlich sinnlos vor. Kannst du mal ein Anwendungsbeispiel geben und erklären, was du dir davon erhoffst?
-
Blitzantwort, vielen Dank schonmal.
Es soll ein Schachspiel werden und nach der Eingabe des Zuges (z.B. a2a3 von a2 nach a3) soll die Eingabe in den Feldindex umgewandelt werden.
-
Oh! Jetzt verstehe ich, was du meinst. Entschuldigung, die obige Antwort passt überhaupt nicht, weil ich ganz was anderes verstanden habe. Du willst eher so etwas wie:
erster_index = erstes_zeichen_der_eingabe - 'a'; zweiter_index = zweites_zeichen_der_eingabe - '1';
Beachte noch Groß- und Kleinschreibung. Und die Eingabe sollte vorher sowieso noch validiert werden, da du hier aus Nutzereingaben Indizes für Speicherzugriffe berechnest; ein böswilliger Benutzer könnte sonst wer weiß was durch unerwartete Eingaben anstellen.
-
istemitz schrieb:
Es soll ein Schachspiel werden und nach der Eingabe des Zuges (z.B. a2a3 von a2 nach a3) soll die Eingabe in den Feldindex umgewandelt werden.
Bei nur 64 Spielfeldern, kann ich mir auch ein Feld von Bezeichnern vorstellen:
static const char field_str[64][2] = { "h1","h2","h3","h4","h5","h6","h7","h8", "g1","g2","g3","g4","g5","g6","g7","g8", "f1","f2","f3","f4","f5","f6","f7","f8", "e1","e2","e3","e4","e5","e6","e7","e8", "d1","d2","d3","d4","d5","d6","d7","d8", "c1","c2","c3","c4","c5","c6","c7","c8", "b1","b2","b3","b4","b5","b6","b7","b8", "a1","a2","a3","a4","a5","a6","a7","a8" }; int idx(const char* field){ if(strlen(field)==2){ for(int i=0; i<64;++i) if(strncmp(field_str[i],field,2)==0) return i; } return -1; }
-
Hallo, vielen Dank schonmal für eure Antworten aber ich habe mich entweder missverständlich ausgedrückt oder ich bin einfach zu unfähig eure Vorschläge umzusetzen.
Was ich vergessen habe zu erwähnen, jeder Index des Feldes ist bereits mit einer Schachfigur belegt, also die Standartaufstellung. Wo sich keine Figur befindet, dort ist ja glaub eine 0 eingetragen. Ich möchte mit meiner Eingabe eigentlich nur sagen wenn "a2a3" eingetragen wird, dass sich die Figur von a2 nach a3 bewegt.
Sozusagen das a2a3 bedeutet verschiebe den Inhalt von a2(spielfeld[6][0]) auf a3(spielfeld[6][0]).mit:
erster_index = erstes_zeichender_eingabe - 'a';
zweiter_index = zweites_zeichen_der_eingabe - '1';
Würde ich doch meine Eingabe direkt auf die Indizes speichern und meine Figuren überschreiben oder liege ich falsch?
-
Sozusagen das a2a3 bedeutet verschiebe den Inhalt von a2(spielfeld[6][0]) auf a3(spielfeld[5][0]).
Das meine ich eigentlich
-
enum {LEER,WK,SK,WD,SD,WT,ST,WL,SL,WS,SS,WB,SB}; int spielfeld[8][8]={0}; /* [0][0] -> a1, [7][7] -> h8 */ void setzevonnach(const char *zug,int spielfeld[][8]) { spielfeld[zug[3]-'1'][zug[2]-'a'] = spielfeld[zug[1]-'1'][zug[0]-'a']; spielfeld[zug[1]-'1'][zug[0]-'a'] = LEER; } void setzefigur(const char *feld,int figur,int spielfeld[][8]) { spielfeld[feld[1]-'1'][feld[0]-'a'] = figur; } .... /* Startaufstellung */ setzefigur("a1",WT,spielfeld); setzefigur("b1",WS,spielfeld); setzefigur("c1",WL,spielfeld); ...
Sonderbehandlungen für Rochade, en passant, Umwandlung/Unterverwandlung, ... brauchst du dann auch noch, wenn du es richtig machen willst.
Wenn du irgendwann mal eine Schnittstelle zu einer Schachengine machen willst, empfiehlt sich das UCI-Protokoll für Züge, was deinem Format entspricht:
Examples: e2e4, e7e5, e1g1 (white short castling), e7e8q (for promotion)
http://download.shredderchess.com/div/uci.zip
Für Datenbanken- und sonstige präsentable Aufgaben ist das PGN-Format besser geeignet:
http://de.wikipedia.org/wiki/Portable_Game_Notation
-
istemitz schrieb:
Hallo, vielen Dank schonmal für eure Antworten aber ich habe mich entweder missverständlich ausgedrückt oder ich bin einfach zu unfähig eure Vorschläge umzusetzen.
Was ich vergessen habe zu erwähnen, jeder Index des Feldes ist bereits mit einer Schachfigur belegt, also die Standartaufstellung. Wo sich keine Figur befindet, dort ist ja glaub eine 0 eingetragen. Ich möchte mit meiner Eingabe eigentlich nur sagen wenn "a2a3" eingetragen wird, dass sich die Figur von a2 nach a3 bewegt.
Sozusagen das a2a3 bedeutet verschiebe den Inhalt von a2(spielfeld[6][0]) auf a3(spielfeld[6][0]).So habe ich das auch verstanden.
Ich habe eigentlich nix mit C am Hut, habe aber mal versucht meinen Gedanken weiter zu denken:#include <stdio.h> static const char field_str[64][2] = { "a8","b8","c8","d8","e8","f8","g8","h8", "a7","b7","c7","d7","e7","f7","g7","h7", "a6","b6","c6","d6","e6","f6","g6","h6", "a5","b5","c5","d5","e5","f5","g5","h5", "a4","b4","c4","d4","e4","f4","g4","h4", "a3","b3","c3","d3","e3","f3","g3","h3", "a2","b2","c2","d2","e2","f2","g2","h2", "a1","b1","c1","d1","e1","f1","g1","h1" }; int idx(const char* field){ for(int i=0; i<64;++i) if(field[0]==field_str[i][0] && field[1]==field_str[i][1]) return i; return -1; } enum piece_t{NONE,K,Q,R,B,N,P} board[64] = { R,N,B,Q,K,B,N,R, P,P,P,P,P,P,P,P, [64-16]= P,P,P,P,P,P,P,P, R,N,B,K,Q,B,N,R }; void print(){ static const char* piece_str[] = { [NONE]=" ", [K]="K", [Q]="Q", [R]="R", [B]="B", [N]="N", [P]="P" }; for(int rank=0; rank<8; ++rank) printf("%s %s %s %s %s %s %s %s\n", piece_str[board[rank*8+0]], piece_str[board[rank*8+1]], piece_str[board[rank*8+2]], piece_str[board[rank*8+3]], piece_str[board[rank*8+4]], piece_str[board[rank*8+5]], piece_str[board[rank*8+6]], piece_str[board[rank*8+7]]); } void move(const char* s){ static int count=0; const int dst=idx(s+2); const int src=idx(s); printf("%d. %.4s\n", ++count, s); board[dst] = board[src]; board[src]=NONE; } int main(void){ print(); move("e2e4"); move("e7e5"); move("g1f3"); move("g8f6"); print(); return 0; }