Universität Ulm, Fakultät für Mathematik und Wirtschaftswissenschaften, SAI

Lösung zu Blatt 9 der Systemnahe Software I (WS 97/98)

14 Schiffeversenken

battle.c

#include "sock.h"

void printfield(int field[][10], int shots[][10]) {
   int i, j;
   printf("Keep in Mind: 1 is a ship, 2 is a hit and 3 is a miss.\n");
   printf("My shots           \tHer shots\n");
   for (j = 0; j < 10; j++) {
      for (i = 0; i < 10; i++)
	 printf("%d", shots[i][j]);
      printf("\t\t");
      for (i = 0; i < 10; i++)
	 printf("%d", field[i][j]);
      printf("\n");
   }
}

void entership(int field[][10], int x, int y, int d, int len) {
   int i, j;
   for (i = x, j = y; (i < x + len) && ( j < y + len); i += (1 - d), j += d)
      field[i][j] = 1;
}

void readships(int field[][10]) {
   int d, i;
   printf("Bitte geben Sie Ihre Schiffe in der Form xyd ein.\n");
   printf("Dabei sollte d 0 für waagrecht und 1 für senkrecht sein.\n");
   printf("Ein Schiff von der linken, oberen Ecke nach unten hätte\n");
   printf("also 001 als Eingabe.\n\n");
   for (i = 2; i < 6; i++) {
      printf("Bitte obere, linke Ecke und Orientierung des %der Schiffes: ", i);
      scanf("%d", &d);
      entership(field, d / 100, (d / 10) % 10, d % 10, i);
   }
   printf("Bitte obere, linke Ecke und Orientierung des 2. dreier Schiffes: ");
   scanf("%d", &d);
   entership(field, d / 100, (d / 10) % 10, d % 10, 3);
}

void main(int argc, char *argv[]) {
   int sock;
   char hostname[64];
   char rec[1024];
   int port, i, j, myhits = 0, herhits = 0, mytarget, hertarget;
   int myfield[10][10], shots[10][10];
   if (argc > 3) {
      fprintf(stderr,"USE: %s [hostname [port]]\n", argv[0]);
      exit(11);
   }
   for (i = 0; i < 10; i++) 
      for (j = 0; j < 10; j++)
	 myfield[i][j] = shots[i][j] = 0;
   readships(myfield);
   printfield(myfield, shots);
   sock = init_sock(&port);
   printf("I am now on port %d.\n", port);
   if (argc == 3) { /* 2 Kommandozeilenargumente - hostname und Port */
      port = atoi(argv[2]);
   } else {
      printf("Please enter other player's port: ");
      scanf("%d", &port);
   }
   if (argc >= 2) {
      strcpy(hostname, argv[1]);
   } else {
      printf("Please enter other player's hostname: ");
      scanf("%s", hostname);
   }
   printf("Sending %s to %s on port %d.\n", "Hallo", hostname, port);
   sendline(hostname, port, sock, "Hallo"); 
   receiveline(hostname, port, sock, rec);
   printf("I got: %s.\n", rec);
   while (myhits < 17 && herhits < 17) {
      printf("Bitte geben Sie Ihr Ziel in der Form xy ein: ");
      scanf("%s", rec);
      mytarget = atoi(rec);
      sendline(hostname, port, sock, rec);
      printf("Sending %s to %s on port %d.\n", rec, hostname, port);
      receiveline(hostname, port, sock, rec);
      hertarget = atoi(rec);
      printf("Her Target is: %d.\n", hertarget);
      if (myfield[hertarget / 10][hertarget % 10] == 1) {
	 printf("Which is a hit.\n");
	 sendline(hostname, port, sock, "hit");
	 herhits++;
	 myfield[hertarget / 10][hertarget % 10] = 2;
      } else {
	 printf("Which is no hit.\n");
	 myfield[hertarget / 10][hertarget % 10] = 3;
	 sendline(hostname, port, sock, "nop");
      }
      receiveline(hostname, port, sock, rec);
      if (rec[0] == 'h') {
	 printf("Hit\n"); shots[mytarget / 10][mytarget % 10] = 2;
	 myhits++;
      } else {
	 printf("No Hit\n"); shots[mytarget / 10][mytarget % 10] = 3;
      }
      printfield(myfield, shots);
   }
   close_sock(sock);
   exit(0);
}

Makefile

# Makefile battle

MAIN=battle
CC=gcc
LIB=-lsocket -lnsl
FLAGS = -Wall

OBJ=$(MAIN).o sock.o

main:	$(OBJ)
	$(CC) $(FLAGS) $(LIB) -o $(MAIN) $(OBJ)

.c.o:
	$(CC) $(FLAGS) -c $*.c
clean:
	rm -f $(OBJ) core


Universität Fakultät SAI

Ingo Melzer, 13. January 1998