This commit is contained in:
pascalhain 2024-01-07 15:58:07 +01:00
parent 4863c9d8f0
commit ec38213982
22 changed files with 852 additions and 5 deletions

87
src/Bot/Bot.java Normal file
View File

@ -0,0 +1,87 @@
package Bot;
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));
}
}
}
}

90
src/Bot/EscapeBot.java Normal file
View File

@ -0,0 +1,90 @@
package Bot;
import java.io.IOException;
public class EscapeBot extends Bot {
private boolean rocketFound = false;
private int counter=0;
public EscapeBot(String[] args) {
super(args);
}
@Override
protected char nextMove(View view) throws IOException {
counter++;
System.out.println(counter);
if (view.data.contains("o")) {
System.out.println("rocket found");
return moveToRocket(view);
}else {
return findRocket();
}
}
// Wenn die Rakete nicht gefunden wurde oder bereits gefunden wurde,
// mache einen zufälligen Schritt.
private char findRocket(){
if(counter==1||counter==6||counter==11||counter==21||counter==31||counter==46||counter==61||counter==81||counter==101||counter==126||counter==151||counter==181||counter==211||counter==246||counter==271){
System.out.println("ich dreh mich");
return '>';
}
System.out.println("ich geh gerade aus");
return '^';
}
private char moveToRocket(View view) {
int zeroIndex = view.data.indexOf("o");
// Berechne die x- und y-Koordinaten der "0" im Sichtfeld
int zeroX = zeroIndex % view.width;
int zeroY = zeroIndex / view.width;
// Berechne die x- und y-Koordinaten der aktuellen Position des Bots
int botX = view.width / 2;
int botY = view.width / 2;
System.out.println(zeroX);
System.out.println(zeroY);
System.out.println(botX);
System.out.println(botY);
if(zeroY<botY){
System.out.println("ich suche das ziehl");
return '^';
}else if(zeroY>botY){
return'v';
}else if(zeroY==botY){
if(zeroX<botX){
System.out.println("suche:Ich dreh mich nach links ");
return '<';
}else {
System.out.println("ziel:ich dreh mich nach rechts");
return '>';
}
}else
return 'q';
}
public static void main(String[] args) {
EscapeBot escapeBot = new EscapeBot(args);
escapeBot.run();
}
}

46
src/Bot/ManualBot.java Normal file
View File

@ -0,0 +1,46 @@
package Bot;
import java.io.IOException;
import java.util.Scanner;
public class ManualBot extends Bot {
public ManualBot(String[] args) {
super(args);
}
@Override
protected char nextMove(View view) throws IOException {
System.out.println(" (w: Forward, s: Backward, a: Left, d: Right, q: Quit): ");
Scanner scan= new Scanner(System.in);
//BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// String input = reader.readLine().trim();
String command = scan.nextLine();
switch (command) {
case "w":
return '^';
case "s":
return 'v';
case "a":
return '<';
case "d":
return '>';
case "q":
System.out.println("Connection terminated by user.");
throw new IOException("Connection terminated by user.");
default:
System.out.println("Invalid command. Try again.");
}
return 'q';
}
public static void main(String[] args) {
ManualBot manualBot = new ManualBot(args);
manualBot.run();
}
}

46
src/Bot/Rumblebot.java Normal file
View File

@ -0,0 +1,46 @@
package Bot;
import java.io.IOException;
import java.util.Scanner;
public class Rumblebot extends Bot {
public Rumblebot(String[] args) {
super(args);
}
@Override
protected char nextMove(View view) throws IOException {
System.out.println(" (w: Forward, s: Backward, a: Left, d: Right, q: Quit): ");
Scanner scan= new Scanner(System.in);
//BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// String input = reader.readLine().trim();
String command = scan.nextLine();
switch (command) {
case "w":
return '^';
case "s":
return 'v';
case "a":
return '<';
case "d":
return '>';
case "q":
System.out.println("Connection terminated by user.");
throw new IOException("Connection terminated by user.");
default:
System.out.println("Invalid command. Try again.");
}
return 'q';
}
public static void main(String[] args) {
Rumblebot rumblebot = new Rumblebot(args);
rumblebot.run();
}
}

143
src/Bot/SnakeBot.java Normal file
View File

@ -0,0 +1,143 @@
package Bot;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SnakeBot extends Bot {
public SnakeBot(String[] args) {
super(args);
}
int counter=0;
@Override
protected char nextMove(View view) throws IOException {
int wagenIndex = view.data.indexOf("*");
// Berechne die x- und y-Koordinaten der "0" im Sichtfeld
int wagenX = wagenIndex % view.width;
int wagenY = wagenIndex / view.width;
//Berechen die x- und y-Koordinate der @ im Sichtfeld
// Berechne die x- und y-Koordinaten der aktuellen Position des Bots
int botX = view.width / 2;
int botY = view.width / 2;
System.out.println("wagen"+wagenX+" ,"+wagenY);
System.out.println("bot"+botX+", "+botY);
if((wagenY+1)==botY){
System.out.println("ich dreh mich ");
return '>';
}else {
return search(view);
}
}
private char search(View view){
if(view.data.contains("@")){
return moveToRocket(view);
}
else {
System.out.println("ich laufe");
counter++;
if(counter>40){
counter=0;
return '>';
}
return '^';
}
}
private char moveToRocket(View view) {
int wagenIndex = view.data.indexOf("*");
// Berechne die x- und y-Koordinaten der "0" im Sichtfeld
int wagenX = wagenIndex % view.width;
int wagenY = wagenIndex / view.width;
int botX = view.width / 2;
int botY = view.width / 2;
// Finde alle '@'-Symbole im Sichtfeld
List<Integer> targetIndices = new ArrayList<>();
for (int i = 0; i < view.data.length(); i++) {
if (view.data.charAt(i) == '@') {
targetIndices.add(i);
}
}
if (targetIndices.isEmpty()) {
// Keine Ziele vorhanden, laufe weiter
System.out.println("Ich laufe weiter");
return '^';
}
// Finde das am nächsten liegende Ziel
int nearestTargetIndex = findNearestTarget(botX, botY, targetIndices, view.width);
// Berechne die x- und y-Koordinaten des nächsten Ziels
int targetX = nearestTargetIndex % view.width;
int targetY = nearestTargetIndex / view.width;
// Bewege dich in Richtung des nächsten Ziels
if (targetY < botY) {
System.out.println("Ich bewege mich nach oben");
return '^';
} else if (targetY > botY) {
if((wagenY+1)==botY){
System.out.println("ich dreh mich ");
return '>';
}else {
System.out.println("Ich bewege mich nach unten");
return 'v';}
} else {
if (targetX < botX) {
System.out.println("Ich drehe mich nach links");
return '<';
} else if (targetX > botX) {
System.out.println("Ich drehe mich nach rechts");
return '>';
}
}
// Default-Rückgabewert, sollte nicht erreicht werden
return 'q';
}
private int findNearestTarget(int botX, int botY, List<Integer> targetIndices, int width) {
int nearestTargetIndex = -1;
int minDistance = Integer.MAX_VALUE;
for (int targetIndex : targetIndices) {
int targetX = targetIndex % width;
int targetY = targetIndex / width;
int distance = Math.abs(targetX - botX) + Math.abs(targetY - botY);
if (distance < minDistance) {
minDistance = distance;
nearestTargetIndex = targetIndex;
}
}
return nearestTargetIndex;
}
public static void main(String[] args) {
SnakeBot snakebot= new SnakeBot(args);
snakebot.run();
}
}

View File

@ -0,0 +1,8 @@
package HelloWorld;
public class ErrorWriter implements IHelloWorldWriter {
@Override
public void writeHelloWorld(){
System.err.println("Hello World");
}
}

View File

@ -0,0 +1,24 @@
package HelloWorld;
public class Executor{
public static void main(String[] args) {
printwriteHelloWorld(new OutWriter(), new ErrorWriter(), true);
printwriteHelloWorld(new OutWriter(), new ErrorWriter(), false);
}
public static void printwriteHelloWorld(IHelloWorldWriter writer1, IHelloWorldWriter writer2, boolean second) {
if(second){
writer2.writeHelloWorld();
}else {
writer1.writeHelloWorld();
}
}
}

View File

@ -0,0 +1,9 @@
package HelloWorld;
public interface IHelloWorldWriter {
void writeHelloWorld();
}

View File

@ -0,0 +1,9 @@
package HelloWorld;
public class OutWriter implements IHelloWorldWriter {
@Override
public void writeHelloWorld(){
System.out.println("Hello Wolrd");
}
}

View File

@ -1,4 +1,4 @@
package Praktikum1; package praktikum1;
public class Teilerdurch5 { public class Teilerdurch5 {

View File

@ -1,6 +1,5 @@
package Praktikum1; package praktikum1;
import java.util.Scanner;
public class Zahlenfilter { public class Zahlenfilter {
public static void main(String[] args) { public static void main(String[] args) {

View File

45
src/Praktikum4/Fork.java Normal file
View File

@ -0,0 +1,45 @@
package Praktikum4;
public class Fork {
private boolean inUse=false;
private final int id;
public Fork(int id){
this.id=id;
}
public int getId(){
return id;
}
public boolean take(){
try {
//kurz warten
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
if (!inUse) {
inUse=true;
return true;
} else {
//System.out.println("Keine Gabel frei");
return false;
}
}
}
public void put(){
synchronized (this) {
inUse = false;
}
}
public boolean isInUse() {
return inUse;
}
}

View File

@ -0,0 +1,59 @@
package Praktikum4;
import java.util.concurrent.Semaphore;
class Philosopher implements Runnable{
protected int id;
protected final Fork left;
protected final Fork right;
public Philosopher(int id,Fork left,Fork rigth){
this.id=id;
this.left=left;
this.right=rigth;
}
private void tryToGetFork(Fork fork, String forkType) {
System.out.println("Philosopher " + id + " is trying to get " + forkType + " fork " + fork.getId());
while (!fork.take()) {
Thread.yield(); // Busy wait, um die CPU zu entlasten
}
System.out.println("Philosopher " + id + " got " + forkType + " fork " + fork.getId());
}
@Override
public void run() {
try {
Fork firstFork;
Fork secondFork;
if (left.getId() < right.getId()) {
firstFork = left;
secondFork = right;
} else {
firstFork = right;
secondFork = left;
}
tryToGetFork(firstFork, "first");
tryToGetFork(secondFork, "second");
System.out.println("Philosopher " + id + " is eating");
Thread.sleep(2000);
left.put();
right.put();
System.out.println("Philosopher " + id + " finished eating");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,58 @@
package Praktikum4;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SorterClient {
public static void main(String[] args) {
SorterClient client = new SorterClient();
client.run();
}
private void run() {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.isEmpty())
break;
line = sort(line);
System.out.println(line);
}
scanner.close();
}
private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;
private String sort(String line)
{
InetSocketAddress adress = new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT);
try ( Socket socket = new Socket()) {
socket.connect(adress);
sendLine(socket, line);
String answer = receiveLine(socket);
return answer;
} catch (IOException e) {
e.printStackTrace();
return "Error: Unable to communicate with the server.";
}
}
public static String receiveLine(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
return reader.readLine();
}
public static void sendLine(Socket socket, String line) throws IOException {
OutputStream out = socket.getOutputStream();
PrintWriter writer = new PrintWriter(out);
writer.println(line);
writer.flush();
}
}

View File

@ -0,0 +1,80 @@
package Praktikum4;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class SorterServer implements Runnable {
public static void main(String[] args) {
final int port = 12345;
try (ServerSocket socket = new ServerSocket(port)) {
while (true) {
Socket client = socket.accept();
Thread thread = new Thread(new SorterServer(client));
thread.start();
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
private Socket socket;
private SorterServer(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
String msg = receiveLine(this.socket);
String ausgabe=sortAndCount(msg);
sendLine(socket,ausgabe );
}
catch (Exception e) {};
}
public static String receiveLine(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
return reader.readLine();
}
public static void sendLine(Socket socket, String line) throws IOException {
OutputStream out = socket.getOutputStream();
PrintWriter writer = new PrintWriter(out);
writer.println(line);
writer.flush();
}
public static String sortAndCount(String input) {
Map<Character, Integer> charCountMap = new HashMap<>();
for (char c : input.toCharArray()) {
charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1);
}
StringBuilder sortedString = new StringBuilder();
for (char c = 'a'; c <= 'z'; c++) {
if (charCountMap.containsKey(c)) {
int count = charCountMap.get(c);
for (int i = 0; i < count; i++) {
sortedString.append(c);
}
}
}
// Rückgabe der sortierten Zeichenkette
return sortedString.toString();
}
}

11
src/Praktikum4/Table.java Normal file
View File

@ -0,0 +1,11 @@
package Praktikum4;
public class Table {
public static void main(String[] args) {
Fork[] forks = { new Fork(0), new Fork(1), new Fork(2),
new Fork(3), new Fork(4)}; Philosopher[] philosophers = {
new Philosopher(0, forks[0], forks[1]), new Philosopher(1, forks[1], forks[2]), new Philosopher(2, forks[2], forks[3]), new Philosopher(3, forks[3], forks[4]), new Philosopher(4, forks[4], forks[0])
};
for (Philosopher philosopher : philosophers) { Thread t = new Thread(philosopher); t.start();
} }
}

View File

@ -1,2 +0,0 @@
public class test {
}

View File

@ -0,0 +1,33 @@
/*package HelloWorld;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ExecutorTest {
@Test
void printwriteHelloWorld() {
//Mock-Objekte werden erzeugt
IHelloWorldWriter outMock =mock(OutWriter.class);
IHelloWorldWriter errMock =mock(OutWriter.class);
Executor.printwriteHelloWorld(outMock,errMock,true);
verify(outMock,times(1)).writeHelloWorld();
verify(errMock,times(0)).writeHelloWorld();
}
}
//writeHelloWorld wird einmal für outMock aufgerufen und keinmal für errMock, weil second auf false gesetzt wurde
// Mock -Objekte ermöglichen, Verhalten von Abhängigkeiten zu testen. Bei unserem Fall können wir nun die Methode aufrufen ohen das tatsächlich was geprintet wurde
// Bei fehlerhaftem Verhalten würde der Test fehlschlagen -- Die Methode hat also nicht die erwarteten Aufrufe
*/

View File

@ -0,0 +1,33 @@
package Praktikum4;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ForkTest {
@Test
void getId() {
Fork fork = new Fork(1);
assertEquals(1, fork.getId());
}
@Test
void take() {
Fork fork = new Fork(2);
assertTrue(fork.take());// sollte nicht in Gebrauch sein
}
@Test
void put() {
Fork fork = new Fork(3);
fork.put();
}
}

View File

@ -0,0 +1,37 @@
package praktikum1;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class TriangleCheckerTest {
@Test
void checkEquilateralTriangle() {
//Gleichseitig
assertEquals(TriangleChecker.TriangleType.EQUILATERAL,TriangleChecker.checkTriangle(5,5,5));
}
@Test
void checkIsoscelesTriangle(){
//Gleichschenklich
assertEquals(TriangleChecker.TriangleType.ISOSCELES, TriangleChecker.checkTriangle(5,5,3));
assertEquals(TriangleChecker.TriangleType.ISOSCELES, TriangleChecker.checkTriangle(3,5,5));
assertEquals(TriangleChecker.TriangleType.ISOSCELES, TriangleChecker.checkTriangle(5,3,5));
}
@Test
void checkNormalTrianlge(){
assertEquals(TriangleChecker.TriangleType.NORMAL,TriangleChecker.checkTriangle(3,5,7));
}
@Test
void chechNoneTrianlge(){
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(100,10,1));
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(10,100,1));
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(1,10,100));
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(-2,2,3));
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(2,-2,3));
assertEquals(TriangleChecker.TriangleType.NONE,TriangleChecker.checkTriangle(2,2,-3));
}
}

View File

@ -0,0 +1,32 @@
package praktikum1;
import com.sun.org.apache.xpath.internal.objects.XNumber;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Test;
class ZahlenfilterTest {
@org.junit.jupiter.api.Test
void istdurch5teilbar() {
assertFalse(Zahlenfilter.istdurch5teilbar(12));
assertTrue(Zahlenfilter.istdurch5teilbar(10));
}
@org.junit.jupiter.api.Test
void auf9endet() {
assertTrue(Zahlenfilter.auf9endet(89));
assertFalse(Zahlenfilter.auf9endet(65));
}
@org.junit.jupiter.api.Test
void addiertunddurch3() {
assertTrue(Zahlenfilter.addiertunddurch3(9,6));
}
}