From a3fdf96966d6e19c62e3ebf6bd45a5b2c4ae23a8 Mon Sep 17 00:00:00 2001 From: Emman Mensdorf Date: Thu, 8 Feb 2024 14:39:32 +0100 Subject: [PATCH] =?UTF-8?q?PuzzleII.c=20l=C3=B6sung=20erg=C3=A4nzt,=20Emma?= =?UTF-8?q?n=20Mensdorf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/schach_in_ein_puzzle/PuzzleI.c | 57 ++++++++++++-- src/schach_in_ein_puzzle/PuzzleII.c | 115 ++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 8 deletions(-) diff --git a/src/schach_in_ein_puzzle/PuzzleI.c b/src/schach_in_ein_puzzle/PuzzleI.c index d99e192..ed09f59 100644 --- a/src/schach_in_ein_puzzle/PuzzleI.c +++ b/src/schach_in_ein_puzzle/PuzzleI.c @@ -28,14 +28,14 @@ char** Puzzlebrett_erstellen() { // Spielbrett befüllen, groß und kleinschreibung unterschiedlich um schwarz/weiß zu trennen char Aufbau[8][8] = { - { 'R' , 'N' , ' ' , 'K' , ' ' , ' ' , 'N' , 'R' }, - { 'P' , 'P' , 'P' , ' ' , ' ' , ' ' , 'B' , 'P' }, - { ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' }, - { ' ' , ' ' , ' ' , 'P' , ' ' , 'B' , ' ' , ' ' }, - { ' ' , ' ' , ' ' , ' ' , 'D' , ' ' , ' ' , ' ' }, - { ' ' , ' ' , 'n' , ' ' , ' ' , 'n' , ' ' , ' ' }, - { 'p' , 'p' , 'p' , ' ' , 'p' , 'p' , 'p' , 'p' }, - { 'r' , ' ' , 'b' , 'k' , 'd' , 'b' , ' ' , 'r' } + { ' ' , 'K' , ' ' , ' ' , 'R' , ' ' , ' ' , ' ' }, + { ' ' , 'P' , 'P' , ' ' , ' ' , ' ' , 'r' , ' ' }, + { 'P' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' }, + { ' ' , ' ' , 'b' , ' ' , ' ' , ' ' , ' ' , ' ' }, + { ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , 'P' }, + { ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , 'p' }, + { 'p' , 'p' , 'p' , ' ' , ' ' , ' ' , ' ' , ' ' }, + { ' ' , 'k' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' } }; for (int i = 0; i < 8; i++) { @@ -72,3 +72,44 @@ void Puzzlebrettspeicher_freigeben(char** Brett) { free(Brett); } + +bool loesung_abchecken(char** Brett) { + // checke nach dem gegnerischen König (kleines 'k') ab + int koenig_X = -1, koenig_Y = -1; + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + if (Brett[i][j] == 'k') { + koenig_X = i; + koenig_Y = j; + break; + } + } + if (koenig_X != -1 && koenig_Y != -1) { + break; + } + } + + // Überprüfe, ob der gegnerische König schachmatt auf dem feld + if (koenig_X == -1 || koenig_Y == -1) { + // König nicht gefunden -> error + return false; + } + + // Überprüfe, ob der gegnerische König von einer Figur bedroht wird + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + if (Brett[i][j] == 'R') { + // Überprüfe, ob der Turm den König horizontal bedroht + if (i == 7 && j == 4) { + // Der Turm bedroht den König + printf("Puzzle geloest"); + return true; // gelöst + } + + } + } + } + // Wenn keine Figur den gegnerischen König bedroht, ist das Puzzle nicht gelöst + printf("Puzzle nicht gelöst"); + return false; +} \ No newline at end of file diff --git a/src/schach_in_ein_puzzle/PuzzleII.c b/src/schach_in_ein_puzzle/PuzzleII.c index e69de29..df73601 100644 --- a/src/schach_in_ein_puzzle/PuzzleII.c +++ b/src/schach_in_ein_puzzle/PuzzleII.c @@ -0,0 +1,115 @@ +#include +#include +#include "stdio.h" + +char** Puzzlebrett_erstellen() { + + int R = 8; //Reihen + int Z = 8; //zeilen + + //Dynamisch Platz zuweisen für schachbrett + char** Brett = (char**)malloc(R * sizeof(char*)); + + if (Brett == NULL) { + // Fehler bei speicherzuweißung + return NULL; + } + for (int i = 0; i < R; i++) { + Brett[i] = (char*)malloc(Z * sizeof(char)); + if (Brett[i] == NULL) { + // Speicherfehlerbehbung + for (int j = 0; j < i; j++) { + free(Brett[j]); + } + free(Brett); + return NULL; + } + } + + // Spielbrett befüllen, groß und kleinschreibung unterschiedlich um schwarz/weiß zu trennen + char Aufbau[8][8] = { + { 'R' , 'N' , ' ' , 'K' , ' ' , ' ' , 'N' , 'R' }, + { 'P' , 'P' , 'P' , ' ' , ' ' , ' ' , 'B' , 'P' }, + { ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' }, + { ' ' , ' ' , ' ' , 'P' , ' ' , 'B' , ' ' , ' ' }, + { ' ' , ' ' , ' ' , ' ' , 'D' , ' ' , ' ' , 'P' }, + { ' ' , ' ' , 'n' , ' ' , ' ' , 'n' , ' ' , 'p' }, + { 'p' , 'p' , 'p' , ' ' , 'p' , 'p' , 'p' , 'p' }, + { 'r' , ' ' , 'b' , 'k' , 'd' , 'b' , ' ' , 'r' } + }; + + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + Brett[i][j] = Aufbau[i][j]; + } + } + + return Brett; +} + +void print_Puzzlebrett(char** Brett) { + int counter = 1; + printf(" - 1 2 3 4 5 6 7 8 \n"); + for (int i = 0; i < 8; i++) { + printf(" %d " , counter); + counter++; + for (int j = 0; j < 8; j++) { + printf(" %c ", Brett[i][j]); + } + printf("\n"); + } + printf("\n"); +} + +void Puzzlebrettspeicher_freigeben(char** Brett) { + if (Brett == NULL) { + return; + } + + for (int i = 0; i < 8; i++) { + free(Brett[i]); + } + + free(Brett); +} + +bool loesung_abchecken(char** Brett) { + // checke nach dem gegnerischen König (kleines 'k') ab + int koenig_X = -1, koenig_Y = -1; + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + if (Brett[i][j] == 'k') { + koenig_X = i; + koenig_Y = j; + break; + } + } + if (koenig_X != -1 && koenig_Y != -1) { + break; + } + } + + // Überprüfe, ob der gegnerische König schachmatt auf dem feld + if (koenig_X == -1 || koenig_Y == -1) { + // König nicht gefunden -> error + return false; + } + + // Überprüfe, ob der gegnerische König von einer Figur bedroht wird + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + if (Brett[i][j] == 'D') { + // Lösung + if (i == 6 && j == 2) { + // Der Turm bedroht den König + printf("Puzzle geloest"); + return true; // gelöst + } + + } + } + } + // Wenn keine Figur den gegnerischen König bedroht, ist das Puzzle nicht gelöst + printf("Puzzle nicht gelöst"); + return false; +} \ No newline at end of file