Browse Source

Merge branch 'fdai7492' into 'main'

Projekt überarbeitung

See merge request fdai7834/taktikmeister!1
remotes/origin/Läufer-fertig,-Hendrik-Voß
fdai7492 11 months ago
parent
commit
026a6fb36e
  1. 7
      .vscode/launch.json
  2. 58
      Plan.md
  3. 3
      build/test/cache/defines_dependency.yml
  4. 242
      build/test/cache/input.yml
  5. 257
      build/test/cache/test_schach.c
  6. 6
      build/test/dependencies/cmock.d
  7. 0
      build/test/dependencies/force_build
  8. 1
      build/test/dependencies/schach.d
  9. 4
      build/test/dependencies/test_schach.d
  10. 4
      build/test/dependencies/test_schach_runner.d
  11. 4
      build/test/dependencies/unity.d
  12. BIN
      build/test/out/c/cmock.o
  13. BIN
      build/test/out/c/schach.o
  14. BIN
      build/test/out/c/test_schach.o
  15. BIN
      build/test/out/c/test_schach_runner.o
  16. BIN
      build/test/out/c/unity.o
  17. BIN
      build/test/out/test_schach.out
  18. 257
      build/test/preprocess/files/test_schach.c
  19. 3
      build/test/preprocess/includes/test_schach.c
  20. 34
      build/test/results/test_schach.pass
  21. 89
      build/test/runners/test_schach_runner.c
  22. 32
      src/Input.c
  23. 6
      src/Input.h
  24. 17
      src/Moving.c
  25. 10
      src/Moving.h
  26. 68
      src/Schachbrett.c
  27. 8
      src/Schachbrett.h
  28. 9
      src/Spieler.h
  29. 4
      src/main.c
  30. 9
      src/main.h
  31. 195
      src/schach.c
  32. BIN
      src/schach.exe
  33. 15
      src/schach.h
  34. 1
      temp_input.txt
  35. 45
      test/test_Input.c
  36. 26
      test/test_Schachbrett.c
  37. 107
      test/test_schach.c

7
.vscode/launch.json

@ -1,7 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": []
}

58
Plan.md

@ -0,0 +1,58 @@
## Spielablauf:
1. Ausgabe vom Spielfeld
2. Weiß nach Figur für Zug fragen
3. Weiß nach Ziel der Figur fragen
4. Überprüfen ob Eingabe möglich ist
4.1. falls nicht Schritt 2,3 und 4 Wiederholen
4.2. Schach überprüfen bzw Schachmatt
5. Figur bewegen
5.1. falls gegnerische Figur -> Schlagen
6. Wiederholung von 1-5 für Schwarz
## Programmablauf:
1. Spielfeld in der create_Schachfeld erstellen
1.1 Schachfeld füllen
2. Spielfeld anzeigen mit print_Schachfeld
3. Eingabe mit choose_Figur
3.1 erst x dann y
4. Eingabe mit choose_destination_Figur
4.1 erst x dann y
5. Überprüfung der Figur mit check_Figur
5.1.bsp.: Eingabe choose_Figur x=0 y=0 temp. char welcher die eingabe des Spielfeldarray an der Stelle 0 0 speichert
5.2. if abfrage welche Figur da steht
5.2.1. wechsel in die seperaten Figuren-Funktionen(Datein)
5.3. Prüfen ob schwarz oder weiß durch groß und kleinschreibung
6. In den seperaten Figuren-Funktionen wird überprüft ob der Zug möglich ist
6.1 wenn möglich wird die Figur an die stelle gesetzt
6.2 wenn es nicht möglich ist dann wird Schritt 2-6 wiederholt
7.(Schachmatt wird in check_checkmate überprüft)
8.Schritt 2-8 wird Wiederholt

3
build/test/cache/defines_dependency.yml

@ -1,3 +0,0 @@
---
src/schach.c:
- TEST

242
build/test/cache/input.yml

@ -1,242 +0,0 @@
---
:project:
:use_exceptions: false
:use_mocks: true
:compile_threads: 1
:test_threads: 1
:use_test_preprocessor: true
:use_preprocessor_directives: false
:use_deep_dependencies: false
:generate_deep_dependencies: true
:auto_link_deep_dependencies: false
:test_file_prefix: test_
:options_paths: []
:release_build: false
:use_auxiliary_dependencies: true
:build_root: build
:which_ceedling: gem
:ceedling_version: 0.31.1
:default_tasks:
- test:all
:release_build:
:use_assembly: false
:artifacts: []
:paths:
:test:
- "+:test/**"
- "-:test/support"
:source:
- src/**
:support:
- test/support
:include: []
:libraries: []
:test_toolchain_include: []
:release_toolchain_include: []
:files:
:test: []
:source: []
:assembly: []
:support: []
:include: []
:environment:
- :rake_columns: '120'
:defines:
:test:
- &1 []
- TEST
:test_preprocess:
- *1
- TEST
:release: []
:release_preprocess: []
:use_test_definition: false
:common: []
:libraries:
:flag: "-l${1}"
:path_flag: "-L ${1}"
:test: []
:test_preprocess: []
:release: []
:release_preprocess: []
:placement: :end
:system: []
:flags: {}
:extension:
:header: ".h"
:source: ".c"
:assembly: ".s"
:object: ".o"
:libraries:
- ".a"
- ".so"
:executable: ".out"
:map: ".map"
:list: ".lst"
:testpass: ".pass"
:testfail: ".fail"
:dependencies: ".d"
:unity:
:vendor_path: C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor
:defines: []
:cmock:
:vendor_path: C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor
:defines: []
:includes: []
:mock_prefix: mock_
:when_no_prototypes: :warn
:enforce_strict_ordering: true
:plugins:
- :ignore
- :callback
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
:mock_path: build/test/mocks
:verbosity: 3
:unity_helper: false
:cexception:
:vendor_path: C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor
:defines: []
:test_runner:
:includes: []
:file_suffix: _runner
:tools:
:test_compiler:
:executable: gcc.exe
:name: default_test_compiler
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-DGNU_COMPILER"
- "-g"
- ''
- -c "${1}"
- -o "${2}"
- "-MMD"
- -MF "${4}"
:test_fixture:
:executable: "${1}"
:name: default_test_fixture
:stderr_redirect: :auto
:background_exec: :none
:optional: false
:arguments: []
:test_linker:
:executable: gcc.exe
:name: default_test_linker
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- ''
- '"${1}"'
- "${5}"
- -o "${2}"
- ''
- "${4}"
- ''
:test_file_preprocessor:
:executable: gcc.exe
:name: default_test_file_preprocessor
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- "-E"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- '"${1}"'
- -o "${2}"
:test_file_preprocessor_directives:
:executable: gcc.exe
:name: default_test_file_preprocessor_directives
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- "-E"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- "-fdirectives-only"
- '"${1}"'
- -o "${2}"
:test_includes_preprocessor:
:executable: gcc.exe
:name: default_test_includes_preprocessor
:stderr_redirect: :none
:background_exec: :none
:optional: false
:arguments:
- ''
- ''
- "-E"
- "-MM"
- "-MG"
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- "-D$": COLLECTION_DEFINES_TEST_AND_VENDOR
- "-D$": DEFINES_TEST_PREPROCESS
- "-DGNU_COMPILER"
- '"${1}"'
:test_compiler:
:arguments: []
:test_linker:
:arguments: []
:test_fixture:
:arguments: []
:link_objects: []
:test_includes_preprocessor:
:arguments: []
:test_file_preprocessor:
:arguments: []
:test_file_preprocessor_directives:
:arguments: []
:test_dependencies_generator:
:arguments: []
:release_compiler:
:arguments: []
:release_linker:
:arguments: []
:release_assembler:
:arguments: []
:release_dependencies_generator:
:arguments: []
:plugins:
:load_paths:
- C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/lib/../plugins
:enabled:
- stdout_pretty_tests_report
- module_generator
:display_raw_test_results: false
:stdout_pretty_tests_report_path: C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/lib/../plugins/stdout_pretty_tests_report
:module_generator_path: C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/lib/../plugins/module_generator
:gcov:
:reports:
- HtmlDetailed
:gcovr:
:html_medium_threshold: 75
:html_high_threshold: 90
:module_generator:
:project_root: "./"
:source_root: src/
:test_root: test/

257
build/test/cache/test_schach.c

@ -1,257 +0,0 @@
#include "src/schach.h"
#include "C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_print_Schachfeld(void){
char expected = 'S';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[5][0])), (
((void *)0)
), (UNITY_UINT)(26), UNITY_DISPLAY_STYLE_CHAR);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[4][3])), (
((void *)0)
), (UNITY_UINT)(27), UNITY_DISPLAY_STYLE_CHAR);
}
void test_print_Schachfeld_Turm_weiss(void){
char expected = 'T';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[0][0])), (
((void *)0)
), (UNITY_UINT)(40), UNITY_DISPLAY_STYLE_CHAR);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[0][7])), (
((void *)0)
), (UNITY_UINT)(41), UNITY_DISPLAY_STYLE_CHAR);
}
void test_print_Schachfeld_Bauern_weiss(void){
char expected = 'B';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
for(int l = 0;l<y;l++){
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[1][l])), (
((void *)0)
), (UNITY_UINT)(55), UNITY_DISPLAY_STYLE_CHAR);
}
}
void test_print_Schachfeld_dame_schwarz(void){
char expected = 'd';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[7][3])), (
((void *)0)
), (UNITY_UINT)(70), UNITY_DISPLAY_STYLE_CHAR);
}
void test_read_input(void) {
const char *input = "8\n";
int result = 0;
int expected = 7;
FILE *original_stdin = freopen(
((void *)0)
, "r",
(__acrt_iob_func(0))
);
FILE *tempInput = fopen("temp_input.txt", "w");
fputs(input, tempInput);
fclose(tempInput);
tempInput = freopen("temp_input.txt", "r",
(__acrt_iob_func(0))
);
result = read_input();
UnityAssertEqualNumber((UNITY_INT)((expected)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(96), UNITY_DISPLAY_STYLE_INT);
fclose(tempInput);
freopen("/dev/tty", "r",
(__acrt_iob_func(0))
);
freopen(
((void *)0)
, "r",
(__acrt_iob_func(0))
);
}

6
build/test/dependencies/cmock.d

@ -1,6 +0,0 @@
build/test/out/c/cmock.o: \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock.c \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/cmock/src/cmock_internals.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

0
build/test/dependencies/force_build

1
build/test/dependencies/schach.d

@ -1 +0,0 @@
build/test/out/c/schach.o: src/schach.c src/main.h

4
build/test/dependencies/test_schach.d

@ -1,4 +0,0 @@
build/test/out/c/test_schach.o: test/test_schach.c \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \
src/schach.h src/main.h

4
build/test/dependencies/test_schach_runner.d

@ -1,4 +0,0 @@
build/test/out/c/test_schach_runner.o: \
build/test/runners/test_schach_runner.c \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

4
build/test/dependencies/unity.d

@ -1,4 +0,0 @@
build/test/out/c/unity.o: \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.c \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h

BIN
build/test/out/c/cmock.o

BIN
build/test/out/c/schach.o

BIN
build/test/out/c/test_schach.o

BIN
build/test/out/c/test_schach_runner.o

BIN
build/test/out/c/unity.o

BIN
build/test/out/test_schach.out

257
build/test/preprocess/files/test_schach.c

@ -1,257 +0,0 @@
#include "src/schach.h"
#include "C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_print_Schachfeld(void){
char expected = 'S';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[5][0])), (
((void *)0)
), (UNITY_UINT)(26), UNITY_DISPLAY_STYLE_CHAR);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[4][3])), (
((void *)0)
), (UNITY_UINT)(27), UNITY_DISPLAY_STYLE_CHAR);
}
void test_print_Schachfeld_Turm_weiss(void){
char expected = 'T';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[0][0])), (
((void *)0)
), (UNITY_UINT)(40), UNITY_DISPLAY_STYLE_CHAR);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[0][7])), (
((void *)0)
), (UNITY_UINT)(41), UNITY_DISPLAY_STYLE_CHAR);
}
void test_print_Schachfeld_Bauern_weiss(void){
char expected = 'B';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
for(int l = 0;l<y;l++){
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[1][l])), (
((void *)0)
), (UNITY_UINT)(55), UNITY_DISPLAY_STYLE_CHAR);
}
}
void test_print_Schachfeld_dame_schwarz(void){
char expected = 'd';
int x = 8;
int y = 8;
char** Spielfeld = create_Schachfeld(x, y);
UnityAssertEqualNumber((UNITY_INT)(UNITY_INT8 )((expected)), (UNITY_INT)(UNITY_INT8 )((Spielfeld[7][3])), (
((void *)0)
), (UNITY_UINT)(70), UNITY_DISPLAY_STYLE_CHAR);
}
void test_read_input(void) {
const char *input = "8\n";
int result = 0;
int expected = 7;
FILE *original_stdin = freopen(
((void *)0)
, "r",
(__acrt_iob_func(0))
);
FILE *tempInput = fopen("temp_input.txt", "w");
fputs(input, tempInput);
fclose(tempInput);
tempInput = freopen("temp_input.txt", "r",
(__acrt_iob_func(0))
);
result = read_input();
UnityAssertEqualNumber((UNITY_INT)((expected)), (UNITY_INT)((result)), (
((void *)0)
), (UNITY_UINT)(96), UNITY_DISPLAY_STYLE_INT);
fclose(tempInput);
freopen("/dev/tty", "r",
(__acrt_iob_func(0))
);
freopen(
((void *)0)
, "r",
(__acrt_iob_func(0))
);
}

3
build/test/preprocess/includes/test_schach.c

@ -1,3 +0,0 @@
---
- C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h
- src/schach.h

34
build/test/results/test_schach.pass

@ -1,34 +0,0 @@
---
:source:
:path: test
:file: test_schach.c
:successes:
- :test: test_print_Schachfeld
:line: 16
:message: ''
:unity_test_time: 0
- :test: test_print_Schachfeld_Turm_weiss
:line: 30
:message: ''
:unity_test_time: 0
- :test: test_print_Schachfeld_Bauern_weiss
:line: 44
:message: ''
:unity_test_time: 0
- :test: test_print_Schachfeld_dame_schwarz
:line: 60
:message: ''
:unity_test_time: 0
- :test: test_read_input
:line: 77
:message: ''
:unity_test_time: 0
:failures: []
:ignores: []
:counts:
:total: 5
:passed: 5
:failed: 0
:ignored: 0
:stdout: []
:time: 1.9014686000300571

89
build/test/runners/test_schach_runner.c

@ -1,89 +0,0 @@
/* AUTOGENERATED FILE. DO NOT EDIT. */
/*=======Automagically Detected Files To Include=====*/
#include "unity.h"
int GlobalExpectCount;
int GlobalVerifyOrder;
char* GlobalOrderError;
/*=======External Functions This Runner Calls=====*/
extern void setUp(void);
extern void tearDown(void);
extern void test_print_Schachfeld(void);
extern void test_print_Schachfeld_Turm_weiss(void);
extern void test_print_Schachfeld_Bauern_weiss(void);
extern void test_print_Schachfeld_dame_schwarz(void);
extern void test_read_input(void);
/*=======Mock Management=====*/
static void CMock_Init(void)
{
GlobalExpectCount = 0;
GlobalVerifyOrder = 0;
GlobalOrderError = NULL;
}
static void CMock_Verify(void)
{
}
static void CMock_Destroy(void)
{
}
/*=======Test Reset Options=====*/
void resetTest(void);
void resetTest(void)
{
tearDown();
CMock_Verify();
CMock_Destroy();
CMock_Init();
setUp();
}
void verifyTest(void);
void verifyTest(void)
{
CMock_Verify();
}
/*=======Test Runner Used To Run Each Test=====*/
static void run_test(UnityTestFunction func, const char* name, UNITY_LINE_TYPE line_num)
{
Unity.CurrentTestName = name;
Unity.CurrentTestLineNumber = line_num;
#ifdef UNITY_USE_COMMAND_LINE_ARGS
if (!UnityTestMatches())
return;
#endif
Unity.NumberOfTests++;
UNITY_CLR_DETAILS();
UNITY_EXEC_TIME_START();
CMock_Init();
if (TEST_PROTECT())
{
setUp();
func();
}
if (TEST_PROTECT())
{
tearDown();
CMock_Verify();
}
CMock_Destroy();
UNITY_EXEC_TIME_STOP();
UnityConcludeTest();
}
/*=======MAIN=====*/
int main(void)
{
UnityBegin("test_schach.c");
run_test(test_print_Schachfeld, "test_print_Schachfeld", 16);
run_test(test_print_Schachfeld_Turm_weiss, "test_print_Schachfeld_Turm_weiss", 30);
run_test(test_print_Schachfeld_Bauern_weiss, "test_print_Schachfeld_Bauern_weiss", 44);
run_test(test_print_Schachfeld_dame_schwarz, "test_print_Schachfeld_dame_schwarz", 60);
run_test(test_read_input, "test_read_input", 77);
return UnityEnd();
}

32
src/Input.c

@ -0,0 +1,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getUserInput() {
const int BUFFER_SIZE = 64;
char *input = (char*)malloc(BUFFER_SIZE * sizeof(char));
if (input == NULL) {
// Fehler bei speicherzuweisung
return NULL;
}
printf("-> ");
if (fgets(input, BUFFER_SIZE, stdin) == NULL) {
// Fehler bei fgets
free(input);
return NULL;
}
size_t len = strlen(input);
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// Länge an den eigentlichen input anpassen um speicher zu sparen
char *resizedInput = realloc(input, strlen(input) + 1);
if (resizedInput != NULL) {
input = resizedInput;
}
return input;
}

6
src/Input.h

@ -0,0 +1,6 @@
#ifndef INPUT
#define INPUT
char* getUserInput();
#endif // INPUT

17
src/Moving.c

@ -0,0 +1,17 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "spieler.h"
bool istzugerlaubt(char** Brett, int startX, int startY, int endX, int endY, Player player) {
/* Regeln hierhin
z.B. schauen ob der zug auch innerhalb vom spielbrett ist,
schauen ob auf dem zielfeld keine eigene Figur steht,
schauen ob von der startposition aus der zug auch für die ausgewählte figur möglich ist.
return true wenn möglich oder false falls nicht.
*/
}
void machezug(char** Brett, int startX, int startY, int endX, int endY) {
//wenn istzugerlaubt true ist wird das hier ausgeführt
}

10
src/Moving.h

@ -0,0 +1,10 @@
#ifndef MOVING_H
#define MOVING_H
#include <stdbool.h>
#include "spieler.h"
bool istzugerlaubt(char** Brett, int startX, int startY, int endX, int endY, Player player);
void machezug(char** Brett, int startX, int startY, int endX, int endY);
#endif // MOVING_H

68
src/Schachbrett.c

@ -0,0 +1,68 @@
#include <stdio.h>
#include <stdlib.h>
char** Schachbrett_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' , 'B' , 'Q' , 'K' , 'B' , 'N' , 'R' },
{ 'P' , 'P' , 'P' , 'P' , 'P' , 'P' , 'P' , 'P' },
{ ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' },
{ ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' },
{ ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' },
{ ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' },
{ 'p' , 'p' , 'p' , 'p' , 'p' , 'p' , 'p' , 'p' },
{ 'r' , 'n' , 'b' , 'q' , 'k' , 'b' , 'n' , '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_Schachfeld(char** Brett, int Reihen, int Spalten) {
for (int i = 0; i < Reihen; i++) {
for (int j = 0; j < Spalten; j++) {
printf(" %c ", Brett[i][j]);
}
printf("\n");
}
}
void Schachbrettspeicher_freigeben(char** Brett, int Reihen) {
if (Brett == NULL) {
return;
}
for (int i = 0; i < Reihen; i++) {
free(Brett[i]);
}
free(Brett);
}

8
src/Schachbrett.h

@ -0,0 +1,8 @@
#ifndef SCHACHBRETT_H
#define SCHACHBRETT_H
char** Schachbrett_erstellen();
void print_Schachfeld(char** Brett, int Reihen, int Spalten)
void Schachbrettspeicher_freigeben(char** Brett, int Reihen);
#endif // SCHACHBRETT_H

9
src/Spieler.h

@ -0,0 +1,9 @@
#ifndef Spieler
#define Spieler
typedef enum {
PLAYER_WHITE,
PLAYER_BLACK
} Player;
#endif // Spieler

4
src/main.c

@ -1,10 +1,9 @@
#include <stdio.h>
#include <stdlib.h>
#include "schach.h"
int main() {
int x = 8;
/* int x = 8;
int y = 8;
int spieler = 0;
char** Spielfeld = create_Schachfeld(x, y);
@ -22,4 +21,5 @@ int main() {
free_Schachfeld(Spielfeld, x);
return 0;
*/
}

9
src/main.h

@ -1,9 +0,0 @@
#ifndef MAIN
#define MAIN
int main();
#endif

195
src/schach.c

@ -1,195 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
/*
Spielablauf:
1. Ausgabe vom Spielfeld
2. Weiß nach Figur für Zug fragen
3. Weiß nach Ziel der Figur fragen
4. Überprüfen ob Eingabe möglich ist
4.1. falls nicht Schritt 2,3 und 4 Wiederholen
4.2. Schach überprüfen bzw Schachmatt
5. Figur bewegen
5.1. falls gegnerische Figur -> Schlagen
6. Wiederholung von 1-5 für Schwarz
Eingaben sind Koordinaten
Programmablauf:
1.Spielfeld in der create_Schachfeld erstellen
1.1 Schachfeld füllen
2.Spielfeld anzeigen mit print_Schachfeld
3.Eingabe mit choose_Figur
3.1 erst x dann y
4.Eingabe mit choose_destination_Figur
4.1 erst x dann y
5.Überprüfung der Figur mit check_Figur
5.1.bsp.: Eingabe choose_Figur x=0 y=0 temp. char welcher die eingabe des Spielfeldarray
an der Stelle 0 0 speichert
5.2. if abfrage welche Figur da steht
5.2.1. wechsel in die seperaten Figuren-Funktionen(Datein)
5.3. Prüfen ob schwarz oder weiß durch groß und kleinschreibung
6.In den seperaten Figuren-Funktionen wird überprüft ob der Zug möglich ist
6.1 wenn möglich wird die Figur an die stelle gesetzt
6.2 wenn es nicht möglich ist dann wird Schritt 2-6 wiederholt
7.(Schachmatt wird in check_checkmate überprüft)
8.Schritt 2-8 wird Wiederholt
*/
int checkmate(){
return 0;
}
int read_input(){
int koordinate = 0;
scanf("%d", &koordinate);
if(koordinate < 9){
return koordinate - 1;
}
else{
read_input();
}
}
void choose_Figur(char active_Player, char** spielfeld){
int x,y;
printf("Spieler %c ist an der Reihe!\nX-Koordinaten der Figur die bewegt werden soll eingeben:\n", active_Player);
x = read_input();
printf("X-Koordinaten der Figur der bewegt werden soll eingeben:\n");
y = read_input();
char ausgewählte_Figur = spielfeld[x][y];
if (active_Player == 'w'){
switch(ausgewählte_Figur){
case 'D' :
//dame.c;
break;
case 'K' :
//könig.c;
break;
case 'L' :
//läufer.c;
break;
case 'T' :
//turm.c;
break;
case 'P' :
//pferd.c;
break;
case 'B' :
//bauer.c;
break;
default :
printf("Wrong Input");
choose_Figur(active_Player,spielfeld);
break;
}
}else{
switch(ausgewählte_Figur){
case 'd' :
//dame.c;
break;
case 'k' :
//könig.c;
break;
case 'l' :
//läufer.c;
break;
case 't' :
//turm.c;
break;
case 'p' :
//pferd.c;
break;
case 'b' :
//bauer.c;
break;
default :
printf("Wrong Input");
choose_Figur(active_Player,spielfeld);
break;
}
}
}
void print_Schachfeld(char** Spielfeld, int x, int y) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
printf(" %c ", Spielfeld[i][j]);
}
printf ("\n");
}
}
char** create_Schachfeld(int x, int y) {
char** Spielfeld = (char**)malloc(x * sizeof(char*));
for (int i = 0; i < x; i++) {
Spielfeld[i] = (char*)malloc(y * sizeof(char));
for (int j = 0; j < y; j++) {
if ((i + j) % 2 == 0) {
Spielfeld[i][j] = 'W';
} else {
Spielfeld[i][j] = 'S';
}
}
}
Spielfeld[0][0] = 'T'; //Turm Weiß
Spielfeld[0][1] = 'P'; //Pferd Weiß
Spielfeld[0][2] = 'L'; //Laufer Weiß
Spielfeld[0][3] = 'D'; //Dame Weiß
Spielfeld[0][4] = 'K'; //König Weiß
Spielfeld[0][5] = 'L';
Spielfeld[0][6] = 'P';
Spielfeld[0][7] = 'T';
for(int l = 0;l<8;l++){ // Bauern Weiß
Spielfeld[1][l] = 'B';
}
Spielfeld[7][0] = 't'; //Turm Schwarz
Spielfeld[7][1] = 'p';
Spielfeld[7][2] = 'l';
Spielfeld[7][3] = 'd';
Spielfeld[7][4] = 'k';
Spielfeld[7][5] = 'l';
Spielfeld[7][6] = 'p';
Spielfeld[7][7] = 't';
for(int l = 0;l<8;l++){ //Bauern Schwarz
Spielfeld[6][l] = 'b';
}
return Spielfeld;
}
void free_Schachfeld(char** Spielfeld, int x) {
for (int i = 0; i < x; i++) {
free(Spielfeld[i]);
}
free(Spielfeld);
}

BIN
src/schach.exe

15
src/schach.h

@ -1,15 +0,0 @@
#ifndef SCHACH
#define SCHACH
#include "main.h"
void print_Schachfeld(char** , int , int );
char** create_Schachfeld(int , int );
void free_Schachfeld(char** , int );
int checkmate();
int read_input();
void choose_Figur(char, char**);
#endif

1
temp_input.txt

@ -1 +0,0 @@
8

45
test/test_Input.c

@ -0,0 +1,45 @@
#ifdef TEST
#include <stdlib.h>
#include "unity.h"
#include "Input.h"
void setUp(void) {
}
void tearDown(void) {
}
void test_getUserInput(void) {
/*Bei dem benutzen dieser Funktion muss man mit free() den speicher wieder freigeben um memory leaks zu vermeiden
Beispiel :
char* input = getUserInput();
if (input != NULL) {
input wird hier benutzt
free(input); damit wird der speicher wieder freigegeben wird
*/
const char *test_input = "a1";
FILE *tempInputFile;
// Datei erstellen
tempInputFile = fopen("temp_input.txt", "w");
fprintf(tempInputFile, "%s\n", test_input);
fclose(tempInputFile);
// aus der Datei lesen um User input zu simulieren
tempInputFile = freopen("temp_input.txt", "r", stdin);
char *actual_input = getUserInput();
TEST_ASSERT_EQUAL_STRING(test_input, actual_input);
//Clean-up
free(actual_input); // siehe kommentar in input.c
fclose(tempInputFile);
remove("temp_input.txt"); // Datei automatisch löschen
}
#endif // TEST

26
test/test_Schachbrett.c

@ -0,0 +1,26 @@
#ifdef TEST
#include "unity.h"
#include "Schachbrett.h"
void setUp(void) {
}
void tearDown(void) {
}
void test_Schachbrett_erstellen(void) {
char** brett = Schachbrett_erstellen();
TEST_ASSERT_NOT_NULL(brett);
// Testen von ein Paar Positionen
TEST_ASSERT_EQUAL('R', brett[0][0]);
TEST_ASSERT_EQUAL('p', brett[6][0]);
TEST_ASSERT_EQUAL(' ', brett[4][4]);
for (int i = 0; i < 8; i++) {
free(brett[i]);
}
free(brett);
}
#endif // TEST

107
test/test_schach.c

@ -1,107 +0,0 @@
#ifdef TEST
#include "unity.h"
#include "schach.h"
#include "string.h"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_print_Schachfeld(void){
/* arrange */
char expected = 'S';
int x = 8;
int y = 8;
/* act */
char** Spielfeld = create_Schachfeld(x, y);
/* assert */
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[5][0]);
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[4][3]);
}
void test_print_Schachfeld_Turm_weiss(void){
/* arrange */
char expected = 'T';
int x = 8;
int y = 8;
/* act */
char** Spielfeld = create_Schachfeld(x, y);
/* assert */
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[0][0]);
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[0][7]);
}
void test_print_Schachfeld_Bauern_weiss(void){
/* arrange */
char expected = 'B';
int x = 8;
int y = 8;
/* act */
char** Spielfeld = create_Schachfeld(x, y);
/* assert */
for(int l = 0;l<y;l++){
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[1][l]);
}
}
void test_print_Schachfeld_dame_schwarz(void){
/* arrange */
char expected = 'd';
int x = 8;
int y = 8;
/* act */
char** Spielfeld = create_Schachfeld(x, y);
/* assert */
TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[7][3]);
//TEST_ASSERT_EQUAL_CHAR(expected,Spielfeld[0][7]);
}
void test_read_input(void) {
/* arrange */
const char *input = "8\n";
int result = 0;
int expected = 7;
FILE *original_stdin = freopen(NULL, "r", stdin);
FILE *tempInput = fopen("temp_input.txt", "w");
fputs(input, tempInput);
fclose(tempInput);
tempInput = freopen("temp_input.txt", "r", stdin);
/* act */
result = read_input();
/* assert */
TEST_ASSERT_EQUAL_INT(expected, result);
/* Clean up */
fclose(tempInput);
freopen("/dev/tty", "r", stdin);
freopen(NULL, "r", stdin);
}
#endif // TEST
Loading…
Cancel
Save