Compare commits

..
20 Commits
Author SHA1 Message Date
weissal95747 4b8bffe333 src/Praktikum3/SnakeBot.java aktualisiert 2025-02-12 09:32:00 +00:00
toutanjisa93342 f3f5bf26cc src/IHelloWorldWriter.java gelöscht 2025-02-11 12:47:12 +00:00
toutanjisa93342 5c8427aa8d test/Praktikum3/ZahlenFilterTest.java gelöscht 2025-02-11 12:46:41 +00:00
toutanjisa93342 0b7f208227 test/Praktikum3/TriangleCheckerTest.java gelöscht 2025-02-11 12:46:33 +00:00
toutanjisa93342 ee97555e8a src/Praktikum3/ZahlenFilter.java gelöscht 2025-02-11 12:45:08 +00:00
toutanjisa93342 ca49d5e8d8 src/Praktikum3/TriangleChecker.java gelöscht 2025-02-11 12:45:00 +00:00
toutanjisa93342 44e61569c8 src/Praktikum3/OutWriter.java gelöscht 2025-02-11 12:44:48 +00:00
toutanjisa93342 f91964c4a0 src/Praktikum3/IHelloWorld2.java gelöscht 2025-02-11 12:44:39 +00:00
toutanjisa93342 2c8f836e46 src/Praktikum3/Executor.java gelöscht 2025-02-11 12:44:31 +00:00
toutanjisa93342 b1cb6475fd src/Praktikum3/ErrorWrite.java gelöscht 2025-02-11 12:44:18 +00:00
toutanjisa93342 c1bbb2bb5e studientag 2025-02-11 13:42:50 +01:00
toutanjisa93342 08b00f7571 INTERFACE 2024-11-05 17:12:56 +01:00
toutanjisa93342 bdc74d3470 praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1.3.4.5.6 + ISOSCELES 2024-11-05 16:39:25 +01:00
toutanjisa93342 fe12ebd0a0 praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1.3.4.5.6 2024-11-05 16:38:12 +01:00
toutanjisa93342 8196cbff5c praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1.3.4.5 2024-11-05 16:36:58 +01:00
toutanjisa93342 ec5d793a81 praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1.3.4 2024-11-05 16:35:03 +01:00
toutanjisa93342 8b06f4bd24 praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1.3 2024-11-05 16:33:58 +01:00
toutanjisa93342 d809ba45d3 praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 .1 2024-11-05 16:33:03 +01:00
toutanjisa93342 6a0d4b769d praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1.2 2024-11-05 16:31:02 +01:00
toutanjisa93342 e747da0f2b praktikum 2: testcode TriangleCheckerNORMAL + EQUILATERAL + NONE 1 2024-11-05 16:27:36 +01:00
6 changed files with 215 additions and 171 deletions

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
package Praktikum3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.InetSocketAddress;
public abstract class Bot {
// Ein Bot ist ein Programm, das sich mit einem Server verbindet und
// mit diesem kommuniziert. Der Server sendet dem Bot eine Zeichenkette,
// die das Spielfeld repräsentiert. Der Bot sendet dem Server ein Zeichen,
// das die nächste Bewegung des Bots repräsentiert.
private final String host; // Hostname oder IP-Adresse des Servers
private final int port; // Port des Servers
protected Bot(String[] args) {
host = args.length > 0 ? args[0] : "localhost";
port = args.length > 1 ? Integer.parseInt(args[1]) : 63187;
}
// Diese Methode stellt die Verbindung zum Server her und startet die
// Kommunikation mit dem Server. Die Methode wird von der main-Methode
// aufgerufen.
protected void run() {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(host, port));
OutputStream out = socket.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
View view = new View();
while (true) {
view.read(in);
view.print();
try {
char ch = nextMove(view);
out.write(ch);
}
catch (Exception e) { break; }
}
socket.close();
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
// Diese Methode ermittelt den nächsten Zug des Bots. Sie wird von der
// run-Methode aufgerufen, nachdem der Server das Spielfeld gesendet hat.
// Subklassen müssen diese Methode implementieren.
abstract protected char nextMove(View view) throws Exception;
// Diese Klasse repräsentiert das Spielfeld. Sie wird von der run-Methode
// verwendet, um das Spielfeld zu lesen und auszugeben.
// Subklassen können diese Klasse verwenden, um das Spielfeld zu analysieren.
public static class View {
protected String data;
protected int width;
// Diese Methode liest das Spielfeld vom Server.
private void read(BufferedReader in) throws IOException {
StringBuilder sb = new StringBuilder();
data = in.readLine();
if (data == null) {
return;
}
sb.append(data);
width = data.length();
for (int i = 1; i < width; ++i) {
sb.append(in.readLine());
}
data = sb.toString();
}
// Diese Methode gibt das Spielfeld aus.
protected void print() {
if (data == null || width < 1) {
return;
}
for (int i = 0, len = data.length(); i < len; i += width) {
System.out.println(data.substring(i, i + width));
}
}
}
}
+128
View File
@@ -0,0 +1,128 @@
package Praktikum3;
import java.util.*;
public class SnakeBot extends Bot {
private Set<Integer> visited = new HashSet<>();
public SnakeBot(String[] args) {
super(args);
}
@Override
protected char nextMove(View view) {
if (view == null || view.data == null || view.data.isEmpty()) {
System.err.println("FEHLER: View-Daten fehlen! Verbindung unterbrochen?");
return 'q';
}
int width = view.width;
String data = view.data;
int pos = data.indexOf('A');
if (pos == -1) {
System.err.println("FEHLER: Rover nicht gefunden! Bewege mich zufällig.");
return randomMove();
}
int rockPos = findClosestRock(pos, width, data);
if (rockPos != -1) {
return pathfindMove(pos, rockPos, width, data);
}
return exploreStrategically(pos, width, data);
}
private int findClosestRock(int pos, int width, String data) {
Queue<Integer> queue = new LinkedList<>();
Set<Integer> visited = new HashSet<>();
queue.add(pos);
visited.add(pos);
while (!queue.isEmpty()) {
int current = queue.poll();
if (data.charAt(current) == '@') {
return current;
}
for (int next : getNeighbors(current, width, data)) {
if (!visited.contains(next)) {
visited.add(next);
queue.add(next);
}
}
}
return -1;
}
private List<Integer> getNeighbors(int pos, int width, String data) {
List<Integer> neighbors = new ArrayList<>();
int[] deltas = {-width, width, -1, 1};
for (int delta : deltas) {
int newPos = pos + delta;
if (newPos >= 0 && newPos < data.length() && ".@".indexOf(data.charAt(newPos)) != -1) {
neighbors.add(newPos);
}
}
return neighbors;
}
private char pathfindMove(int pos, int target, int width, String data) {
int x = pos % width, y = pos / width;
int tx = target % width, ty = target / width;
if (ty < y && canMove(pos - width, data)) return '^';
if (ty > y && canMove(pos + width, data)) return 'v';
if (tx < x && canMove(pos - 1, data)) return '<';
if (tx > x && canMove(pos + 1, data)) return '>';
return randomMove();
}
private char exploreStrategically(int pos, int width, String data) {
List<Character> possibleMoves = new ArrayList<>();
int[] deltas = {-width, width, -1, 1};
char[] directions = {'^', 'v', '<', '>'};
for (int i = 0; i < deltas.length; i++) {
int newPos = pos + deltas[i];
if (newPos >= 0 && newPos < data.length() && data.charAt(newPos) == '.') {
if (!visited.contains(newPos)) {
visited.add(newPos);
return directions[i];
}
possibleMoves.add(directions[i]);
}
}
if (!possibleMoves.isEmpty()) {
return possibleMoves.get(new Random().nextInt(possibleMoves.size()));
}
return randomMove();
}
private boolean canMove(int pos, String data) {
return pos >= 0 && pos < data.length() && ".@".indexOf(data.charAt(pos)) != -1;
}
private char randomMove() {
char[] moves = {'^', 'v', '<', '>'};
return moves[new Random().nextInt(moves.length)];
}
public static void main(String[] args) {
try {
new SnakeBot(args).run();
} catch (Exception e) {
System.err.println("Fehler im Bot-Hauptprozess: " + e.getMessage());
}
}
}
// docker run --rm -p 63187:63187 mediaeng/bots snakes
-74
View File
@@ -1,74 +0,0 @@
package Praktikum3;
import java.util.Scanner;
public class TriangleChecker {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Geben Sie die Seitenlängen ein.");
float a = enterFloat(s, "a: ");
float b = enterFloat(s, "b: ");
float c = enterFloat(s, "c: ");
s.close();
printAnalysis(a, b, c);
}
// Eingabe einer Seitenlänge
private static float enterFloat(Scanner s, String prompt) {
System.out.print(prompt);
return s.nextFloat();
}
// Ausgabe der ermittelten Dreiecksart
private static void printAnalysis(float a, float b, float c) {
TriangleType type = checkTriangle(a, b, c);
switch (type) {
case NONE:
System.out.println("Kein Dreieck");
break;
case NORMAL:
System.out.println("Dreieck");
break;
case ISOSCELES:
System.out.println("Gleichschenkliges Dreieck");
break;
case EQUILATERAL:
System.out.println("Gleichseitiges Dreieck");
break;
}
}
// Analyse der Dreiecksart
public static TriangleType checkTriangle(float a, float b, float c) {
if (a <= 0 || b <= 0 || c <= 0) {
return TriangleType.NONE;
}
if (a + b <= c || a + c <= b || b + c <= a) {
return TriangleType.NONE;
}
if (a == b && b == c) {
return TriangleType.EQUILATERAL;
}
if (a == b || b == c || a == c) {
return TriangleType.ISOSCELES;
}
return TriangleType.NORMAL;
}
public enum TriangleType {
NONE,
NORMAL,
ISOSCELES, // Gleichschenklig
EQUILATERAL // Gleichseitig
}}
-49
View File
@@ -1,49 +0,0 @@
package Praktikum3;
public class ZahlenFilter {
public void durchlaufenUndPruefen(int maxZahl) {
for (int zahl = 1; zahl <= maxZahl; zahl++) {
if (filter(zahl)){
System.out.println(zahl + " erfüllt keins der Kriterien ");
}
}
}
public static boolean filter(int zahl){
return (!istDurch5Teilbar(zahl) && !endetAuf9(zahl) && !istDurch3TeilbarMitVorgaenger(zahl));
}
public static boolean istDurch5Teilbar(int zahl) {
return zahl % 5 == 0;
}
public static boolean endetAuf9(int zahl) {
String zahlAlsString = Integer.toString(zahl);
char letzteZiffer = zahlAlsString.charAt(zahlAlsString.length() - 1);
return letzteZiffer == '9';
}
public static boolean istDurch3TeilbarMitVorgaenger(int zahl) {
if (zahl > 1) {
int vorgaenger = zahl - 1;
int summe = zahl + vorgaenger;
return summe % 3 == 0;
}
return false;
}
public static void main(String[] args) {
int maxZahl = 200; // Standardwert
if (args.length > 0) {
try {
maxZahl = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("Ungültiger Parameter. Verwende Standardwert 200.");
}
}
ZahlenFilter pruefung = new ZahlenFilter();
pruefung.durchlaufenUndPruefen(maxZahl);
}
}
-15
View File
@@ -1,15 +0,0 @@
package Praktikum3;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
class TriangleCheckerTest {
@Test
void checkTriangle() {
assertEquals(TriangleChecker.TriangleType.NORMAL, TriangleChecker.checkTriangle(3, 4, 5 ));
assertEquals(TriangleChecker.TriangleType.EQUILATERAL, TriangleChecker.checkTriangle(3, 3, 3 ));
}
}
-33
View File
@@ -1,33 +0,0 @@
package Praktikum3;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ZahlenFilterTest {
@Test
void istDurch3TeilbarMitVorgaenger() {
assertTrue (ZahlenFilter.istDurch3TeilbarMitVorgaenger(5));
assertFalse(ZahlenFilter.istDurch3TeilbarMitVorgaenger(3));
}
@Test
void filter() {
assertTrue (ZahlenFilter.filter(3));
assertFalse(ZahlenFilter.filter(2));
}
@Test
void istDurch5Teilbar() {
assertTrue (ZahlenFilter.istDurch5Teilbar(10));
assertFalse(ZahlenFilter.istDurch5Teilbar(21));
}
@Test
void endetAuf9() {
assertTrue (ZahlenFilter.endetAuf9(19));
assertFalse(ZahlenFilter.endetAuf9(21));
}
}