Compare commits

..

47 Commits

Author SHA1 Message Date
Fabian505
9fb66b6755 Darstellung der Menüs größten Teils umgesetzt; Navigation noch sehr buggy; Einige Features muessen noch umgesetzt werden (siehe README) 2025-01-15 04:04:08 +01:00
6127e4cf37 Refactor Visualizer, Add CommandVisualizer 2025-01-14 17:27:20 +01:00
Fabian505
8636bcfb0c push all changes for work 2025-01-14 06:13:47 +01:00
Fabian505
b4c2f84ea0 Provisorisches Padding wieder eingefügt 2025-01-11 14:31:47 +01:00
Fabian505
c9f83c396f Implement first displays of new elements (StartMenu and Historie) 2025-01-11 13:55:50 +01:00
Fabian505
5a77578699 Change compile command to include new visualizer classes 2025-01-11 13:54:43 +01:00
Fabian505
0fbe762391 Create Base Class for Visualization of different elements (First implementation of StartMenu and Historie) 2025-01-11 13:53:42 +01:00
Fabian505
85d22b4736 Add first version of start menu (not functional) 2025-01-11 05:09:19 +01:00
Fabian505
d1286469c3 Save and display chessboard over a 2d vector 2025-01-10 22:30:45 +01:00
Fabian505
de0cbf5a8b Refactor Draw method for better readablity (introduce helper methods) 2025-01-10 17:01:22 +01:00
Fabian505
e24ebcfc0b Move Start Board from main.cpp to Chessboard.cpp/.hpp and add method to initilize any board from given set 2025-01-10 17:00:08 +01:00
c335ec2b7e Add todo to readme 2025-01-09 15:05:20 +01:00
1a6e52d52a chessboard removes all chess pieces after usage 2025-01-07 23:37:37 +01:00
2c8e62fef0 check, checkmate, stalemate 2025-01-07 20:28:16 +01:00
6042e71c2d chess pieces can now detect if they are protective 2025-01-07 19:53:12 +01:00
Sebastian Brosch
ccc955d0cb improved chess piece position 2025-01-07 16:27:31 +01:00
Sebastian Brosch
8f64897bf6 code style 2025-01-07 00:30:37 +01:00
Sebastian Brosch
69052504cc cleanup and code style 2025-01-06 21:31:00 +01:00
Sebastian Brosch
a791970935 removed old code already replaced 2025-01-06 12:22:13 +01:00
Sebastian Brosch
1c6baca895 improved symbols and detection of chess pieces 2025-01-06 12:18:25 +01:00
Sebastian Brosch
06706ff640 added player and turn order using the player objects 2025-01-05 21:33:09 +01:00
Sebastian Brosch
f4bc9d371b movement and update for next positions 2025-01-05 19:10:52 +01:00
Sebastian Brosch
c1aff353b3 improved next positions of bishop, queen, rook 2025-01-04 18:48:08 +01:00
Sebastian Brosch
074cbef775 added graphical chessboard 2025-01-04 15:48:04 +01:00
Sebastian Brosch
c7cb4b3fcb output of chessboard as text 2025-01-04 14:35:28 +01:00
Sebastian Brosch
3be8e2170b basic movement with new chesspiece classes and new chessboard 2025-01-04 12:43:24 +01:00
Sebastian Brosch
ee712b65e1 added symbol for algebraic notation 2024-12-31 13:51:59 +01:00
Sebastian Brosch
7ac5c940be added chesspieces with basic methods and demo 2024-12-31 13:26:55 +01:00
Sebastian Brosch
ba29fc51d8 player order and movement history (internal) 2024-12-30 23:27:57 +01:00
Sebastian Brosch
b168809158 just draw the current board 2024-12-30 23:09:49 +01:00
Sebastian Brosch
2eb3b3ddc1 basic movement for all chesspieces - simple game possible 2024-12-30 23:05:40 +01:00
Sebastian Brosch
0b5ce02c40 basic save and load of game state 2024-12-29 17:33:57 +01:00
Sebastian Brosch
e9fde172be ignore exe files 2024-12-29 16:01:18 +01:00
Sebastian Brosch
efaa471ce2 removed application 2024-12-29 16:00:22 +01:00
Sebastian Brosch
1003456908 added editorconfig and gitignore 2024-12-29 15:47:47 +01:00
8402e0f1b0 Kleine Änderung 2024-12-20 11:19:33 +01:00
dc31b31f4b Nutzloser Header Scheiß´hinzugefügt. Like WTF!? 2024-12-20 02:06:12 +01:00
046ffe6607 Gedankensammlung zu Spielverhalten hinzugefügt 2024-12-19 14:28:30 +01:00
94a86ede09 Start implementation of Pawn class 2024-12-19 14:23:57 +01:00
1a931462e2 Add notation matcher and change type of position field to pair 2024-12-19 14:21:45 +01:00
b90a60e877 Change board defintion from vector<vector<int>> to vector<vector<char>> for better compatibility with chesspiece.cpp 2024-12-19 14:18:50 +01:00
390ebb597e Create parent class for pieces and change board source from int to char 2024-12-19 00:05:13 +01:00
e26a7e4927 Add first iteration of primitiv working move method 2024-12-18 23:12:48 +01:00
95bc2a3f3c Move draw method to new class file; Add Utils class 2024-12-18 20:26:28 +01:00
41803c5ef3 Wieder recht close an gut, aber immer noch keine schöne Darstellung des Spielbretts 2024-12-13 02:44:59 +01:00
705c505982 Maybe a way to really display the board 2024-12-13 02:31:59 +01:00
ba2c25710e Kill me 2024-12-13 00:10:48 +01:00
58 changed files with 5295 additions and 23 deletions

10
.editorconfig Normal file
View File

@@ -0,0 +1,10 @@
root=true
[*.{cc,cpp,hpp,h}]
charset = utf-8
indent_size = 2
indent_style = space
trim_trailing_whitespace = true
[*.{cc,cpp,hpp,h}]
insert_final_newline = true

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.vscode/
*.exe
*.txt

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

2
.idea/TurboSchach.iml generated Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />

580
.idea/editor.xml generated Normal file
View File

@@ -0,0 +1,580 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BackendCodeEditorSettings">
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexRemoved" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/TurboSchach.iml" filepath="$PROJECT_DIR$/.idea/TurboSchach.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

24
ChessPieces/Bishop.cpp Normal file
View File

@@ -0,0 +1,24 @@
#include "Bishop.hpp"
/**
* Creates a new bishop with a specified color and position.
* @param color The color of the bishop.
* @param position The position of the bishop.
*/
Bishop::Bishop(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_BISHOP;
this->_unicode = {"\u265D", "\u2657"};
}
/**
* Gets all chess piece positions the bishop can move next.
* It is also possible to ignore several chess pieces while the next positions are calculated.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the bishop can move next.
*/
std::set<ChessPiecePosition> Bishop::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
// 3.2. The bishop may move to any square along a diagonal on which it stands.
return this->GetDiagonalPositions(chessboard, ignore);
}

12
ChessPieces/Bishop.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_Bishop_H
#define ChessPiece_Bishop_H
class Bishop : public ChessPiece {
public:
Bishop(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

307
ChessPieces/ChessPiece.cpp Normal file
View File

@@ -0,0 +1,307 @@
#include "../ChessPieces/ChessPiece.hpp"
#include "../Chessboard/Chessboard.hpp"
/**
* Creates a new chess piece with a specific color and position.
* @param color The color of the chess piece.
* @param position The position of the chess piece.
*/
ChessPiece::ChessPiece(ChessPieceColor color, ChessPiecePosition position) {
this->SetColor(color);
this->SetPosition(position);
}
/**
* Gets the char symbol of the chess piece.
* @return The char symbol of the chess piece.
*/
char ChessPiece::GetChar() {
return this->_char;
}
/**
* Gets the color of the chess piece.
* @return The color of the chess piece.
*/
ChessPieceColor ChessPiece::GetColor() {
return this->_color;
}
/**
* Gets a set of all positions along the diagonal.
* @param chessboard A pointer to the chessboard.
* @param ignore A set if chess piece positions to be ignored.
* @return A set of all positions along the diagonal.
*/
std::set<ChessPiecePosition> ChessPiece::GetDiagonalPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
ChessPiecePosition currentPosition = this->GetPosition();
for (std::string direction : {"T1L1", "T1R1", "B1L1", "B1R1"}) {
ChessPiecePosition* nextPosition = &currentPosition;
while (nextPosition = nextPosition->NextFromString(direction)) {
if (chessboard->IsEmptyField(nextPosition) || ignore.count(*nextPosition) == 1) {
// 3.5. When making these moves, the bishop, rook or queen may not move over any intervening pieces.
positions.insert(*nextPosition);
} else {
ChessPiece* chessPiece = chessboard->GetChessPiece(nextPosition);
// 3.1. It is not permitted to move a piece to a square occupied by a piece of the same colour.
// 3.1.1. If a piece moves to a square occupied by an opponent's piece the latter is captured and removed from the chessboard as part of the same move.
if (chessPiece && chessPiece->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
break;
}
}
}
return positions;
}
/**
* Gets a set of all positions along the file.
* @param chessboard A pointer to the chessboard.
* @param ignore A set if chess piece positions to be ignored.
* @return A set of all positions along the file.
*/
std::set<ChessPiecePosition> ChessPiece::GetFilePositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
ChessPiecePosition currentPosition = this->GetPosition();
for (std::string direction : {"T1", "B1"}) {
ChessPiecePosition* nextPosition = &currentPosition;
while (nextPosition = nextPosition->NextFromString(direction)) {
if (chessboard->IsEmptyField(nextPosition) || ignore.count(*nextPosition) == 1) {
// 3.5. When making these moves, the bishop, rook or queen may not move over any intervening pieces.
positions.insert(*nextPosition);
} else {
ChessPiece* chessPiece = chessboard->GetChessPiece(nextPosition);
// 3.1. It is not permitted to move a piece to a square occupied by a piece of the same colour.
// 3.1.1. If a piece moves to a square occupied by an opponent's piece the latter is captured and removed from the chessboard as part of the same move.
if (chessPiece && chessPiece->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
break;
}
}
}
return positions;
}
/**
* Gets a set of all positions the chess piece can move next.
* @return A set of all positions the chess piece can move next.
*/
std::set<ChessPiecePosition> ChessPiece::GetNextPositions() {
return this->_positions_next;
}
/**
* Gets the number of moves of the chess piece.
* @return The number of moves of the chess piece.
*/
int ChessPiece::GetNumberOfMoves() {
int positions = this->_positions.size();
return (positions < 2) ? 0 : positions - 1;
}
/**
* Gets the position of the chess piece.
* @return The position of the chess piece.
* @throws std::out_of_range Thrown if the history of positions was not initialized properly.
*/
ChessPiecePosition ChessPiece::GetPosition() {
if (this->_positions.empty() == false) {
return this->_positions.back();
} else {
throw std::out_of_range("history was not initialized properly.");
}
}
/**
* Gets a set of all positions along the rank.
* @param chessboard A pointer to the chessboard.
* @param ignore A set if chess piece positions to be ignored.
* @return A set of all positions along the rank.
*/
std::set<ChessPiecePosition> ChessPiece::GetRankPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
ChessPiecePosition currentPosition = this->GetPosition();
for (std::string direction : {"L1", "R1"}) {
ChessPiecePosition* nextPosition = &currentPosition;
while (nextPosition = nextPosition->NextFromString(direction)) {
if (chessboard->IsEmptyField(nextPosition) || ignore.count(*nextPosition) == 1) {
// 3.5. When making these moves, the bishop, rook or queen may not move over any intervening pieces.
positions.insert(*nextPosition);
} else {
ChessPiece* chessPiece = chessboard->GetChessPiece(nextPosition);
// 3.1. It is not permitted to move a piece to a square occupied by a piece of the same colour.
// 3.1.1. If a piece moves to a square occupied by an opponent's piece the latter is captured and removed from the chessboard as part of the same move.
if (chessPiece && chessPiece->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
break;
}
}
}
return positions;
}
/**
* Gets the unicode symbol of the chess piece depending on the internal color.
* @return The unicode symbol of the chess piece.
*/
std::string ChessPiece::GetUnicode() {
return this->GetUnicode(this->GetColor());
}
/**
* Gets the unicode symbol of the chess piece depending on the given color.
* @param color The color of the chess piece.
* @return The unicode symbol of the chess piece.
*/
std::string ChessPiece::GetUnicode(ChessPieceColor color) {
if (color == ChessPieceColor::Black) {
return std::get<ChessPieceColor::Black>(this->_unicode);
} else {
return std::get<ChessPieceColor::White>(this->_unicode);
}
}
/**
* Status whether the chess piece is a bishop.
* @return Status whether the chess piece is a bishop.
*/
bool ChessPiece::IsBishop() {
return this->GetChar() == this->_CHAR_BISHOP;
}
/**
* Status whether the chess piece can still be moved the first time.
* @return Status whether the chess piece can still be moved the first time.
*/
bool ChessPiece::IsFirstMove() {
return this->_positions.size() == 1;
}
/**
* Status whether the chess piece is a king.
* @return Status whether the chess piece is a king.
*/
bool ChessPiece::IsKing() {
return this->GetChar() == this->_CHAR_KING;
}
/**
* Status whether the chess piece is a knight.
* @return Status whether the chess piece is a knight.
*/
bool ChessPiece::IsKnight() {
return this->GetChar() == this->_CHAR_KNIGHT;
}
/**
* Status whether the chess piece is a pawn.
* @return Status whether the chess piece is a pawn.
*/
bool ChessPiece::IsPawn() {
return this->GetChar() == this->_CHAR_PAWN;
}
/**
* Status whether the chess piece is a protective chess piece for the king.
* Any movement of a protective chess piece would lead to a checkmate.
* @param chessboard A pointer to the chessboard.
* @return Status whether the chess piece is a protective chess piece for the king.
*/
bool ChessPiece::IsProtective(Chessboard* chessboard) {
if (this->IsKing()) {
return false;
}
ChessPiece* chessPieceKing = chessboard->GetChessPieceKing(this->GetColor());
// A chess piece is a protective chess piece if the chess piece exposes the king to an enemy chess piece after any movement.
// So we get all chess piece positions of the opponents chess pieces with and without the current chess piece.
// If any opponents chess piece can reach the king after movement the current chess piece is a protective chess piece.
for (ChessPiece* chessPiece : chessboard->GetChessPieces()) {
if (chessPiece->GetColor() != this->GetColor()) {
std::set<ChessPiecePosition> positionsStay = chessPiece->GetNextPositions(chessboard, {});
std::set<ChessPiecePosition> positionsMove = chessPiece->GetNextPositions(chessboard, {this->GetPosition()});
if (positionsStay.count(chessPieceKing->GetPosition()) == 0 && positionsMove.count(chessPieceKing->GetPosition()) == 1) {
return true;
}
}
}
return false;
}
/**
* Status whether the chess piece is a queen.
* @return Status whether the chess piece is a queen.
*/
bool ChessPiece::IsQueen() {
return this->GetChar() == this->_CHAR_QUEEN;
}
/**
* Status whether the chess piece is a rook.
* @return Status whether the chess piece is a rook.
*/
bool ChessPiece::IsRook() {
return this->GetChar() == this->_CHAR_ROOK;
}
/**
* Sets the color of the chess piece.
* @param color The color of the chess piece.
*/
void ChessPiece::SetColor(ChessPieceColor color) {
this->_color = color;
}
/**
* Sets a set of all positions the chess piece can move next.
* @param positions A set of all positions the chess piece can move next.
*/
void ChessPiece::SetNextPositions(std::set<ChessPiecePosition> positions) {
this->_positions_next = positions;
}
/**
* Sets the current position of the chess piece.
* @param position The current position to be set in the chess piece.
*/
void ChessPiece::SetPosition(ChessPiecePosition position) {
this->_positions.push_back(position);
}
/**
* Updates the internal positions to which the chess piece can move next.
* @param chessboard A pointer to the chessboard.
*/
void ChessPiece::UpdateNextPositions(Chessboard* chessboard) {
if (this->IsProtective(chessboard)) {
this->SetNextPositions({});
} else {
this->SetNextPositions(this->GetNextPositions(chessboard));
}
}

View File

@@ -0,0 +1,56 @@
#ifndef ChessPiece_H
#define ChessPiece_H
#include <stdexcept>
#include <string>
#include <vector>
#include <set>
#include "../ChessPieces/ChessPieceColor.hpp"
#include "../ChessPieces/ChessPiecePosition.hpp"
#include "../Chessboard/Chessboard.hpp"
class ChessPiece {
private:
ChessPieceColor _color;
std::vector<ChessPiecePosition> _positions;
std::set<ChessPiecePosition> _positions_next;
protected:
char _char = '\0';
std::pair<std::string, std::string> _unicode;
const char _CHAR_BISHOP = 'B';
const char _CHAR_KING = 'K';
const char _CHAR_KNIGHT = 'N';
const char _CHAR_PAWN = 'P';
const char _CHAR_QUEEN = 'Q';
const char _CHAR_ROOK = 'R';
ChessPiece(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetDiagonalPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
std::set<ChessPiecePosition> GetFilePositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
std::set<ChessPiecePosition> GetRankPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
void SetColor(ChessPieceColor color);
void SetNextPositions(std::set<ChessPiecePosition> positions);
public:
ChessPiece() = default;
char GetChar();
ChessPieceColor GetColor();
std::set<ChessPiecePosition> GetNextPositions();
virtual std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {}) = 0;
int GetNumberOfMoves();
ChessPiecePosition GetPosition();
std::string GetUnicode();
std::string GetUnicode(ChessPieceColor color);
bool IsBishop();
bool IsFirstMove();
bool IsKing();
bool IsKnight();
bool IsPawn();
bool IsProtective(Chessboard* chessboard);
bool IsQueen();
bool IsRook();
void SetPosition(ChessPiecePosition position);
void UpdateNextPositions(Chessboard* chessboard);
};
#endif

View File

@@ -0,0 +1,9 @@
#ifndef ChessPieceColor_H
#define ChessPieceColor_H
enum ChessPieceColor {
Black = 0,
White = 1
};
#endif

View File

@@ -0,0 +1,329 @@
#include "../ChessPieces/ChessPiecePosition.hpp"
/**
* Creates a new chess piece position.
* @param position The chess piece position as string.
*/
ChessPiecePosition::ChessPiecePosition(std::string position) {
if (position.length() != 2) {
throw std::invalid_argument("invalid position");
} else {
this->SetFile(position[0]);
this->SetRank(position[1] - '0');
}
}
/**
* Creates a new chess piece position.
* @param file The file part of the chess piece position.
* @param rank The rank part of the chess piece position.
*/
ChessPiecePosition::ChessPiecePosition(char file, int rank) {
this->SetFile(file);
this->SetRank(rank);
}
/**
* Compares the current chess piece position with another chess piece position.
* @param position The other chess piece position to be checked with the current chess piece position.
*/
bool ChessPiecePosition::operator< (ChessPiecePosition const position) const {
if (this->_file == position._file) {
return this->_rank < position._rank;
} else {
return this->_file < position._file;
}
}
/**
* Compares the current chess piece position with another chess piece position.
* @param position The other chess piece position to be checked with the current chess piece position.
*/
bool ChessPiecePosition::operator== (ChessPiecePosition const position) const {
return this->_file == position._file && this->_rank == position._rank;
}
/**
* Gets the moves to reach the target chess piece position from the starting chess piece position.
* @param fromPosition The starting chess piece position.
* @param toPosition The target chess piece position.
* @return A string with the moves to reach the target chess piece position from the starting chess piece position.
* An empty string if the starting chess piece position is the same as the target chess piece position.
*/
std::string ChessPiecePosition::GetDifference(ChessPiecePosition fromPosition, ChessPiecePosition toPosition) {
if (fromPosition == toPosition) {
return "";
} else {
std::string difference;
if (toPosition.GetFile() < fromPosition.GetFile()) {
difference.append(std::string(1, ChessPiecePosition::_MOVE_LEFT) + std::to_string(fromPosition.GetFile() - toPosition.GetFile()));
} else if (toPosition.GetFile() > fromPosition.GetFile()) {
difference.append(std::string(1, ChessPiecePosition::_MOVE_RIGHT) + std::to_string(toPosition.GetFile() - fromPosition.GetFile()));
}
if (toPosition.GetRank() < fromPosition.GetRank()) {
difference.append(std::string(1, ChessPiecePosition::_MOVE_BOTTOM) + std::to_string(fromPosition.GetRank() - toPosition.GetRank()));
} else if (toPosition.GetRank() > fromPosition.GetRank()) {
difference.append(std::string(1, ChessPiecePosition::_MOVE_TOP) + std::to_string(toPosition.GetRank() - fromPosition.GetRank()));
}
return difference;
}
}
/**
* Gets the file part of the chess piece position.
* @return char The file part of the chess piece position.
*/
char ChessPiecePosition::GetFile() {
return this->_file;
}
/**
* Gets the rank part of the chess piece position.
* @return int The rank part of the chess piece position.
*/
int ChessPiecePosition::GetRank() {
return this->_rank;
}
/**
* Gets the step to reach the target chess piece position from the starting chess piece position.
* The amount of steps to reach the target chess piece position is not known but the target chess piece position is reachable.
* @param fromPosition The starting chess piece position.
* @param toPosition The target chess piece position.
* @return A string with the step to reach the target chess piece position from the starting chess piece position.
* An empty string if the starting chess piece position is the same as the target chess piece position
* or the target chess piece position is not reachable directly (vertical, horizontal, diagonal).
*/
std::string ChessPiecePosition::GetStep(ChessPiecePosition fromPosition, ChessPiecePosition toPosition) {
if (fromPosition == toPosition) {
return "";
} else {
if (fromPosition.GetRank() == toPosition.GetRank()) {
if (fromPosition.GetFile() > toPosition.GetFile()) {
return std::string(1, ChessPiecePosition::_MOVE_LEFT) + std::string(1, '1');
} else if (fromPosition.GetFile() < toPosition.GetFile()) {
return std::string(1, ChessPiecePosition::_MOVE_RIGHT) + std::string(1, '1');
} else {
return "";
}
} else if (fromPosition.GetFile() == toPosition.GetFile()) {
if (fromPosition.GetRank() > toPosition.GetRank()) {
return std::string(1, ChessPiecePosition::_MOVE_BOTTOM) + std::string(1, '1');
} else if (fromPosition.GetRank() < toPosition.GetRank()) {
return std::string(1, ChessPiecePosition::_MOVE_TOP) + std::string(1, '1');
} else {
return "";
}
} else {
int rankDifference = fromPosition.GetRank() - toPosition.GetRank();
int fileDifference = fromPosition.GetFile() - toPosition.GetFile();
if (std::abs(rankDifference) != std::abs(fileDifference)) {
return "";
} else {
if (rankDifference < 0) {
if (fileDifference < 0) {
return std::string(1, ChessPiecePosition::_MOVE_TOP) + std::string(1, '1') + std::string(1, ChessPiecePosition::_MOVE_RIGHT) + std::string(1, '1');
} else {
return std::string(1, ChessPiecePosition::_MOVE_TOP) + std::string(1, '1') + std::string(1, ChessPiecePosition::_MOVE_LEFT) + std::string(1, '1');
}
} else {
if (fileDifference < 0) {
return std::string(1, ChessPiecePosition::_MOVE_BOTTOM) + std::string(1, '1') + std::string(1, ChessPiecePosition::_MOVE_RIGHT) + std::string(1, '1');
} else {
return std::string(1, ChessPiecePosition::_MOVE_BOTTOM) + std::string(1, '1') + std::string(1, ChessPiecePosition::_MOVE_LEFT) + std::string(1, '1');
}
}
}
}
}
}
/**
* Gets the next chess piece position below the current chess piece position.
* @return A pointer to the chess piece position below the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextBottom() {
try {
return new ChessPiecePosition(this->GetFile(), this->GetRank() - 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position below to the left of the current chess piece position.
* @return A pointer to the chess piece position below to the left of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextBottomLeft() {
try {
return new ChessPiecePosition(this->GetFile() - 1, this->GetRank() - 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position below to the right of the current chess piece position.
* @return A pointer to the chess piece position below to the right of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextBottomRight() {
try {
return new ChessPiecePosition(this->GetFile() + 1, this->GetRank() - 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position based on the current chess piece position and specified steps.
* @param steps The steps to be added to the current chess piece position.
* @return A pointer to the chess piece position based on the current chess piece position and specified steps.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextFromString(std::string steps) {
if (steps.length() % 2 != 0) return nullptr;
char nextFile = this->GetFile();
int nextRank = this->GetRank();
for (int step = 0; step < steps.length() / 2; step++) {
char direction = steps[0 + (step * 2)];
int moves = steps[1 + (step * 2)] - '0';
if (!(moves >= 1 && moves <= 8)) {
return nullptr;
}
switch (direction) {
case ChessPiecePosition::_MOVE_BOTTOM:
nextRank -= moves;
break;
case ChessPiecePosition::_MOVE_LEFT:
nextFile -= moves;
break;
case ChessPiecePosition::_MOVE_RIGHT:
nextFile += moves;
break;
case ChessPiecePosition::_MOVE_TOP:
nextRank += moves;
break;
default:
return nullptr;
}
}
try {
return new ChessPiecePosition(nextFile, nextRank);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position left of the current chess piece position.
* @return A pointer to the chess piece position left of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextLeft() {
try {
return new ChessPiecePosition(this->GetFile() - 1, this->GetRank());
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position right of the current chess piece position.
* @return A pointer to the chess piece position right of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextRight() {
try {
return new ChessPiecePosition(this->GetFile() + 1, this->GetRank());
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position above the current chess piece position.
* @return A pointer to the chess piece position above the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextTop() {
try {
return new ChessPiecePosition(this->GetFile(), this->GetRank() + 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position above to the left of the current chess piece position.
* @return A pointer to the chess piece position above to the left of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextTopLeft() {
try {
return new ChessPiecePosition(this->GetFile() - 1, this->GetRank() + 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Gets the next chess piece position above to the right of the current chess piece position.
* @return A pointer to the chess piece position above to the right of the current chess piece position.
* Returns a null pointer if the chess piece position is not available.
*/
ChessPiecePosition* ChessPiecePosition::NextTopRight() {
try {
return new ChessPiecePosition(this->GetFile() + 1, this->GetRank() + 1);
} catch (const std::out_of_range e) {
return nullptr;
}
}
/**
* Sets the file part of the chess piece position.
* @param file The file part of the chess piece position.
*/
void ChessPiecePosition::SetFile(char file) {
if (file >= 'a' && file <= 'h') {
file = char(std::toupper(file));
}
if (file >= 'A' && file <= 'H') {
this->_file = file;
} else {
throw std::out_of_range("file is out of range");
}
}
/**
* Sets the rank part of the chess piece position.
* @param rank The rank part of the chess piece position.
*/
void ChessPiecePosition::SetRank(int rank) {
if (rank >= 1 && rank <= 8) {
this->_rank = rank;
} else {
throw std::out_of_range("rank is out of range");
}
}
/**
* Gets the current chess piece position as string.
* @return The current chess piece position as string.
*/
std::string ChessPiecePosition::ToString() {
return std::string(1, this->GetFile()) + std::to_string(this->GetRank());
}

View File

@@ -0,0 +1,39 @@
#ifndef ChessPiece_ChessPiecePosition_H
#define ChessPiece_ChessPiecePosition_H
#include <stdexcept>
#include <string>
class ChessPiecePosition {
private:
char _file;
int _rank;
static const char _MOVE_LEFT = 'L';
static const char _MOVE_RIGHT = 'R';
static const char _MOVE_TOP = 'T';
static const char _MOVE_BOTTOM = 'B';
void SetFile(char file);
void SetRank(int rank);
public:
ChessPiecePosition(std::string position);
ChessPiecePosition(char file, int rank);
bool operator< (ChessPiecePosition const position) const;
bool operator== (ChessPiecePosition const position) const;
static std::string GetDifference(ChessPiecePosition fromPosition, ChessPiecePosition toPosition);
char GetFile();
int GetRank();
static std::string GetStep(ChessPiecePosition fromPosition, ChessPiecePosition toPosition);
ChessPiecePosition* NextBottom();
ChessPiecePosition* NextBottomLeft();
ChessPiecePosition* NextBottomRight();
ChessPiecePosition* NextFromString(std::string steps);
ChessPiecePosition* NextLeft();
ChessPiecePosition* NextRight();
ChessPiecePosition* NextTop();
ChessPiecePosition* NextTopLeft();
ChessPiecePosition* NextTopRight();
std::string ToString();
};
#endif

43
ChessPieces/King.cpp Normal file
View File

@@ -0,0 +1,43 @@
#include "King.hpp"
/**
* Creates a new king with a specified color and position.
* @param color The color of the king.
* @param position The position of the king.
*/
King::King(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_KING;
this->_unicode = {"\u265A", "\u2654"};
}
/**
* Gets all chess piece positions the king can move next.
* The set of chess piece positions will be ignored, because the king has a fixed movement.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the rook can move next.
*/
std::set<ChessPiecePosition> King::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
// There are two different ways of moving the king:
// 3.8.1. by moving to an adjoining square.
// 3.8.2. by 'castling'. This is a move of the king and either rook of the same colour along the player's first rank,
// counting as a single move of the king and executed as follows: the king is transferred from its original square
// two squares towards the rook on its original square, then that rook is transferred to the square the king
// has just crossed. -> is implemented directly on the move function.
for (std::string move : {"T1", "T1L1", "T1R1", "B1", "B1L1", "B1R1", "L1", "R1"}) {
ChessPiecePosition* nextPosition = this->GetPosition().NextFromString(move);
if (nextPosition == nullptr) continue;
if (chessboard->IsEmptyField(nextPosition) || chessboard->GetChessPiece(nextPosition)->GetColor() != this->GetColor()) {
ChessPieceColor opponentColor = (this->GetColor() == ChessPieceColor::Black) ? ChessPieceColor::White : ChessPieceColor::Black;
if (chessboard->IsPositionUnderAttack(*nextPosition, opponentColor) == false) {
positions.insert(*nextPosition);
}
}
}
return positions;
}

12
ChessPieces/King.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_King_H
#define ChessPiece_King_H
class King : public ChessPiece {
public:
King(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

36
ChessPieces/Knight.cpp Normal file
View File

@@ -0,0 +1,36 @@
#include "Knight.hpp"
/**
* Creates a new knight with a specified color and position.
* @param color The color of the knight.
* @param position The position of the knight.
*/
Knight::Knight(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_KNIGHT;
this->_unicode = {"\u265E", "\u2658"};
}
/**
* Gets all chess piece positions the knight can move next.
* The set of chess piece positions will be ignored, because the knight has a fixed movement.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the knight can move next.
*/
std::set<ChessPiecePosition> Knight::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
// 3.6. The knight may move to one of the squares nearest to that on which it stands but not on the same rank, file or diagonal.
for (std::string move : {"T2L1", "T2R1", "L2T1", "L2B1", "B2L1", "B2R1", "R2T1", "R2B1"}) {
ChessPiecePosition* nextPosition = this->GetPosition().NextFromString(move);
if (nextPosition == nullptr) continue;
// 3.1. It is not permitted to move a piece to a square occupied by a piece of the same colour.
// 3.1.1. If a piece moves to a square occupied by an opponent's piece the latter is captured and removed from the chessboard as part of the same move.
if (chessboard->IsEmptyField(nextPosition) || chessboard->GetChessPiece(nextPosition)->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
}
return positions;
}

12
ChessPieces/Knight.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_Knight_H
#define ChessPiece_Knight_H
class Knight : public ChessPiece {
public:
Knight(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

174
ChessPieces/Pawn.cpp Normal file
View File

@@ -0,0 +1,174 @@
#include "Pawn.hpp"
/**
* Creates a new pawn with a specified color and position.
* @param color The color of the pawn.
* @param position The position of the pawn.
*/
Pawn::Pawn(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_PAWN;
this->_unicode = {"\u265F", "\u2659"};
}
/**
* Gets all chess piece positions the pawn can move next.
* The set of chess piece positions will be ignored, because the pawn has a fixed movement.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the pawn can move next.
*/
std::set<ChessPiecePosition> Pawn::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
std::set<ChessPiecePosition> positions;
ChessPiecePosition currentPosition = this->GetPosition();
ChessPiecePosition* nextPosition = &currentPosition;
if (this->GetColor() == ChessPieceColor::Black) {
// 3.7.1. The pawn may move forward to the square immediately in front of it on the same file, provided that this square is unoccupied.
// 3.7.2. On its first move the pawn may move as in 3.7.1 or alternatively it may advance two squares along the same file, provided that both squares are unoccupied.
for (int move = 1; move <= 2; move++) {
nextPosition = nextPosition->NextBottom();
if (nextPosition) {
if (chessboard->IsEmptyField(nextPosition) == false) {
break;
}
if (move == 1) {
positions.insert(*nextPosition);
} else if (move == 2 && this->IsFirstMove()) {
positions.insert(*nextPosition);
}
} else {
break;
}
}
// 3.7.3. the pawn may move to a square occupied by an opponent's piece diagonally in front of it on an adjacent file, capturing that piece.
for (std::string move : {"B1L1", "B1R1"}) {
nextPosition = &currentPosition;
nextPosition = nextPosition->NextFromString(move);
if (nextPosition && chessboard->IsEmptyField(nextPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(nextPosition);
if (chessPiece->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
}
}
// 3.7.3.1. A pawn occupying a square on the same rank as and on an adjacent file to an opponent's pawn which has just advanced two squares
// in one move from its original square may capture this opponent's pawn as though the latter had been moved only one square.
// 3.7.3.2. This capture is only legal on the move following this advance and is called an "en passant" capture.
if (chessboard->GetCountMoves() > 0) {
std::pair<ChessPiecePosition, ChessPiecePosition> lastMove = chessboard->GetLastMove();
std::string moveDifference = ChessPiecePosition::GetDifference(lastMove.first, lastMove.second);
ChessPiecePosition* leftPosition = currentPosition.NextLeft();
ChessPiecePosition* rightPosition = currentPosition.NextRight();
if (leftPosition && chessboard->IsEmptyField(leftPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(leftPosition);
if (chessPiece->GetColor() != this->GetColor() && chessPiece->IsPawn()) {
if (chessPiece->GetNumberOfMoves() == 1 && moveDifference == "T2" && chessPiece->GetPosition() == lastMove.second) {
ChessPiecePosition* bottomLeftPosition = currentPosition.NextFromString("B1L1");
if (bottomLeftPosition && chessboard->IsEmptyField(bottomLeftPosition)) {
positions.insert(*bottomLeftPosition);
}
}
}
}
if (rightPosition && chessboard->IsEmptyField(rightPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(rightPosition);
if (chessPiece->GetColor() != this->GetColor() && chessPiece->IsPawn()) {
if (chessPiece->GetNumberOfMoves() == 1 && moveDifference == "T2" && chessPiece->GetPosition() == lastMove.second) {
ChessPiecePosition* bottomRightPosition = currentPosition.NextFromString("B1R1");
if (bottomRightPosition && chessboard->IsEmptyField(bottomRightPosition)) {
positions.insert(*bottomRightPosition);
}
}
}
}
}
} else if (this->GetColor() == ChessPieceColor::White) {
// 3.7.1. The pawn may move forward to the square immediately in front of it on the same file, provided that this square is unoccupied.
// 3.7.2. On its first move the pawn may move as in 3.7.1 or alternatively it may advance two squares along the same file, provided that both squares are unoccupied.
for (int move = 1; move <= 2; move++) {
nextPosition = nextPosition->NextTop();
if (nextPosition) {
if (chessboard->IsEmptyField(nextPosition) == false) {
break;
}
if (move == 1) {
positions.insert(*nextPosition);
} else if (move == 2 && this->IsFirstMove()) {
positions.insert(*nextPosition);
}
} else {
break;
}
}
// 3.7.3. the pawn may move to a square occupied by an opponent's piece diagonally in front of it on an adjacent file, capturing that piece.
for (std::string move : {"T1L1", "T1R1"}) {
nextPosition = &currentPosition;
nextPosition = nextPosition->NextFromString(move);
if (nextPosition && chessboard->IsEmptyField(nextPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(nextPosition);
if (chessPiece->GetColor() != this->GetColor()) {
positions.insert(*nextPosition);
}
}
}
// 3.7.3.1. A pawn occupying a square on the same rank as and on an adjacent file to an opponent's pawn which has just advanced two squares
// in one move from its original square may capture this opponent's pawn as though the latter had been moved only one square.
// 3.7.3.2. This capture is only legal on the move following this advance and is called an "en passant" capture.
if (chessboard->GetCountMoves() > 0) {
std::pair<ChessPiecePosition, ChessPiecePosition> lastMove = chessboard->GetLastMove();
std::string moveDifference = ChessPiecePosition::GetDifference(lastMove.first, lastMove.second);
ChessPiecePosition* leftPosition = currentPosition.NextLeft();
ChessPiecePosition* rightPosition = currentPosition.NextRight();
if (leftPosition && chessboard->IsEmptyField(leftPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(leftPosition);
if (chessPiece->GetColor() != this->GetColor() && chessPiece->IsPawn()) {
if (chessPiece->GetNumberOfMoves() == 1 && moveDifference == "B2" && chessPiece->GetPosition() == lastMove.second) {
ChessPiecePosition* topLeftPosition = currentPosition.NextFromString("T1L1");
if (topLeftPosition && chessboard->IsEmptyField(topLeftPosition)) {
positions.insert(*topLeftPosition);
}
}
}
}
if (rightPosition && chessboard->IsEmptyField(rightPosition) == false) {
ChessPiece* chessPiece = chessboard->GetChessPiece(rightPosition);
if (chessPiece->GetColor() != this->GetColor() && chessPiece->IsPawn()) {
if (chessPiece->GetNumberOfMoves() == 1 && moveDifference == "B2" && chessPiece->GetPosition() == lastMove.second) {
ChessPiecePosition* topRightPosition = currentPosition.NextFromString("T1R1");
if (topRightPosition && chessboard->IsEmptyField(topRightPosition)) {
positions.insert(*topRightPosition);
}
}
}
}
}
}
return positions;
}

12
ChessPieces/Pawn.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_Pawn_H
#define ChessPiece_Pawn_H
class Pawn : public ChessPiece {
public:
Pawn(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

28
ChessPieces/Queen.cpp Normal file
View File

@@ -0,0 +1,28 @@
#include "Queen.hpp"
/**
* Creates a new queen with a specified color and position.
* @param color The color of the queen.
* @param position The position of the queen.
*/
Queen::Queen(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_QUEEN;
this->_unicode = {"\u265B", "\u2655"};
}
/**
* Gets all chess piece positions the queen can move next.
* It is also possible to ignore several chess pieces while the next positions are calculated.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the queen can move next.
*/
std::set<ChessPiecePosition> Queen::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
// 3.4. The queen may move to any square along the file, the rank or a diagonal on which it stands.
std::set<ChessPiecePosition> positions;
positions.merge(this->GetFilePositions(chessboard, ignore));
positions.merge(this->GetRankPositions(chessboard, ignore));
positions.merge(this->GetDiagonalPositions(chessboard, ignore));
return positions;
}

12
ChessPieces/Queen.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_Queen_H
#define ChessPiece_Queen_H
class Queen : public ChessPiece {
public:
Queen(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

27
ChessPieces/Rook.cpp Normal file
View File

@@ -0,0 +1,27 @@
#include "Rook.hpp"
/**
* Creates a new rook with a specified color and position.
* @param color The color of the rook.
* @param position The position of the rook.
*/
Rook::Rook(ChessPieceColor color, ChessPiecePosition position) : ChessPiece(color, position) {
this->_char = this->_CHAR_ROOK;
this->_unicode = {"\u265C", "\u2656"};
}
/**
* Gets all chess piece positions the rook can move next.
* It is also possible to ignore several chess pieces while the next positions are calculated.
* @param chessboard A pointer to the chessboard.
* @param ignore A set of chess piece positions to be ignored.
* @return A set of chess piece positions the rook can move next.
*/
std::set<ChessPiecePosition> Rook::GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore) {
// 3.3 The rook may move to any square along the file or the rank on which it stands.
std::set<ChessPiecePosition> positions;
positions.merge(this->GetFilePositions(chessboard, ignore));
positions.merge(this->GetRankPositions(chessboard, ignore));
return positions;
}

12
ChessPieces/Rook.hpp Normal file
View File

@@ -0,0 +1,12 @@
#include "ChessPiece.hpp"
#ifndef ChessPiece_Rook_H
#define ChessPiece_Rook_H
class Rook : public ChessPiece {
public:
Rook(ChessPieceColor color, ChessPiecePosition position);
std::set<ChessPiecePosition> GetNextPositions(Chessboard* chessboard, std::set<ChessPiecePosition> ignore = {});
};
#endif

25
ChessUtils.cpp Normal file
View File

@@ -0,0 +1,25 @@
//
// Created by hamac on 18.12.2024.
//
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include "ChessUtils.h"
std::vector<std::string> ChessUtils::split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
//a4
std::pair<int, int> ChessUtils::convertPosition(const std::string &pos) {
int y = pos[pos.size()-2] - 'a';
int x = ChessUtils::fileConvertion.find((pos[pos.size()-1] - '0')-1)->second;
return std::make_pair(x, y);
}

34
ChessUtils.h Normal file
View File

@@ -0,0 +1,34 @@
//
// Created by hamac on 20.12.2024.
//
#ifndef CHESSUTILS_H
#define CHESSUTILS_H
//
// Created by hamac on 18.12.2024.
//
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
class ChessUtils {
public:
inline static const std::unordered_map<int, int> fileConvertion = {
{0, 7},
{1, 6},
{2, 5},
{3, 4},
{4, 3},
{5, 2},
{6, 1},
{7, 0}
};
static std::vector<std::string> split(const std::string &s, char delim);
static std::pair<int, int> convertPosition(const std::string &pos);
};
#endif //CHESSUTILS_H

1012
Chessboard.cpp Normal file

File diff suppressed because it is too large Load Diff

133
Chessboard.h Normal file
View File

@@ -0,0 +1,133 @@
//
// Created by hamac on 20.12.2024.
//
#ifndef CHESSBOARD_H
#define CHESSBOARD_H
#include "Chesspiece.h"
#include <queue>
#include <string>
#include <vector>
#include <unordered_map>
class Chessboard {
private:
/* Constants */
// Chars to display board
// Corners
const std::string topLeft = "";
const std::string topRight = "";
const std::string bottomLeft = "";
const std::string bottomRight = "";
// Line chars
const std::string horizontal = "";
const std::string vertical = "";
const std::string topIntersection = "";
const std::string bottomIntersection = "";
const std::string middleIntersection = "";
// White pieces
const std::string whiteSquare = "";
const std::string whiteKing = "";
const std::string whiteQueen = "";
const std::string whiteRook = "";
const std::string whiteBischop = "";
const std::string whiteKnight = "";
const std::string whitePawn = "";
// Black pieces
const std::string blackSquare = "";
const std::string blackKing = "";
const std::string blackQueen = "";
const std::string blackRook = "";
const std::string blackBischop = "";
const std::string blackKnight = "";
const std::string blackPawn = "";
/* class fields */
std::vector<std::vector<char>> currentBoard;
std::unordered_map<char, std::vector<std::unique_ptr<Chesspiece>>> playingPieces;
// Starting formatting
std::vector<std::vector<char>> startBoard = {
{'r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'},
{'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'},
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'},
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'},
{'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'},
{'R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R'},
};
// ToDo: Mathematisch sicherlich weg rationalisierbar
std::vector<std::vector<char>> emptyBoard = {
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'},
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'},
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'},
{'w', 'x', 'w', 'x' ,'w', 'x', 'w', 'x'},
{'x', 'w', 'x', 'w', 'x', 'w', 'x', 'w'}
};
// Saves turn order; true = white and false = black
bool turnOrder = true;
// ToDo: Max Size definieren?
std::queue<std::string> queue;
/* methods */
// Method returns unicode for chess icon depending on the identifier
std::string getChessIcon(char identifier);
void generateTopLine();
void generatePlayingField(const std::vector<std::vector<char>>& chessboard);
void generateBottomLine();
public:
/* fields */
std::string display;
int boardSize = 8;
/* methods */
bool getTurnOrder();
void setTurnOrder(bool turnOrder);
std::vector<std::vector<char>> getBoard();
void setBoard(std::vector<std::vector<char>> board);
std::vector<std::vector<char>> getStartBoard();
std::vector<std::vector<char>> getEmptyBoard();
void draw ();
void draw (const std::vector<std::vector<char>>& chessboard);
void init();
void initPieces();
void move();
char getCorrectPiece(char pieceIdentifier);
//
void move(std::string move);
// This method saves the current board state
void saveBoard();
// This method loads a save state
void loadBoard(std::string filepath);
};
#endif //CHESSBOARD_H

341
Chessboard/Chessboard.cpp Normal file
View File

@@ -0,0 +1,341 @@
#include <memory>
#include <set>
#include "../Chessboard/Chessboard.hpp"
#include "../ChessPieces/ChessPiece.hpp"
#include "../ChessPieces/Knight.hpp"
#include "../ChessPieces/Bishop.hpp"
#include "../ChessPieces/King.hpp"
#include "../ChessPieces/Pawn.hpp"
#include "../ChessPieces/Queen.hpp"
#include "../ChessPieces/Rook.hpp"
void Chessboard::InitializeStartBoard() {
Chessboard::InitializeBoard(defaultBoard);
}
void Chessboard::InitializeBoard(std::set<Board_ChessPiece> board) {
for (const auto& piece : board) {
ChessPiecePosition pos = ChessPiecePosition(piece.position.first, piece.position.second);
ChessPieceColor color = (piece.color == 0) ? ChessPieceColor::Black : ChessPieceColor::White;
switch (piece.type) {
case 'R':
SetChessPiece(new Rook(color, pos));
break;
case 'N':
SetChessPiece(new Knight(color, pos));
break;
case 'B':
SetChessPiece(new Bishop(color, pos));
break;
case 'Q':
SetChessPiece(new Queen(color, pos));
break;
case 'K':
SetChessPiece(new King(color, pos));
break;
case 'P':
SetChessPiece(new Pawn(color, pos));
break;
default:
std::cout << "Invalid ChessPieceType!" << std::endl;
return;
}
}
}
void Chessboard::SetChessPiece(ChessPiece* chesspiece) {
this->chessboard[chesspiece->GetPosition()] = chesspiece;
}
/*void Chessboard::SetChessPiece(std::unique_ptr<ChessPiece> piece) {
this->chessboard[piece->GetPosition()] = piece.release();
}*/
bool Chessboard::IsEmptyField(ChessPiecePosition* position) {
return (this->chessboard.count(*position) == 0);
}
ChessPiece* Chessboard::GetChessPiece(ChessPiecePosition* position) {
return this->chessboard.at(*position);
}
void Chessboard::MoveChessPiece(std::string move) {
if (move.length() == 5) {
ChessPiecePosition* fromPosition = new ChessPiecePosition(move.substr(0, 2));
ChessPiecePosition* toPosition = new ChessPiecePosition(move.substr(3, 2));
ChessPiece* piece = this->GetChessPiece(fromPosition);
if (piece->GetColor() != this->GetCurrentPlayer()->GetColor()) {
return; // wrong player
}
if (piece->GetNextPositions().count(*toPosition) == 1) {
this->chessboard[*toPosition] = this->chessboard[*fromPosition];
this->chessboard.erase(*fromPosition);
piece->SetPosition(*toPosition);
this->SetToHistory(*fromPosition, *toPosition);
} else {
return; // wrong or invalid move
}
}
this->UpdateChessPieces();
this->SwitchCurrentPlayer();
}
void Chessboard::SetToHistory(ChessPiecePosition fromPosition, ChessPiecePosition toPosition) {
this->history.push_back({fromPosition, toPosition});
}
int Chessboard::GetCountMoves() {
return this->history.size();
}
std::pair<ChessPiecePosition, ChessPiecePosition> Chessboard::GetLastMove() {
return this->history.back();
}
std::vector<ChessPiece*> Chessboard::GetChessPieces() {
std::vector<ChessPiece*> chessPieces;
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
chessPieces.push_back(field.second);
}
return chessPieces;
}
bool Chessboard::IsCheck() {
ChessPiece* chessPieceKing = this->GetChessPieceKing(this->GetCurrentPlayer()->GetColor());
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->GetColor() == this->GetOpponentPlayer()->GetColor()) {
if (field.second->GetNextPositions().count(chessPieceKing->GetPosition()) == 1) {
return true;
}
}
}
return false;
}
bool Chessboard::IsCheckmate() {
if (this->IsCheck() == false) {
return false;
}
ChessPiece* chessPieceKing = this->GetChessPieceKing(this->GetCurrentPlayer()->GetColor());
if (chessPieceKing->GetNextPositions().size() > 0) {
return false;
}
int cntAttacker = 0;
for (ChessPiece* chessPieceOpponent : this->GetChessPieces()) {
if (chessPieceOpponent->GetColor() == this->GetOpponentPlayer()->GetColor()) {
if (chessPieceOpponent->GetNextPositions().count(chessPieceKing->GetPosition()) == 1) { // Is an attacker
cntAttacker++;
bool deniable = false;
// remove attacker
for (ChessPiece* chessPieceCurrent : this->GetChessPieces()) {
if (chessPieceCurrent->GetColor() == this->GetCurrentPlayer()->GetColor()) {
if (chessPieceCurrent->GetNextPositions().count(chessPieceOpponent->GetPosition()) == 1) {
deniable = true; // blocked attack because current player can remove attacker
break;
}
}
}
if (deniable == false) {
return true;
}
// move between attacker and king
// this is not possible for pawn, knight and king because they beat on next field.
std::string step = ChessPiecePosition::GetStep(chessPieceOpponent->GetPosition(), chessPieceKing->GetPosition());
ChessPiecePosition currentPosition = chessPieceOpponent->GetPosition();
ChessPiecePosition* nextPosition = &currentPosition;
deniable = false;
while (nextPosition = nextPosition->NextFromString(step)) {
for (ChessPiece* chessPieceCurrent : this->GetChessPieces()) {
if (chessPieceCurrent->GetColor() == this->GetCurrentPlayer()->GetColor()) {
if (chessPieceCurrent->GetNextPositions().count(*nextPosition) == 1) {
deniable = true; // blocked attack because current player can block between attacker and king
break;
}
}
}
}
if (deniable == false) {
return true;
}
}
}
}
if (cntAttacker > 1) {
return true;
}
return false;
}
bool Chessboard::IsStalemate() {
ChessPieceColor currentColor = this->GetCurrentPlayer()->GetColor();
ChessPieceColor opponentColor = this->GetOpponentPlayer()->GetColor();
ChessPiece* chessPieceKing;
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->IsKing() && field.second->GetColor() == currentColor) {
chessPieceKing = field.second;
break;
}
}
// Der König hat aber auch keine validen Züge mehr.
if (chessPieceKing->GetNextPositions().size() > 0) {
return false;
}
// Man hat selbst keine Figuren mehr welche noch ziehen könnten.
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->GetColor() == currentColor) {
if (field.second->GetNextPositions().size() > 0) {
return false;
}
}
}
// König wird nicht direkt attackiert.
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->GetColor() == opponentColor) {
if (field.second->GetNextPositions().count(chessPieceKing->GetPosition()) == 1) {
return false;
}
}
}
return true;
}
/**
* Get the current player.
*/
Player* Chessboard::GetCurrentPlayer() {
return this->currentPlayer;
}
/**
* Get the opponent player.
*/
Player* Chessboard::GetOpponentPlayer() {
if (this->GetCurrentPlayer()->GetColor() == ChessPieceColor::Black) {
return this->GetPlayer(ChessPieceColor::White);
} else {
return this->GetPlayer(ChessPieceColor::Black);
}
}
/**
* Get a player by color.
* @return Player* The player who is associated with the given color.
*/
Player* Chessboard::GetPlayer(ChessPieceColor color) {
if (color == ChessPieceColor::Black) {
return std::get<ChessPieceColor::Black>(this->players);
} else {
return std::get<ChessPieceColor::White>(this->players);
}
}
/**
* Set the players to the chessboard.
* This function also determines the starting player.
* @param Player* playerA The first player.
* @param Player* playerB The second player.
*/
void Chessboard::SetPlayers(Player* playerA, Player* playerB) {
std::random_device rngdevice;
std::mt19937 generator(rngdevice());
std::uniform_int_distribution<int> distr(0, 1);
if (distr(generator) == 0) { // 0 = A starts (white)
this->players = {playerB, playerA};
} else { // 1 = B starts (white)
this->players = {playerA, playerB};
}
this->GetPlayer(ChessPieceColor::White)->SetColor(ChessPieceColor::White);
this->GetPlayer(ChessPieceColor::Black)->SetColor(ChessPieceColor::Black);
this->currentPlayer = this->GetPlayer(ChessPieceColor::White);
}
/**
* Switch the current player.
*/
void Chessboard::SwitchCurrentPlayer() {
if (this->GetCurrentPlayer()->GetColor() == ChessPieceColor::White) {
this->currentPlayer = this->GetPlayer(ChessPieceColor::Black);
} else {
this->currentPlayer = this->GetPlayer(ChessPieceColor::White);
}
}
/**
* Update the next positions of all chess pieces.
*/
void Chessboard::UpdateChessPieces() {
for (char chessPieceCode : {'B', 'N', 'P', 'Q', 'R', 'K'}) {
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->GetChar() == chessPieceCode) {
field.second->UpdateNextPositions(this);
}
}
}
}
/**
* Check whether a given position is under attack.
* @param ChessPiecePosition position The position which should be checked.
* @param ChessPieceColor color The color that attacks (opponent color).
* @return bool The status whether the given position is under attack.
*/
bool Chessboard::IsPositionUnderAttack(ChessPiecePosition position, ChessPieceColor color) {
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
if (field.second->GetColor() == color && field.second->GetNextPositions().count(position) == 1) {
return true;
}
}
return false;
}
Chessboard::~Chessboard() {
for (std::pair<ChessPiecePosition, ChessPiece*> field : this->chessboard) {
delete field.second;
}
this->chessboard.clear();
}
ChessPiece* Chessboard::GetChessPieceKing(ChessPieceColor color) {
ChessPiece* chessPieceKing;
for (ChessPiece* chessPiece : this->GetChessPieces()) {
if (chessPiece->IsKing() && chessPiece->GetColor() == color) {
chessPieceKing = chessPiece;
}
}
return chessPieceKing;
}

103
Chessboard/Chessboard.hpp Normal file
View File

@@ -0,0 +1,103 @@
#ifndef Chessboard_H
#define Chessboard_H
#include <iostream>
#include <map>
#include <random>
#include <string>
#include <utility>
#include <vector>
#include <set>
#include <memory>
#include "../Player/Player.hpp"
#include "../ChessPieces/ChessPieceColor.hpp"
#include "../ChessPieces/ChessPiecePosition.hpp"
class ChessPiece;
class Chessboard {
private:
std::map<ChessPiecePosition, ChessPiece*> chessboard;
std::vector<std::pair<ChessPiecePosition, ChessPiecePosition>> history;
std::pair<Player*, Player*> players;
Player* currentPlayer;
public:
struct Board_ChessPiece {
int color;
char type;
std::pair<char, int> position;
Board_ChessPiece(const int& c, const char& t, std::pair<char,int> p) : color(c), type(t), position(p) {}
bool operator<(const Board_ChessPiece& other) const {
if (position != other.position) {
return position < other.position;
}
if (color != other.color) {
return color < other.color;
}
return type < other.type;
}
};
inline static const std::set<Board_ChessPiece> defaultBoard = {
{0, 'P', {'A', 7}},
{0, 'P', {'B', 7}},
{0, 'P', {'C', 7}},
{0, 'P', {'D', 7}},
{0, 'P', {'E', 7}},
{0, 'P', {'F', 7}},
{0, 'P', {'G', 7}},
{0, 'P', {'H', 7}},
{0, 'R', {'A', 8}},
{0, 'K', {'B', 8}},
{0, 'B', {'C', 8}},
{0, 'Q', {'D', 8}},
{0, 'K', {'E', 8}},
{0, 'B', {'F', 8}},
{0, 'K', {'G', 8}},
{0, 'R', {'H', 8}},
{1, 'P', {'A', 2}},
{1, 'P', {'B', 2}},
{1, 'P', {'C', 2}},
{1, 'P', {'D', 2}},
{1, 'P', {'E', 2}},
{1, 'P', {'F', 2}},
{1, 'P', {'G', 2}},
{1, 'P', {'H', 2}},
{1, 'R', {'A', 1}},
{1, 'N', {'B', 1}},
{1, 'B', {'C', 1}},
{1, 'Q', {'D', 1}},
{1, 'K', {'E', 1}},
{1, 'B', {'F', 1}},
{1, 'K', {'G', 1}},
{1, 'R', {'H', 1}}
};
~Chessboard();
void InitializeStartBoard();
void InitializeBoard(std::set<Board_ChessPiece> board);
//void SetChessPiece(std::unique_ptr<ChessPiece> piece);
void SetChessPiece(ChessPiece* chesspiece);
bool IsEmptyField(ChessPiecePosition* position);
ChessPiece* GetChessPiece(ChessPiecePosition* position);
std::vector<ChessPiece*> GetChessPieces();
void UpdateChessPieces();
void MoveChessPiece(std::string move);
void SetToHistory(ChessPiecePosition fromPosition, ChessPiecePosition toPosition);
int GetCountMoves();
std::pair<ChessPiecePosition, ChessPiecePosition> GetLastMove();
bool IsCheckmate();
bool IsCheck();
bool IsStalemate();
bool IsPositionUnderAttack(ChessPiecePosition position, ChessPieceColor color);
Player* GetCurrentPlayer();
Player* GetOpponentPlayer();
void SetPlayers(Player* playerA, Player* playerB);
void SwitchCurrentPlayer();
Player* GetPlayer(ChessPieceColor color);
ChessPiece* GetChessPieceKing(ChessPieceColor color);
};
#endif

View File

@@ -0,0 +1 @@
//#include "../Chessboard/ChessboardVisualizer.hpp"

View File

@@ -0,0 +1,13 @@
/*#ifndef ChessboardVisualizer_H
#define ChessboardVisualizer_H
#include "../ChessPieces/ChessPiece.hpp"
#include "../Chessboard/Chessboard.hpp"
class ChessboardVisualizer {
public:
ChessboardVisualizer() = default;
virtual void Draw(Chessboard* chessboard) = 0;
};
#endif*/

View File

@@ -0,0 +1,317 @@
#include "../Chessboard/ChessboardVisualizerGraphic.hpp"
#include "../ChessPieces/ChessPiecePosition.hpp"
#include "../Visualizer/HistorieVisualizer.hpp"
#include "../Visualizer/BaseVisualizer.hpp"
/*void ChessboardVisualizerGraphic::SetConsoleColor(Colors foreground, Colors background) {
const std::string SEQ_FOREGROUND = "\x1b[3";
const std::string SEQ_FOREGROUND_LIGHT = "\x1b[9";
const std::string SEQ_BACKGROUND = "\x1b[4";
const std::string SEQ_BACKGROUND_LIGHT = "\x1b[10";
// set foreground color
switch (foreground) {
case BLACK:
case RED:
case GREEN:
case YELLOW:
case BLUE:
case MAGENTA:
case CYAN:
case WHITE:
std::cout << SEQ_FOREGROUND << foreground << "m";
break;
case LIGHT_BLACK:
case LIGHT_RED:
case LIGHT_GREEN:
case LIGHT_YELLOW:
case LIGHT_BLUE:
case LIGHT_MAGENTA:
case LIGHT_CYAN:
case LIGHT_WHITE:
std::cout << SEQ_FOREGROUND_LIGHT << foreground << "m";
break;
case DEFAULT:
default:
std::cout << SEQ_FOREGROUND << foreground << "m";
break;
}
// set background color
switch (background) {
case BLACK:
case RED:
case GREEN:
case YELLOW:
case BLUE:
case MAGENTA:
case CYAN:
case WHITE:
std::cout << SEQ_BACKGROUND << background << "m";
break;
case LIGHT_BLACK:
case LIGHT_RED:
case LIGHT_GREEN:
case LIGHT_YELLOW:
case LIGHT_BLUE:
case LIGHT_MAGENTA:
case LIGHT_CYAN:
case LIGHT_WHITE:
std::cout << SEQ_BACKGROUND_LIGHT << background << "m";
break;
case DEFAULT:
default:
std::cout << SEQ_BACKGROUND << background << "m";
break;
}
}
void ChessboardVisualizerGraphic::temp(Chessboard* chessboard) {
for (int rank = 8; rank >= 1; rank--) {
if (rank == 8) GenerateTopOrBottomBorder(true);
std::vector<std::string> temp;
for (int heightOfField = 0; heightOfField < 3; heightOfField++) {
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp.push_back((heightOfField == 1) ? " " + std::to_string(rank) + " " : " ");
temp.push_back(ChessboardVisualizerGraphic::VERTICAL_LINE);
}
temp.push_back(GenerateBoardField(chessboard, file, rank, heightOfField));
if (file == 'H') {
this->SetConsoleColor(DEFAULT, DEFAULT);
temp.push_back(ChessboardVisualizerGraphic::VERTICAL_LINE);
}
}
AddRowToBoard(temp);
temp.clear();
this->SetConsoleColor(DEFAULT, DEFAULT);
}
if (rank == 1) GenerateTopOrBottomBorder(false);
}
}
void ChessboardVisualizerGraphic::AddMenusToChessboard() {
}
void ChessboardVisualizerGraphic::GenerateChessboard(Chessboard* chessboard) {
ClearTerminal();
board.clear();
GeneratePlayers(chessboard);
temp(chessboard);
AddMenusToChessboard();
/*HistorieVisualizer history = HistorieVisualizer(15, 3, "Me", "Me");
std::vector<std::vector<std::string>> historyDisplayVector = history.GetDisplayVector();
std::vector<std::vector<std::string>> currentBoard = board;
for (size_t i = 0; i < historyDisplayVector.size(); i++) {
for (size_t j = 0; j < historyDisplayVector[i].size(); j++) {
board[i].push_back(" " + historyDisplayVector[i][j]);
}
}*/
/*this->SetConsoleColor(DEFAULT, DEFAULT);
DrawFromVector();
}
void ChessboardVisualizerGraphic::Draw(Chessboard* chessboard) {
ClearTerminal();
DrawPlayers(chessboard);
for (int rank = 8; rank >= 1; rank--) {
if (rank == 8) DrawTopOrBottomBorder(true);
for (int heightOfField = 0; heightOfField < 3; heightOfField++) {
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
(heightOfField == 1) ? std::cout << " " << rank << " " : std::cout << " ";
std::cout << ChessboardVisualizerGraphic::VERTICAL_LINE;
}
DrawBoardField(chessboard, file, rank, heightOfField);
if (file == 'H') {
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << ChessboardVisualizerGraphic::VERTICAL_LINE;
}
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
if (rank == 1) DrawTopOrBottomBorder(false);
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
void ChessboardVisualizerGraphic::GenerateTopOrBottomBorder(bool top) {
std::vector<std::string> temp;
temp.push_back(" ");
std::string left = (top) ? ChessboardVisualizerGraphic::TOP_LEFT_CORNER : ChessboardVisualizerGraphic::BOTTOM_LEFT_CORNER;
temp.push_back(left);
for (int i = 0; i < 8; i++) {
temp.push_back(ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE + ChessboardVisualizerGraphic::HORIZONTAL_LINE);
}
std::string right = (top) ? ChessboardVisualizerGraphic::TOP_RIGHT_CORNER : ChessboardVisualizerGraphic::BOTTOM_RIGHT_CORNER;
temp.push_back(right);
AddRowToBoard(temp);
if (!top) GenerateFiles();
}
void ChessboardVisualizerGraphic::DrawTopOrBottomBorder(bool top) {
std::cout << " ";
std::string left = (top) ? ChessboardVisualizerGraphic::TOP_LEFT_CORNER : ChessboardVisualizerGraphic::BOTTOM_LEFT_CORNER;
std::cout << left;
for (int i = 0; i < 8; i++) {
std::cout << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE << ChessboardVisualizerGraphic::HORIZONTAL_LINE;
}
std::string right = (top) ? ChessboardVisualizerGraphic::TOP_RIGHT_CORNER : ChessboardVisualizerGraphic::BOTTOM_RIGHT_CORNER;
std::cout << right;
std::cout << std::endl;
if (!top) DrawFiles();
}
void ChessboardVisualizerGraphic::GenerateFiles() {
std::vector<std::string> temp;
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp.push_back(" ");
}
temp.push_back(" " + std::string(1, file) + " ");
if (file == 'H') {
temp.push_back(" ");
}
}
AddRowToBoard(temp);
}
void ChessboardVisualizerGraphic::DrawFiles() {
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
std::cout << " ";
}
std::cout << " " << file << " ";
if (file == 'H') {
std::cout << " ";
}
}
std::cout << std::endl;
}
std::string ChessboardVisualizerGraphic::GenerateBoardField(Chessboard* chessboard, char file, int rank, int height) {
if (height == 1) {
ChessPiecePosition* position = new ChessPiecePosition(file, rank);
if (chessboard->IsEmptyField(position)) {
return " ";
} else {
ChessPiece* piece = chessboard->GetChessPiece(position);
return " " + piece->GetUnicode() + " ";
}
} else {
return " ";
}
}
void ChessboardVisualizerGraphic::DrawBoardField(Chessboard* chessboard, char file, int rank, int height) {
if (file % 2 == (rank % 2)) {
this->SetConsoleColor(BLACK, WHITE);
} else {
this->SetConsoleColor(WHITE, BLACK);
}
if (height == 1) {
ChessPiecePosition* position = new ChessPiecePosition(file, rank);
if (chessboard->IsEmptyField(position)) {
std::cout << " ";
} else {
ChessPiece* piece = chessboard->GetChessPiece(position);
std::cout << " " << piece->GetUnicode() << " ";
}
} else {
std::cout << " ";
}
}
void ChessboardVisualizerGraphic::ClearTerminal() {
//std::cout << "\033[2J"; // clear the console
system("cls");
}
void ChessboardVisualizerGraphic::GeneratePlayers(Chessboard* chessboard) {
std::vector<std::string> temp;
temp.push_back(" ");
temp.push_back(chessboard->GetPlayer(ChessPieceColor::White)->GetName() + " vs. " + chessboard->GetPlayer(ChessPieceColor::Black)->GetName());
AddRowToBoard(temp);
}
void ChessboardVisualizerGraphic::DrawPlayers(Chessboard* chessboard) {
std::cout << " ";
std::cout << chessboard->GetPlayer(ChessPieceColor::White)->GetName() + " vs. " + chessboard->GetPlayer(ChessPieceColor::Black)->GetName();
std::cout << std::endl;
}
void ChessboardVisualizerGraphic::AddRowToBoard(const std::vector<std::string>& row) {
board.push_back(row);
}
// board[2] bis board[25] Feld des Schachbretts
// in vectoren von 2 bis 25 index von 2 bis 9
void ChessboardVisualizerGraphic::DrawFromVector() {
size_t lengthOfBoard = BaseVisualizer::GetSumAllCharsFromVector(board[1]);
for (int row = 0; row < board.size(); ++row) {
for (int column = 0; column < board[row].size(); ++column) {
if (row >= 2 && row <= 25 && column >= 2 && column <= 9) {
bool isSecondRowOfField = (row % 3 == 2);
bool isBlackWhite = (column % 2 == row % 2);
if ((row - 1) % 3 == 0) { // Change after 3 rows
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
} else {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
}
} else {
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
} else {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
}
}
}
//std::cout << std::setw(lengthOfBoard) << board[row][column];
this->SetConsoleColor(DEFAULT, DEFAULT);
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
}*/

View File

@@ -0,0 +1,48 @@
/*#ifndef ChessboardVisualizerGraphic_H
#define ChessboardVisualizerGraphic_H
#include <string>
#include <vector>
#include "../Chessboard/ChessboardVisualizer.hpp"*/
/*enum Colors {
BLACK = 0, RED = 1, GREEN = 2, YELLOW = 3, BLUE = 4, MAGENTA = 5, CYAN = 6, WHITE = 7,
LIGHT_BLACK = 10, LIGHT_RED = 11, LIGHT_GREEN = 12, LIGHT_YELLOW = 13, LIGHT_BLUE = 14,
LIGHT_MAGENTA = 15, LIGHT_CYAN = 16, LIGHT_WHITE = 17, DEFAULT = 9
};*/
/*class ChessboardVisualizerGraphic : public ChessboardVisualizer {
protected:
inline static const std::string TOP_LEFT_CORNER = "\u2554";
inline static const std::string TOP_RIGHT_CORNER = "\u2557";
inline static const std::string HORIZONTAL_LINE = "\u2550";
inline static const std::string VERTICAL_LINE = "\u2551";
inline static const std::string BOTTOM_LEFT_CORNER = "\u255A";
inline static const std::string BOTTOM_RIGHT_CORNER = "\u255D";
private:
std::vector<std::vector<std::string>> board;
void ClearTerminal();
void DrawTopOrBottomBorder(bool top);
void GenerateTopOrBottomBorder(bool top);
void DrawPlayers(Chessboard* chessboard);
void GeneratePlayers(Chessboard* chessboard);
std::string GenerateBoardField(Chessboard* chessboard, char file, int rank, int height);
void DrawBoardField(Chessboard* chessboard, char file, int rank, int height);
void DrawFiles();
void GenerateFiles();
//void SetConsoleColor(Colors foreground, Colors background);
void SetColorsForField();
void temp(Chessboard* chessboard);
void AddMenusToChessboard();
public:
ChessboardVisualizerGraphic() = default;
void Draw(Chessboard* chessboard);
void GenerateChessboard(Chessboard* chessboard);
void DrawFromVector();
void AddRowToBoard(const std::vector<std::string>& row);
};
#endif
*/

View File

@@ -0,0 +1,92 @@
#include "../Chessboard/ChessboardVisualizerText.hpp"
#include "../ChessPieces/ChessPiecePosition.hpp"
/*void ChessboardVisualizerText::Draw(Chessboard* chessboard) {
std::cout << "\033[2J"; // clear the console
std::cout << std::endl;
std::cout << " " << chessboard->GetPlayer(ChessPieceColor::White)->GetName() << " vs. " << chessboard->GetPlayer(ChessPieceColor::Black)->GetName();
std::cout << std::endl;
for (int rank = 8; rank >= 1; rank--) {
if (rank == 8) {
for (int i = 0; i < 8; i++) {
if (i == 0) {
std::cout << " " << " " << " ";
std::cout << "\u250F";
} else {
std::cout << "\u2533";
}
std::cout << "\u2501" << "\u2501" << "\u2501";
if (i == 7) {
std::cout << "\u2513";
}
}
std::cout << std::endl;
}
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') { // Beginn der Zeile
std::cout << " " << rank << " ";
std::cout << "\u2503";
}
ChessPiecePosition* position = new ChessPiecePosition(file, rank);
if (chessboard->IsEmptyField(position)) {
std::cout << " " << " " << " ";
} else {
ChessPiece* piece = chessboard->GetChessPiece(position);
std::cout << " " << piece->GetUnicode() << " ";
}
std::cout << "\u2503";
}
std::cout << std::endl;
if (rank != 1) {
for (int i = 0; i < 8; i++) {
if (i == 0) {
std::cout << " " << " " << " ";
std::cout << "\u2523";
} else {
std::cout << "\u254B";
}
std::cout << "\u2501" << "\u2501" << "\u2501";
if (i == 7) {
std::cout << "\u252B";
}
}
std::cout << std::endl;
} else {
for (int i = 0; i < 8; i++) {
if (i == 0) {
std::cout << " " << " " << " ";
std::cout << "\u2517";
} else {
std::cout << "\u253B";
}
std::cout << "\u2501" << "\u2501" << "\u2501";
if (i == 7) {
std::cout << "\u251B";
}
}
std::cout << std::endl;
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
std::cout << " " << " " << " ";
std::cout << " ";
} else {
std::cout << " ";
}
std::cout << " " << file << " ";
if (file == 'H') {
std::cout << " ";
}
}
std::cout << std::endl;
}
}
std::cout << std::endl;
}
*/

View File

@@ -0,0 +1,16 @@
/*#ifndef ChessboardVisualizerText_H
#define ChessboardVisualizerText_H
#include "../Chessboard/ChessboardVisualizer.hpp"
class ChessboardVisualizerText : public ChessboardVisualizer {
private:
void Clear();
public:
ChessboardVisualizerText() = default;
void Draw(Chessboard* chessboard);
};
#endif
*/

25
Chesspiece.cpp Normal file
View File

@@ -0,0 +1,25 @@
//
// Created by hamac on 18.12.2024.
//
#include "Chesspiece.h"
Chesspiece::Chesspiece(char color, std::pair<int, int> position)
: color(color), position(position) {}
std::pair<int, int> Chesspiece::getPosition() { return this->position; };
void Chesspiece::setPosition(std::pair<int, int> position) {
this->position = position;
//Chesspiece::calcAvaibleMoves(); // Brett -> Auswahl Figuren -> Züge gewählte
}
char Chesspiece::getColor() { return color; }
void Chesspiece::setColor(char color) { color = color; }
std::vector<std::string> Chesspiece::getAvaibleMoves() { return avaibleMoves; }
bool Chesspiece::checkNotation(std::string notation) {
std::regex pattern("R^([KQRNBP]?)([a-h][1-8])[-x]([a-h][1-8])([+#]?)$");
std::smatch match;
return (std::regex_search(notation, match, pattern) ? true : false);
}

46
Chesspiece.h Normal file
View File

@@ -0,0 +1,46 @@
//
// Created by hamac on 19.12.2024.
//
#ifndef CHESSPIECE_H
#define CHESSPIECE_H
//
// Created by hamac on 18.12.2024.
//
#include <string>
#include <vector>
#include <regex>
class Chesspiece {
private:
/* fields */
// ToDo: von char auf enum Color {W, B} umstellen
char color;
char identifier; // P,K,...
std::pair<int, int> position;
// std::vector<std::pair<int, int>>
std::vector<std::string> avaibleMoves;
/* methods */
virtual std::vector<std::string> calcAvaibleMoves() = 0;
public:
Chesspiece(char color, std::pair<int, int> position);
virtual ~Chesspiece() = default;
std::pair<int, int> getPosition();
void setPosition(std::pair<int, int> position);
char getColor();
void setColor(char color);
std::vector<std::string> getAvaibleMoves();
bool checkNotation(std::string notation);
};
#endif //CHESSPIECE_H

60
OldCode.txt Normal file
View File

@@ -0,0 +1,60 @@
void firstVersion() {
const std::string white = "\u2B1C";
const std::string black = "\u2B1B";
std::string brett[8][8];
std::string field;
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 8; x++) {
if (y % 2 == 0) {
field = (x % 2 == 0) ? "\u2B1C" : "\u2B1B";
}
else {
field = (x % 2 == 0) ? "⬛" : "⬜";
}
std::cout << field;
}
std::cout << "\n";
}
}
void secondVersion() {
//wchar_t t = 0x25FF;
// Horizontale Linie u2500
// Vertikale Linie u2502
// Top Right Corner u250C
// Top Left Corner u2510
// Bottom Right Corner u2514
// Bottom Left Corner u2518
std::string topRightCorner = "\u2554";
std::string topLeftCorner = "\u2557";
std::string bottomLeftCorner = "\u255A";
std::string bottomRightCorner = "\u255D";
std::string horizontalLine = "\u2550\u2550";
std::string verticalLine = "\u2551";
std::string crossSuc = "\u256C";
std::string leftSide = "\u2560";
std::string rightSide = "\u2563";
std::string topSide = "\u2566";
std::string bottomSide = "\u2569";
std::string firstLine = "\u2554\u2550\u2566";
std::string line;
for (int row = 0; row < 9; ++row) {
for (int col = 0; col < 8; ++col) {
if (row == 0 && col > 0) line += topSide + horizontalLine;
if (row == 8 && col > 0) line += bottomSide + horizontalLine;
if (col == 0 && row < 8 && row > 0) line += leftSide + horizontalLine;
if (row > 0 && row < 8 && col > 0) line += crossSuc + horizontalLine;
if (col == 7 && row < 8 && row > 0) line += rightSide;
if (row == 0 && col == 0) line += topRightCorner + horizontalLine;
if (row == 8 && col == 0) line += bottomLeftCorner + horizontalLine;
if (row == 0 && col == 7) line += topLeftCorner + "\n" + verticalLine;
if (row == 8 && col == 7) line += bottomRightCorner;
}
line += "\n";
}

33
Player/Player.cpp Normal file
View File

@@ -0,0 +1,33 @@
#include "../Player/Player.hpp"
/**
* Creates a new player with a specific name.
* @param name The name of the player.
*/
Player::Player(std::string name) {
this->_name = name;
}
/**
* Gets the color of the player.
* @return The color of the player.
*/
ChessPieceColor Player::GetColor() {
return this->_color;
}
/**
* Gets the name of the player.
* @return The name of the player.
*/
std::string Player::GetName() {
return this->_name;
}
/**
* Sets the color of the player.
* @param color The color of the player.
*/
void Player::SetColor(ChessPieceColor color) {
this->_color = color;
}

20
Player/Player.hpp Normal file
View File

@@ -0,0 +1,20 @@
#ifndef Player_H
#define Player_H
#include <string>
#include "../ChessPieces/ChessPieceColor.hpp"
class Player {
private:
ChessPieceColor _color;
std::string _name;
public:
Player() = default;
Player(std::string name);
ChessPieceColor GetColor();
std::string GetName();
void SetColor(ChessPieceColor color);
};
#endif

114
README.md
View File

@@ -1,51 +1,119 @@
# c/c++ Abschlussprojekt - Schach
## Notwendige Umsetzungen
1. Klasse für Spielbrett
2. Oberklasse für Spielfiguren
1. Bauer
2. Dame
3. König
4. Läufer
5. Turm
6. Springer
1. Bauer
2. Dame
3. König
4. Läufer
5. Turm
6. Springer
3. Fancy User Interface
4. Speicherung des Spielbretts
5. Unentschieden anbieten
6. Aufgegeben
### Spielbrett
- 8x8 Matrix
- ANSI Linien checken
- Unterscheidung von schwarzen und weißen Feldern
- UTF-8 Spielfiguren
- draw() Funktion
- movement
- Schachnotation
- oder Klickbar?
- movement
- Schachnotation
- oder Klickbar?
- Beschriftung des Spielbretts
### Spielfiguren
- Interface für Implementierung?
- Default Felder:
- Art der Figure
- UTF-8 Code
- Schlagen: Ich sehe dich nach movement Regeln -> Du stirbst
- Art der Figure
- UTF-8 Code
- Schlagen: Ich sehe dich nach movement Regeln -> Du stirbst
- Bauer:
- Movement: 1 Felder, außer bei Start 1-2 Felder
- Schlagen: 1 Feld vor Diagonal
- Spezialmove:
- Beförderung
- En Passent - Wie?
- Movement: 1 Felder, außer bei Start 1-2 Felder
- Schlagen: 1 Feld vor Diagonal
- Spezialmove:
- Beförderung
- En Passent - Wie?
- Dame:
- Movement: Fuck it, i do what i want
- Movement: Fuck it, i do what i want
- König:
- Movement: Körperklaus. Ich kann nur ein Feld nach überall
- Spezialmove: Castlen
- Movement: Körperklaus. Ich kann nur ein Feld nach überall
- Spezialmove: Castlen
- Läufer:
- Movement: Die Diagnal ist mir
- Movement: Die Diagnal ist mir
- Turm:
- Movement: Vertikal und Horizontal
- Movement: Vertikal und Horizontal
- Springer:
- Movement: L-Bewegung (2 nach vorn + 1 nach links oder rechts); Krake
- Movement: L-Bewegung (2 nach vorn + 1 nach links oder rechts); Krake
- Spezial Moves:
- Rochade -> Kurz/Lang
- En Passant
- Stalemate
- Bauer: 2 Felder
- Umwandeln
## Optional wenn Lust und Zeit?
1. Bedienung per Maus
2. Multiplayer
3. Historie der Spielzüge
4. Gravejard der geschlagenen Figuren
5. König platzieren -> Anzeigen wer gewinnt
# Gedankensammlung
- Initialisierung:
- Brett zeichnen
- Figuren mit Zugmöglichkeiten ermitteln
- Züge kalkulieren
- Objekt mit allen Figuren erstellen -> alle Figuren initialisieren
- Kalkulation der Züge
- Anhand der aktuellen Position
- Mit einbeziehen, dass Zug König nicht in Mate versetzt (verboten)
- Sonder Züge, wie En passant, Rochade (Lang, Kurz), Bauern zwei Feld, beachten
- Prüfen, ob andere Figuren im Weg stehen
- Array von Linked Lists
- Array Index steht für Richtung von Bewegungen (diagonalen, L, Gerade)
- alles droppen, was nach pos mit Figur kommt
## Figuren
- Läufer (Bishop)
- König (King)
- Königin (Queen)
- Turm (Rook)
- Bauer (Pawn)
- Pferd (Knight)
## ToDo
- Speicherfunktion
- ToDos abarbeiten
- Anleitung schreiben
- Befehlen während des Spiel implementieren
- Bewegen funktioniert nicht -> Fixen!!!!
- Historie -> Spielzüge speichern und anzeigen
- Meldung für falschen Zug (Fehlermeldungen beim Spielen)
- Nach Beenden nicht Pfad in Anzeige stehen lassen
- Dark Mode
## Erledigt
- Schachnotation (Lange)
- Menü (ASCII Art of TurboSchach)
- Startmenü
- Spielmenü mit Historie, Kommand
- Plattformunabhängiges CMD clearing vor dem Zeichnen
- Spezialbewegung (Rochade, Umwandlung, En passant)
## Build
```
g++ -o chess.exe main.cpp ChessPieces/*.cpp Chessboard/*.cpp Player/*.cpp Visualizer/*.cpp
```
## Voraussetzungen
- C++ 17

View File

@@ -0,0 +1,259 @@
#include "BaseVisualizer.hpp"
void BaseVisualizer::ClearTerminal() {
//std::cout << "\033[2J";
system("cls");
}
std::vector<std::vector<std::string>>* BaseVisualizer::GetDisplayVector() {
return &display_vector;
}
size_t BaseVisualizer::CountVisibleCharacters(const std::string& str) {
size_t count = 0;
size_t i = 0;
while (i < str.size()) {
if (str[i] == '\x1B' && i + 1 < str.size() && str[i + 1] == '[') {
// ANSI-Escape-Sequenz erkennen und überspringen
i += 2; // Überspringe '\x1B['
while (i < str.size() && !std::isalpha(str[i])) {
++i; // Fortsetzung der Sequenz überspringen
}
if (i < str.size() && std::isalpha(str[i])) {
++i; // Buchstaben am Ende der Sequenz überspringen
}
} else {
// UTF-8 Startbytes zählen (kein Fortsetzungsbyte)
if ((str[i] & 0b11000000) != 0b10000000) {
++count;
}
++i;
}
}
return count;
}
size_t BaseVisualizer::GetSumAllCharsFromVector(const std::vector<std::string>& vec) {
size_t sum = 0;
for (const std::string& str : vec) {
sum += CountVisibleCharacters(str);
}
return sum;
}
void BaseVisualizer::GenerateEmptyLine(const int lengthOfMenu, const bool single) {
std::string result = "";
for (int i = 0; i < lengthOfMenu; ++i) {
if (i == 0) {
result += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
} else if (i == lengthOfMenu-1) {
result += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
} else {
result += " ";
}
}
display_vector.push_back({result});
}
// ToDo: Auf Max länge bringen
void BaseVisualizer::GenerateBoxMenuLine(const size_t length, const std::string& str, const bool single, const size_t padding) {
std::string result = ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE) + std::string(padding, ' ') + str;
while (CountVisibleCharacters(result) < length-1) {
result += " ";
}
display_vector.push_back({result.append(((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE))});
}
void BaseVisualizer::GenerateCenteredString(const size_t widthOfMenu, const std::string& str, const bool single) {
std::string result = (single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE;
float newLength = widthOfMenu - CountVisibleCharacters(str) - 2;
int firstHalfLength = std::floor(newLength / 2);
int secondHalfLength = std::ceil(newLength / 2);
for (int i = 0; i < firstHalfLength; ++i) {
result += " ";
}
result += str;
for (int i = 0; i < secondHalfLength; ++i) {
result += " ";
}
display_vector.push_back({result+ ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE)});
}
void BaseVisualizer::DisplayElement() {
int temp;
for (const auto& row : display_vector) {
for (const auto& cell : row) {
std::cout << cell;
}
std::cout << std::endl;
}
std::cout << "\x1B[u";
//std::cout << "Select option" << std::endl;
std::cin >> temp;
}
size_t BaseVisualizer::CalculateMaxMenuWidth(const size_t longestStringLength, const size_t padding) {
return longestStringLength + 2*padding + 2;
}
void BaseVisualizer::GenerateTopBottomBorder(const size_t totalLength, const bool top, const bool single) {
std::string result = (top) ? ((single) ? BaseVisualizer::TOP_LEFT_CORNER_SINGLE : BaseVisualizer::TOP_LEFT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE : BaseVisualizer::BOTTOM_LEFT_CORNER);
for (size_t i = 0; i < totalLength-2; ++i) {
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
}
display_vector.push_back({result + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
}
void BaseVisualizer::AddEmptyLines(const size_t lines, const size_t length, const bool sinlge) {
for (size_t i = 0; i < lines; ++i) {
BaseVisualizer::GenerateEmptyLine(length, sinlge);
}
}
void BaseVisualizer::GenerateTableTopBottom(const size_t totalLength, const bool top, const bool single) {
int firstHalfLength = std::floor(totalLength / 2);
std::string result = (top) ? ((single) ? BaseVisualizer::TOP_LEFT_CORNER_SINGLE : BaseVisualizer::TOP_LEFT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE : BaseVisualizer::BOTTOM_LEFT_CORNER);
for (size_t i = 0; i < firstHalfLength-1; ++i) {
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
}
result += (top) ? ((single) ? BaseVisualizer::TOP_CROSS_SINGLE : BaseVisualizer::TOP_CROSS) : ((single) ? BaseVisualizer::BOTTOM_CROSS_SINGLE : BaseVisualizer::BOTTOM_CROSS);
for (size_t i = 0; i < firstHalfLength-1; ++i) {
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
}
display_vector.push_back({result + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
}
void BaseVisualizer::GenerateTableLine(const float length, const std::vector<std::string>& str, const bool single) {
int firstHalfLength = std::floor(length / 2);
std::string result = ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
std::string temp;
for (size_t i = 0; i < 2; ++i) {
temp += " " + str[i];
while (CountVisibleCharacters(temp) < firstHalfLength-1) {
temp += " ";
}
temp += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
result += temp;
temp = "";
}
display_vector.push_back({result});
}
void BaseVisualizer::GenerateTableSeperator(const float length, const bool single) {
int firstHalfLength = std::floor(length / 2);
std::string result = ((single) ? BaseVisualizer::RIGHT_CROSS_SINGLE : BaseVisualizer::RIGHT_CROSS);
std::string temp;
for (size_t i = 0; i < 2; ++i) {
while (CountVisibleCharacters(temp) < firstHalfLength-1) {
temp += ((single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE);
}
temp += (i != 1) ? ((single) ? BaseVisualizer::CROSS_SINGLE : BaseVisualizer::CROSS) : "";
result += temp;
temp = "";
}
result += ((single) ? BaseVisualizer::LEFT_CROSS_SINGLE : BaseVisualizer::LEFT_CROSS);
display_vector.push_back({result});
}
void BaseVisualizer::GenerateBoxSeperator(const float length, const bool single) {
std::string result = ((single) ? BaseVisualizer::RIGHT_CROSS_SINGLE : BaseVisualizer::RIGHT_CROSS);
while (CountVisibleCharacters(result) < length-1) {
result += ((single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE);
}
result += ((single) ? BaseVisualizer::LEFT_CROSS_SINGLE : BaseVisualizer::LEFT_CROSS);
display_vector.push_back({result});
}
void BaseVisualizer::SetConsoleColor(Colors foreground, Colors background) {
const std::string SEQ_FOREGROUND = "\x1b[3";
const std::string SEQ_FOREGROUND_LIGHT = "\x1b[9";
const std::string SEQ_BACKGROUND = "\x1b[4";
const std::string SEQ_BACKGROUND_LIGHT = "\x1b[10";
// set foreground color
switch (foreground) {
case BLACK:
case RED:
case GREEN:
case YELLOW:
case BLUE:
case MAGENTA:
case CYAN:
case WHITE:
std::cout << SEQ_FOREGROUND << foreground << "m";
break;
case LIGHT_BLACK:
case LIGHT_RED:
case LIGHT_GREEN:
case LIGHT_YELLOW:
case LIGHT_BLUE:
case LIGHT_MAGENTA:
case LIGHT_CYAN:
case LIGHT_WHITE:
std::cout << SEQ_FOREGROUND_LIGHT << foreground << "m";
break;
case DEFAULT:
default:
std::cout << SEQ_FOREGROUND << foreground << "m";
break;
}
// set background color
switch (background) {
case BLACK:
case RED:
case GREEN:
case YELLOW:
case BLUE:
case MAGENTA:
case CYAN:
case WHITE:
std::cout << SEQ_BACKGROUND << background << "m";
break;
case LIGHT_BLACK:
case LIGHT_RED:
case LIGHT_GREEN:
case LIGHT_YELLOW:
case LIGHT_BLUE:
case LIGHT_MAGENTA:
case LIGHT_CYAN:
case LIGHT_WHITE:
std::cout << SEQ_BACKGROUND_LIGHT << background << "m";
break;
case DEFAULT:
default:
std::cout << SEQ_BACKGROUND << background << "m";
break;
}
}
size_t BaseVisualizer::FindMaxLength(const std::vector<std::string> vec) {
size_t max = 0;
size_t currentLength = 0;
for (const std::string& str : vec) {
currentLength = CountVisibleCharacters(str);
(currentLength > max) ? max = CountVisibleCharacters(str) : max;
}
return max;
}

View File

@@ -0,0 +1,99 @@
#ifndef BASEVISUALIZER_H
#define BASEVISUALIZER_H
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
enum Colors {
BLACK = 0, RED = 1, GREEN = 2, YELLOW = 3, BLUE = 4, MAGENTA = 5, CYAN = 6, WHITE = 7,
LIGHT_BLACK = 10, LIGHT_RED = 11, LIGHT_GREEN = 12, LIGHT_YELLOW = 13, LIGHT_BLUE = 14,
LIGHT_MAGENTA = 15, LIGHT_CYAN = 16, LIGHT_WHITE = 17, DEFAULT = 9
};
class BaseVisualizer {
protected:
inline static const std::string TOP_LEFT_CORNER = "\u2554";
inline static const std::string TOP_RIGHT_CORNER = "\u2557";
inline static const std::string HORIZONTAL_LINE = "\u2550";
inline static const std::string VERTICAL_LINE = "\u2551";
inline static const std::string BOTTOM_LEFT_CORNER = "\u255A";
inline static const std::string BOTTOM_RIGHT_CORNER = "\u255D";
inline static const std::string RIGHT_CROSS = "\u2560";
inline static const std::string LEFT_CROSS = "\u2563";
inline static const std::string CROSS = "\u256C";
inline static const std::string TOP_CROSS = "\u2566";
inline static const std::string BOTTOM_CROSS = "\u2569";
inline static const std::string TOP_LEFT_CORNER_SINGLE = "\u250C";
inline static const std::string TOP_RIGHT_CORNER_SINGLE = "\u2510";
inline static const std::string HORIZONTAL_LINE_SINGLE = "\u2500";
inline static const std::string VERTICAL_LINE_SINGLE = "\u2502";
inline static const std::string BOTTOM_LEFT_CORNER_SINGLE = "\u2514";
inline static const std::string BOTTOM_RIGHT_CORNER_SINGLE = "\u2518";
inline static const std::string RIGHT_CROSS_SINGLE = "\u251C";
inline static const std::string LEFT_CROSS_SINGLE = "\u2524";
inline static const std::string CROSS_SINGLE = "\u253C";
inline static const std::string TOP_CROSS_SINGLE = "\u252C";
inline static const std::string BOTTOM_CROSS_SINGLE = "\u2534";
const size_t MAX_MENU_WIDTH;
const size_t PADDING;
std::vector<std::vector<std::string>> display_vector;
void GenerateEmptyLine(const int lengthOfMenu, const bool single);
void GenerateBoxMenuLine(const size_t length, const std::string& str, const bool single, const size_t padding);
void GenerateCenteredString(const size_t widthOfMenu, const std::string& str, const bool single);
size_t CalculateMaxMenuWidth(const size_t longestStringLength, const size_t padding);
size_t FindMaxLength(const std::vector<std::string> vec);
void GenerateTopBottomBorder(const size_t totalLength, const bool top, const bool single);
void AddEmptyLines(const size_t lines, const size_t length, const bool sinlge);
void GenerateTableTopBottom(const size_t totalLength, const bool top, const bool single);
void GenerateTableLine(const float length, const std::vector<std::string>& str, const bool single);
void GenerateTableSeperator(const float length, const bool single);
void GenerateBoxSeperator(const float length, const bool single);
void SetConsoleColor(Colors foreground, Colors background);
static size_t GetSumAllCharsFromVector(const std::vector<std::string>& vec);
static size_t CountVisibleCharacters(const std::string& str);
private:
virtual void GenerateElement() = 0;
public:
virtual ~BaseVisualizer() = default;
static void ClearTerminal();
void DisplayElement();
std::vector<std::vector<std::string>>* GetDisplayVector();
BaseVisualizer(size_t longestStringLength, size_t padding) : MAX_MENU_WIDTH(BaseVisualizer::CalculateMaxMenuWidth(longestStringLength, padding)), PADDING(padding) {}
};
#endif //BASEVISUALIZER_H
/**
*
ChessboardVisualizer.cpp
HistorieVisualizer.cpp
CommandVisualizer.cpp
PlayVisualizer.cpp {
ChessboardVisualizer.display_vector
HistorieVisualizer.display_vector;
CommandVisualizer.display_vector;
st::cout << ChessboardVisualizer.display_vector[i] (isEmpty) ? << std:endl : << Padding << Menus.display_vector[i] << std:endl;
}
*/

View File

@@ -0,0 +1,166 @@
#include "ChessboardVisualizer.hpp"
size_t ChessboardVisualizer::GetMaxBoardWidth() {
std::string temp;
temp.append(3, ' ');
temp += BaseVisualizer::TOP_LEFT_CORNER;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
temp += BaseVisualizer::HORIZONTAL_LINE;
}
}
temp += BaseVisualizer::TOP_RIGHT_CORNER;
return BaseVisualizer::CountVisibleCharacters(temp);
}
void ChessboardVisualizer::GenerateTopBottomBorder(bool top, bool single) {
std::string temp;
temp.append(3, ' '); // ToDo: Padding?
temp += (top)
? ((single)
? BaseVisualizer::TOP_LEFT_CORNER_SINGLE
: BaseVisualizer::TOP_LEFT_CORNER)
: ((single)
? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE
: BaseVisualizer::BOTTOM_LEFT_CORNER);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
temp += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
}
}
display_vector.push_back({temp + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
}
void ChessboardVisualizer::GenerateElement() {
BaseVisualizer::ClearTerminal();
GeneratePlayers();
GenerateChessboard();
//GenerateDisplayVector();
}
void ChessboardVisualizer::GeneratePlayers() {
std::string result;
result.append(3, ' ');
display_vector.push_back({result + CHESSBOARD->GetPlayer(ChessPieceColor::White)->GetName()
+ " vs. " + CHESSBOARD->GetPlayer(ChessPieceColor::Black)->GetName()});
}
void ChessboardVisualizer::GenerateChessboard() {
std::vector<std::string> temp;
for (int rank = 8; rank >= 1; rank--) {
if (rank == 8) GenerateTopBottomBorder(true, true);
for (int heightOfField = 0; heightOfField < 3; heightOfField++) {
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp.push_back((heightOfField == 1) ? " " + std::to_string(rank) + " " : std::string(3, ' '));
temp.push_back(BaseVisualizer::VERTICAL_LINE_SINGLE);
}
temp.push_back(GenerateBoardField(file, rank, heightOfField));
if (file == 'H') {
temp.push_back(BaseVisualizer::VERTICAL_LINE_SINGLE);
}
}
display_vector.push_back(temp);
temp.clear();
}
if (rank == 1) {
GenerateTopBottomBorder(false, true);
GenerateFiles();
}
}
}
std::string ChessboardVisualizer::GenerateBoardField(char file, int rank, int height) {
ChessPiecePosition* position = new ChessPiecePosition(file, rank);
if (height == 1 && !CHESSBOARD->IsEmptyField(position)) {
ChessPiece* piece = CHESSBOARD->GetChessPiece(position);
return std::string(3, ' ') + piece->GetUnicode() + std::string(3, ' ');
}
return std::string(7, ' ');
}
void ChessboardVisualizer::GenerateFiles() {
std::string temp;
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp += (std::string(4, ' '));
}
temp += (std::string(3, ' ') + std::string(1, file) + std::string(3, ' '));
if (file == 'H') {
temp += " ";
}
}
display_vector.push_back({temp});
}
// board[2] bis board[25] Feld des Schachbretts
// in vectoren von 2 bis 25 index von 2 bis 9
void ChessboardVisualizer::DisplayElement() {
size_t size;
std::string temp;
for (int row = 0; row < display_vector.size(); ++row) {
for (int column = 0; column < display_vector[row].size(); ++column) {
if (row >= 2 && row <= 25 && column >= 2 && column <= 9) {
bool isSecondRowOfField = (row % 3 == 2);
bool isBlackWhite = (column % 2 == row % 2);
if ((row - 1) % 3 == 0) { // Change after 3 rows
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
} else {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
}
} else {
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
} else {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
}
}
}
std::cout << display_vector[row][column];
this->SetConsoleColor(DEFAULT, DEFAULT);
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
}
/*void ChessboardVisualizer::GenerateDisplayVector() {
std::string temp;
size_t size;
for (auto& row : draw_vector) {
if (row.size() > 1) {
for (const auto& element : row) {
temp += element;
}
display_vector.push_back(FillStringToMaxLength(temp));
temp = "";
} else {
display_vector.push_back(FillStringToMaxLength(row[0]));
}
}
}
std::string ChessboardVisualizer::FillStringToMaxLength(std::string& str) {
size_t size = BaseVisualizer::CountVisibleCharacters(str);
return ((size == MAX_MENU_WIDTH)
? str
: str.append(std::string(MAX_MENU_WIDTH - size, ' ')));
}*/

View File

@@ -0,0 +1,32 @@
#ifndef CHESSBOARDVISUALIZER_HPP
#define CHESSBOARDVISUALIZER_HPP
#include "BaseVisualizer.hpp"
#include "../Chessboard/Chessboard.hpp"
#include "../Chesspieces/Chesspiece.hpp"
class ChessboardVisualizer : public BaseVisualizer {
private:
Chessboard* CHESSBOARD;
std::vector<std::vector<std::string>> draw_vector;
static size_t GetMaxBoardWidth();
void GenerateTopBottomBorder(bool top, bool single);
void GenerateElement() override;
void GeneratePlayers();
void GenerateChessboard();
void GenerateFiles();
std::string GenerateBoardField(char file, int rank, int height);
void GenerateDisplayVector();
std::string FillStringToMaxLength(std::string& str);
public:
ChessboardVisualizer(Chessboard* chessboard, size_t padding) : BaseVisualizer(ChessboardVisualizer::GetMaxBoardWidth(), padding), CHESSBOARD(chessboard) {
ChessboardVisualizer::GenerateElement();
};
void DisplayElement();
};
#endif //CHESSBOARDVISUALIZER_HPP

View File

@@ -0,0 +1,13 @@
#include "CommandMenuVisualizer.hpp"
void CommandMenuVisualizer::GenerateElement() {
BaseVisualizer::display_vector.push_back({"Commands"});
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, true, true);
for (const auto& content : menuContent) {
BaseVisualizer::GenerateBoxMenuLine(MAX_MENU_WIDTH, content, true, PADDING);
}
BaseVisualizer::GenerateBoxSeperator(MAX_MENU_WIDTH, true);
std::string str_temp = ((CHESSBOARD->GetCurrentPlayer()->GetColor() == ChessPieceColor::White) ? "White" : "Black");
BaseVisualizer::GenerateBoxMenuLine(MAX_MENU_WIDTH, "Move [" + str_temp + "] : " + "\x1B[s", true, true);
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, false, true);
}

View File

@@ -0,0 +1,30 @@
#ifndef COMMANDMENUVISUALIZER_HPP
#define COMMANDMENUVISUALIZER_HPP
#include "BaseVisualizer.hpp"
#include "../Chessboard/Chessboard.hpp"
class CommandMenuVisualizer : public BaseVisualizer {
private:
inline static const std::vector<std::string> menuContent = {
"To execute command: $<command_no>",
"",
"1 - Instructions",
"2 - Save",
"3 - Exit",
"",
"8 - Resign",
"9 - Draw"
};
Chessboard* CHESSBOARD;
void GenerateElement() override;
public:
CommandMenuVisualizer(Chessboard* chessboard, size_t padding) : BaseVisualizer(CommandMenuVisualizer::FindMaxLength(menuContent), padding), CHESSBOARD(chessboard) {
CommandMenuVisualizer::GenerateElement();
}
};
#endif //COMMANDMENUVISUALIZER_HPP

View File

@@ -0,0 +1,16 @@
#include "HistorieVisualizer.hpp"
void HistorieVisualizer::GenerateElement() {
BaseVisualizer::display_vector.push_back({"Historie"});
BaseVisualizer::GenerateTableTopBottom(MAX_MENU_WIDTH, true, true);
BaseVisualizer::GenerateTableLine(MAX_MENU_WIDTH, {HistorieVisualizer::PLAYER1, HistorieVisualizer::PLAYER2}, true);
BaseVisualizer::BaseVisualizer::GenerateTableSeperator(MAX_MENU_WIDTH, true);
// ToDo: History einlesen und anzeigen lassenF
for (size_t i = 0; i < 5; i++) {
BaseVisualizer::GenerateTableLine(MAX_MENU_WIDTH, {"", ""}, true);
}
BaseVisualizer::GenerateTableTopBottom(MAX_MENU_WIDTH, false, true);
}

View File

@@ -0,0 +1,28 @@
#ifndef HISTORIEVISUALIZER_HPP
#define HISTORIEVISUALIZER_HPP
#include "BaseVisualizer.hpp"
#include "../Chessboard/Chessboard.hpp"
class HistorieVisualizer : public BaseVisualizer {
private:
const std::string PLAYER1;
const std::string PLAYER2;
std::vector<std::vector<std::string>> histories;
Chessboard* CHESSBOARD;
void GenerateElement() override;
public:
HistorieVisualizer(Chessboard* chessbord,const size_t menuWidth, const size_t padding) :
BaseVisualizer(menuWidth, padding), histories(5, std::vector<std::string>(2, "")),
CHESSBOARD(chessbord),
PLAYER1(chessbord->GetPlayer(ChessPieceColor::White)->GetName()),
PLAYER2(chessbord->GetPlayer(ChessPieceColor::Black)->GetName())
{
HistorieVisualizer::GenerateElement();
};
};
#endif //HISTORIEVISUALIZER_HPP

View File

@@ -0,0 +1,13 @@
#include "InstructionsVisualizer.hpp"
void InstructionsVisualizer::GenerateElement() {
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, true, false);
BaseVisualizer::AddEmptyLines(5, MAX_MENU_WIDTH, false);
for (const auto& content : menuContent) {
BaseVisualizer::GenerateBoxMenuLine(MAX_MENU_WIDTH, content, false, PADDING);
}
BaseVisualizer::AddEmptyLines(2, MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateBoxMenuLine(MAX_MENU_WIDTH, "Enter any key to return to menu: \x1B[s", false, PADDING);
BaseVisualizer::AddEmptyLines(5, MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, false, false);
}

View File

@@ -0,0 +1,19 @@
#ifndef INSTRUCTIONSVISUALIZER_HPP
#define INSTRUCTIONSVISUALIZER_HPP
#include "BaseVisualizer.hpp"
class InstructionsVisualizer : public BaseVisualizer {
private:
inline static const std::vector<std::string> menuContent = {
"Hier kommt noch eine Anleitung"
};
void GenerateElement() override;
public:
InstructionsVisualizer() : BaseVisualizer(60, 4) {
InstructionsVisualizer::GenerateElement();
};
};
#endif //INSTRUCTIONSVISUALIZER_HPP

View File

@@ -0,0 +1,103 @@
#include "PlayingViewVisualizer.hpp"
#include "ChessboardVisualizer.hpp"
#include "HistorieVisualizer.hpp"
#include "CommandMenuVisualizer.hpp"
void PlayingViewVisualizer::GenerateElement() {
position_vector.clear();
display_vector.clear();
ChessboardVisualizer chessboardVisualizer = ChessboardVisualizer(CHESSBOARD, 2);
HistorieVisualizer historieVisualizer = HistorieVisualizer(CHESSBOARD, 32, 2);
CommandMenuVisualizer cmdMenuVisualizer = CommandMenuVisualizer(CHESSBOARD, 2);
GeneratePositionVector(chessboardVisualizer.GetDisplayVector(), historieVisualizer.GetDisplayVector(), cmdMenuVisualizer.GetDisplayVector());
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, true, false);
BaseVisualizer::GenerateEmptyLine(MAX_MENU_WIDTH, false);
std::vector<std::string> temp;
//((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE) + std::string(padding, ' ')
for (const auto& row : position_vector) {
display_vector.push_back(row);
}
BaseVisualizer::GenerateEmptyLine(MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, false, false);
//size_t maxWidth = BaseVisualizer::FindMaxLength(chessboardVisualizer.display_vector);
}
void PlayingViewVisualizer::GeneratePositionVector(
std::vector<std::vector<std::string>>* chessboard_display_vector,
std::vector<std::vector<std::string>>* historie_display_vector,
std::vector<std::vector<std::string>>* command_menu_display_vector)
{
for (size_t i = 0; i < chessboard_display_vector->size(); ++i) {
size_t test;
std::vector<std::string> temp;
temp.push_back({BaseVisualizer::VERTICAL_LINE + " "});
if (i == 0) {
const std::string& first_element = chessboard_display_vector->at(i).at(0);
temp.push_back(first_element);
temp.push_back(std::string(62-BaseVisualizer::CountVisibleCharacters(first_element), ' '));
} else if (chessboard_display_vector->at(i).size() > 1 && i != 0) {
temp.insert(temp.end(), chessboard_display_vector->at(i).begin(), chessboard_display_vector->at(i).end());
} else {
temp.push_back(chessboard_display_vector->at(i).at(0));
}
if (i < historie_display_vector->size()) {
temp.push_back(std::string(DISTANCE_BETWEEN_ELEMENTS, ' '));
temp.push_back(historie_display_vector->at(i)[0]);
} else if (i-3-historie_display_vector->size() < command_menu_display_vector->size()) {
temp.push_back(std::string(DISTANCE_BETWEEN_ELEMENTS, ' '));
temp.push_back(command_menu_display_vector->at(i-3-historie_display_vector->size())[0]);
} else{
temp.push_back({"", ""});
}
BaseVisualizer::GetSumAllCharsFromVector(temp);
temp.push_back(std::string(MAX_MENU_WIDTH-BaseVisualizer::GetSumAllCharsFromVector(temp)-1, ' ') + BaseVisualizer::VERTICAL_LINE);
position_vector.push_back(temp);
}
}
void PlayingViewVisualizer::DisplayElement() {
PlayingViewVisualizer::GenerateElement();
size_t size;
std::string temp;
for (int row = 0; row < display_vector.size(); ++row) {
for (int column = 0; column < display_vector[row].size(); ++column) {
if (row >= 4 && row <= 27 && column >= 3 && column <= 10) {
bool isSecondRowOfField = ((row-1) % 3 == 2);
bool isBlackWhite = ((column-1) % 2 == (row-1) % 2);
if ((row - 1) % 3 == 0) { // Change after 3 rows
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
} else {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
}
} else {
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
} else {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
}
}
}
std::cout << display_vector[row][column];
this->SetConsoleColor(DEFAULT, DEFAULT);
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
}
std::string PlayingViewVisualizer::GetMove() {
return move;
}

View File

@@ -0,0 +1,29 @@
#ifndef PLAYINGVIEWVISUALIZER_HPP
#define PLAYINGVIEWVISUALIZER_HPP
#include "BaseVisualizer.hpp"
#include "../Chessboard/Chessboard.hpp"
class PlayingViewVisualizer : public BaseVisualizer {
private:
const size_t DISTANCE_BETWEEN_ELEMENTS;
Chessboard* CHESSBOARD;
std::string move;
std::vector<std::vector<std::string>> position_vector;
void GenerateElement();
void GeneratePositionVector(
std::vector<std::vector<std::string>>* chessboard_display_vector,
std::vector<std::vector<std::string>>* historie_display_vector,
std::vector<std::vector<std::string>>* command_menu_display_vector);
public:
PlayingViewVisualizer(Chessboard* chessboard, size_t padding, size_t distance) :
BaseVisualizer(110, padding), CHESSBOARD(chessboard), DISTANCE_BETWEEN_ELEMENTS(distance) {}
void DisplayElement();
std::string GetMove();
};
#endif //PLAYINGVIEWVISUALIZER_HPP

View File

@@ -0,0 +1,66 @@
#include "StartMenuVisualizer.hpp"
void StartMenuVisualizer::GenerateElement() {
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, true, false);
BaseVisualizer::AddEmptyLines(2, MAX_MENU_WIDTH, false);
for (const auto& str : StartMenuVisualizer::ACSII_ART_TURBO_SCHACH) {
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, str, false);
}
BaseVisualizer::AddEmptyLines(2, MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, "Welcome to TurboSchach!", false);
BaseVisualizer::AddEmptyLines(2, MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, "Please select one of the menu options:", false);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, "\x1B[s", false);
BaseVisualizer::AddEmptyLines(1, MAX_MENU_WIDTH, false);
// ToDo: Attribute zum direkten setzen des Types der Außenbegrenzung -> Allgemein in BaseVisualizer auch?
// ToDo: Überarbeiten -> Extra Methode um Menus im Menu zu generieren
BaseVisualizer::GenerateTopBottomBorder(24, true, true);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, BaseVisualizer::display_vector[BaseVisualizer::display_vector.size()-1][0], false);
BaseVisualizer::display_vector.erase(BaseVisualizer::display_vector.begin() + (BaseVisualizer::display_vector.size() - 2));
for (const auto& str : StartMenuVisualizer::MENU_OPTIONS) {
BaseVisualizer::GenerateBoxMenuLine(24, str, true, 1);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, BaseVisualizer::display_vector[BaseVisualizer::display_vector.size()-1][0], false);
BaseVisualizer::display_vector.erase(BaseVisualizer::display_vector.begin() + (BaseVisualizer::display_vector.size() - 2));
}
BaseVisualizer::GenerateTopBottomBorder(24, false, true);
BaseVisualizer::GenerateCenteredString(MAX_MENU_WIDTH, BaseVisualizer::display_vector[BaseVisualizer::display_vector.size()-1][0], false);
BaseVisualizer::display_vector.erase(BaseVisualizer::display_vector.begin() + (BaseVisualizer::display_vector.size() - 2));
BaseVisualizer::AddEmptyLines(2, MAX_MENU_WIDTH, false);
BaseVisualizer::GenerateTopBottomBorder(MAX_MENU_WIDTH, false, false);
}
int StartMenuVisualizer::GetSelectedOption() {
return selectedOption;
}
void StartMenuVisualizer::SetSelectedOption(int optionSelect) {
selectedOption = selectedOption;
};
void StartMenuVisualizer::DisplayElement1() {
BaseVisualizer::ClearTerminal();
int temp;
for (const auto& row : display_vector) {
for (const auto& cell : row) {
std::cout << cell;
}
std::cout << std::endl;
}
std::cout << "\x1B[u";
std::cin >> selectedOption;
}

View File

@@ -0,0 +1,39 @@
#ifndef STARTMENUVISUALIZER_H
#define STARTMENUVISUALIZER_H
#include "BaseVisualizer.hpp"
class StartMenuVisualizer : public BaseVisualizer {
private:
inline static const std::vector<std::string> ACSII_ART_TURBO_SCHACH = {
"████████╗██╗░░░██╗██████╗░██████╗░░█████╗░░██████╗░█████╗░██╗░░██╗░█████╗░░█████╗░██╗░░██╗",
"╚══██╔══╝██║░░░██║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔══██╗██║░░██║██╔══██╗██╔══██╗██║░░██║",
"░░░██║░░░██║░░░██║██████╔╝██████╦╝██║░░██║╚█████╗░██║░░╚═╝███████║███████║██║░░╚═╝███████║",
"░░░██║░░░██║░░░██║██╔══██╗██╔══██╗██║░░██║░╚═══██╗██║░░██╗██╔══██║██╔══██║██║░░██╗██╔══██║",
"░░░██║░░░╚██████╔╝██║░░██║██████╦╝╚█████╔╝██████╔╝╚█████╔╝██║░░██║██║░░██║╚█████╔╝██║░░██║",
"░░░╚═╝░░░░╚═════╝░╚═╝░░╚═╝╚═════╝░░╚════╝░╚═════╝░░╚════╝░╚═╝░░╚═╝╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝"
};
inline static const std::vector<std::string> MENU_OPTIONS = {
"1 - New Game",
"2 - Load Save",
"3 - Instructions",
"",
"0 - Exit"
};
int selectedOption = -1;
void GenerateElement() override;
public:
StartMenuVisualizer(size_t padding) : BaseVisualizer(BaseVisualizer::CountVisibleCharacters(StartMenuVisualizer::ACSII_ART_TURBO_SCHACH[0]), padding) {
StartMenuVisualizer::GenerateElement();
}
int GetSelectedOption();
void SetSelectedOption(int selectedOption);
void DisplayElement1();
};
#endif //STARTMENUVISUALIZER_H

178
main.cpp
View File

@@ -0,0 +1,178 @@
#include <windows.h>
#include "Player/Player.hpp"
#include "ChessPieces/ChessPiece.hpp"
#include "Chessboard/Chessboard.hpp"
#include "Chessboard/ChessboardVisualizerText.hpp"
#include "Chessboard/ChessboardVisualizerGraphic.hpp"
#include "Visualizer/BaseVisualizer.hpp"
#include "Visualizer/StartMenuVisualizer.hpp"
#include "Visualizer/HistorieVisualizer.hpp"
#include "Visualizer/ChessboardVisualizer.hpp"
#include "Visualizer/CommandMenuVisualizer.hpp"
#include "Visualizer/PlayingViewVisualizer.hpp"
#include "Visualizer/InstructionsVisualizer.hpp"
#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <locale>
void HandleThirdOption() {
BaseVisualizer::ClearTerminal();
InstructionsVisualizer instructions = InstructionsVisualizer();
instructions.DisplayElement();
std::cout << "\x1B[u";
std::cin;
}
void HandleCommandOptions(const std::string& command) {
if (command == "1") {
HandleThirdOption();
} else if (command == "2") {
// ToDo: Save implementieren
} else if (command == "3") {
// ToDo: Exit implementieren -> Möglichkeit noch zu speichern oder einfach speichern?
} else if (command == "8") {
// ToDo: Spiel beenden -> Gewinn an anderen gegeben
} else if (command == "9") {
// ToDo: Draw anbieten -> Anfrage mit Annahme/Ablehnen an anderen Spieler schicken
}
}
std::string ExtractAfterDollar(const std::string& userInput) {
// Überprüfen, ob der String mit '$' beginnt
if (!userInput.empty() && userInput[0] == '$') {
return userInput.substr(1); // Rückgabe des Teils nach '$'
}
return ""; // Leerer String, wenn kein '$' am Anfang
}
void HandleFirstOption() {
BaseVisualizer::ClearTerminal();
Player* playerA = new Player("Player 1");
Player* playerB = new Player("Player 2");
Chessboard chessboard = Chessboard();
chessboard.SetPlayers(playerA, playerB);
chessboard.InitializeStartBoard();
PlayingViewVisualizer playView = PlayingViewVisualizer(&chessboard, 4, 12);
while (chessboard.IsCheckmate() == false) {
std::string input;
playView.DisplayElement();
std::cout << "\x1B[u";
std::cin >> input;
std::string command = ExtractAfterDollar(input);
while (command != "3") {
if (command != "") {
HandleCommandOptions(command);
break;
} else {
//ToDo: Valide Züge annehmen
chessboard.MoveChessPiece(input);
}
// ToDo: Nicht valide Eingabe melden -> Unterscheidung was falsch?
}
break;
}
std::cout << "Game is over! - " << chessboard.GetOpponentPlayer()->GetName() << " has won the game!" << std::endl;
}
void HandleSecondOption() {}
int main() {
SetConsoleOutputCP(CP_UTF8);
BaseVisualizer::ClearTerminal();
StartMenuVisualizer startMenu = StartMenuVisualizer(3);
int choice = -1;
while (startMenu.GetSelectedOption() != 0) {
BaseVisualizer::ClearTerminal();
startMenu.DisplayElement1();
if (startMenu.GetSelectedOption() == 1) {
HandleFirstOption();
} else if (startMenu.GetSelectedOption() == 2) {
HandleSecondOption();
} else if (startMenu.GetSelectedOption() == 3) {
HandleThirdOption();
}
}
//CommandMenuVisualizer commandMenu = CommandMenuVisualizer(2);
//commandMenu.DisplayElement();
//HistorieVisualizer historie = HistorieVisualizer(15, 2, "Player 1", "Player 2");
//historie.DisplayElement();
/*if () {
Player* playerA = new Player("Player 1");
Player* playerB = new Player("Player 2");
Chessboard chessboard = Chessboard();
chessboard.SetPlayers(playerA, playerB);
chessboard.InitializeStartBoard();
// Jetzt kann man Moves machen. Nach jedem Move müssen die ChessPieces aktualisiert werden.
chessboard.UpdateChessPieces();
//ChessboardVisualizerText* visualizer = new ChessboardVisualizerText();
ChessboardVisualizer visualizer(&chessboard, 2);
}*/
//}
/*std::cout << "Spieler A: ";
std::string namePlayerA;
getline(std::cin, namePlayerA);
std::cout << "Spieler B: ";
std::string namePlayerB;
getline(std::cin, namePlayerB);
Player* playerA = new Player("1");
Player* playerB = new Player("2");*/
return 0;
}
/**
std::vector<std::vector<ChessPiece>> chessmatrix;
Chessboard chessboard;
if (argc == 2) {
std::cout << "Spielstand" << std::endl;
chessboard.loadBoard(std::string(argv[1]));
} else {
chessboard.setBoard(chessboard.getStartBoard());
}
//chessboard.init();
chessboard.draw();
while (true) {
std::string move;
std::cout << "Move [" << (chessboard.getTurnOrder() ? "white" : "black") << "]: ";
std::cin >> move;
chessboard.move(move);
chessboard.saveBoard();
}
*/

34
saveStats.json Normal file
View File

@@ -0,0 +1,34 @@
{
"saves": [
[
[],
[],
[],
[],
[],
[],
[],
[]
],
[
[],
[],
[],
[],
[],
[],
[],
[]
],
[
[],
[],
[],
[],
[],
[],
[],
[]
]
]
}