Hi zusammen,
zunächst mal Danke an alle für eure konstruktive Kritik (zum Thema Kritik: die Guten halten es aus, und um die anderen ist es eh nicht schade...

)
@ms4py
Thema Threading:
Das Threading war tatsächlich eines der größeren Probleme beim Entwurf. Darauf gekommen bin ich, weil für die Implementierung eines menschlichen Spielers asynchrones Auswerten eines Schusses erforderlich wird. Deshalb informiert zunächst die World den Player, dass er jetzt einen Schuss abgeben kann mit "on_generate_shot". Diese Methode würde beim HumanPlayer nichts tun. Irendwann später, sobald sich der menschl. Spieler entschieden hat, kommt dann der Aufruf der shoot-Methode vom UI. Denke ich da noch zu kompliziert?
Thema UI:
Ja, da kann ich mir auch eine Menge vorstellen

Vllt. mach ich zunächst mal eins für die Konsole.
Thema Redundanz und Komplexität:
Naja, dass ich oft zu kompliziert denke, ist mir auch schon des öfteren aufgefallen... Die jetzige Implementierung hat sich eigentlich automatisch dadurch ergeben, dass ich das Ganze objektorientiert angegangen bin und mir überlegt habe, was ein Objekt ist. Dadurch ist das Objekt "Ship" entstanden, das über seine eigene Position Bescheid weiß und die ganzen Operationen auf dem Schiff handelt.
@BlackJack:
Thema Threading:
siehe oben bei ms4py
Thema Exception:
Du hast recht, da wäre eine Exception besser, da der Rückgabe eigentlich einen Fehler meldet.
Thema Rekursion:
Die Namensgebung der Funktionen zum Schiffe setzen ist wirklich nicht optimal. Die Rekursion selbst verwende ich, um bei einem fehlgeschlagenen Positionierungsversuch möglichst einfach den vorigen Zustand des Ozeans wiederherstellen zu können. Die Rekursiontiefe entspricht dabei maximal der Anzahl der Schiffe, das sollte kein Problem darstellen, zumal mir das iterativ zu schreiben wesentlich komplizierter zu sein scheint.
Thema ^ vs. not:
Hey, der Ausdruck "opposite = not player" gefällt mir, und wie die Antwort von jbs zeigt ist es tatsächlich lesbarer.
Thema List-Comprehensions, Generatoren:
Damit kann ich scheinbar noch einiges vereinfachen in meinem Code, danke.
Gruß
Norbert