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
Ingo Melzer, 13. January 1998