3 * Author: Jan Vales (e0726236@student.tuwien.ac.at)
\r
5 * Purpose: Gameclient. Handles userinput.
\r
10 #include "globals.h"
\r
12 static int nSharedMemID = -1; /* ID for shared memory */
\r
13 static int semIDa = -1; /* semaphore 1 ID */
\r
14 static int semIDb = -1; /* semaphore 2 ID */
\r
15 static sharedmem_t *pSharedMem = (sharedmem_t *) -1; /* pointer on sharedmem_t */
\r
17 char *szCommand = "";
\r
18 void bailOut(); /* Forward declaration */
\r
21 /* prints error messages if an error has occoured */
\r
22 void bailOut(char *szMessage) {
\r
24 (void)fprintf(stderr,"%s: %s - %s\n", szCommand,szMessage,strerror(errno));
\r
26 (void)fprintf(stderr,"%s: %s\n", szCommand,szMessage);
\r
31 /* handles signals */
\r
32 void handler(int nSignal) {
\r
38 /* Game stuff starts here */
\r
42 (void) fprintf(stdout,"Ursprüngliches Feld\n");
\r
43 for(i=0; i < 3; i++) {
\r
44 (void) fprintf(stdout,"%c, %c, %c\n", pSharedMem->field[i][0], pSharedMem->field[i][1],pSharedMem->field[i][2]);
\r
48 pSharedMem->field[i][j]=0;
\r
51 (void) fprintf(stdout,"Feld zurückgesetzt\n");
\r
52 pSharedMem->status = -1;
\r
55 int main(int argc, char **argv) {
\r
56 char line[MAX_CHAR] = "";
\r
58 szCommand = argv[0];
\r
61 (void) fprintf(stderr,"USAGE: %s\n", szCommand);
\r
65 /* INIT SEM + SHM*/
\r
66 if ((nSharedMemID = shmget(SHM_KEY,sizeof(sharedmem_t),PERM))==-1) {
\r
67 bailOut("Konnte nicht zum Server verbinden!");
\r
69 if ((pSharedMem = (sharedmem_t *) shmat(nSharedMemID,(const void *) 0,0))==(sharedmem_t *) -1) {
\r
70 bailOut("Konnte nicht zum Server verbinden!");
\r
72 if ((semIDa=semgrab(SEM_KEY_A))==-1) {
\r
73 bailOut("Konnte nicht zum Server verbinden!");
\r
75 if ((semIDb=semgrab(SEM_KEY_B))==-1) {
\r
76 bailOut("Konnte nicht zum Server verbinden!");
\r
79 /* register handler */
\r
80 (void) signal(SIGINT, handler);
\r
81 (void) signal(SIGTERM, handler);
\r
82 (void) signal(SIGQUIT, handler);
\r
84 /* the game routine */
\r
85 (void) fprintf(stderr,"Connected to server. idle.\n");
\r
88 if((P(semIDa))==-1)bailOut("Could not P semaphoreA");
\r
89 switch(pSharedMem->status) {
\r
91 fprintf(stdout,"Du bist am zug!\n");
\r
92 for(i=0; i < 3; i++) {
\r
93 fprintf(stdout,"%c, %c, %c\n", pSharedMem->field[i][0], pSharedMem->field[i][1],pSharedMem->field[i][2]);
\r
97 fprintf(stdout,"Wegen des cheatens wurde des Spiel neu gestartet!\n");
\r
101 fprintf(stdout,"Du hast gewonnen!\n");
\r
105 fprintf(stdout,"Server hat gewonnen!\n");
\r
109 fprintf(stdout,"Unentsschieden!\n");
\r
113 fgets(line,MAX_CHAR-1,stdin);
\r
114 if(ferror(stdin))bailOut("Error: while reading from stdin!\n");
\r
117 for(i=0; i < 3; i++) {
\r
118 fprintf(stdout,"%c, %c, %c\n", pSharedMem->field[i][0], pSharedMem->field[i][1],pSharedMem->field[i][2]);
\r
123 if((line[2]<49) | (line[2]>51) | (line[3]<49) | (line[3]>51)){
\r
124 (void) fprintf(stdout,"Ungültige eingabe Werte 1-3 eingeben!\n");
\r
127 if(pSharedMem->field[(line[2]-49)][(line[3]-49)] == 0){
\r
128 pSharedMem->field[(line[2]-49)][(line[3]-49)]='X';
\r
129 pSharedMem->status = 1;
\r
131 (void) fprintf(stdout,"Feld belegt!\n");
\r
135 if((line[2]<49) | (line[2]>51) | (line[3]<49) | (line[3]>51) | (line[5]<49) | (line[5]>51) | (line[6]<49) | (line[6]>51)){
\r
136 (void) fprintf(stdout,"Ungültige eingabe Werte 1-3 eingeben!\n");
\r
139 if((pSharedMem->field[(line[2]-49)][(line[3]-49)] == 0) & (pSharedMem->field[(line[5]-49)][(line[6]-49)] == 0)){
\r
140 pSharedMem->field[(line[2]-49)][(line[3]-49)]='X';
\r
141 pSharedMem->field[(line[5]-49)][(line[6]-49)]='X';
\r
142 pSharedMem->status = 1;
\r
144 (void) fprintf(stdout,"Mindestens 1 Feld belegt!\n");
\r
151 if((V(semIDb))==-1)bailOut("Can not V semaphoreB\n");
\r
152 exit (EXIT_SUCCESS);
\r
153 default: printf("befehl nicht erkannt\n");
\r
155 printf("s - Spielfeld anzeigen (dies wird nach jedem Zug automatisch gemacht)\n");
\r
156 printf("p <xy> - Symbol platzieren auf Position xy (wobei (1,1) die Ecke links oben bezeichnet\n");
\r
157 printf("c <xy> <xy> - zwei Symbole platzieren (Cheat-Modus)\n");
\r
158 printf("n - Neues Spiel starten\n");
\r
159 printf("q - Spiel beenden (Position bleibt weiterhin bestehen!)\n");
\r
161 if((V(semIDb))==-1)bailOut("Can not V semaphoreB");
\r
163 /* return 1337 for the guy who reached this impossible state!*/
\r