Skip to content

Commit 229cdbe

Browse files
committed
Server: Win7::CheckersMatch: Detect game over
Implements a very simple method for partially validating moves and detecting game over: On every move of a player piece by 2 on X and Y, decrement from opponent's piece counter. If the piece counter of a player reaches 0, set game over state.
1 parent 8411343 commit 229cdbe

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

InternetGamesServer/Win7/CheckersMatch.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
#include "PlayerSocket.hpp"
44
#include "../Util.hpp"
55

6+
#define CheckersInvertRole(role) (role == 0 ? 1 : 0)
7+
68
namespace Win7 {
79

810
CheckersMatch::CheckersMatch(PlayerSocket& player) :
911
Match(player),
12+
m_playerCheckersLeft({ 12, 12 }),
1013
m_drawOfferedBy(-1)
1114
{}
1215

@@ -57,6 +60,21 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
5760
if (targetY < 0 || targetY >= 8)
5861
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"Move\": Invalid target Y value!");
5962

63+
const int xDiff = abs(sourceX - targetX);
64+
const int yDiff = abs(sourceY - targetY);
65+
if (xDiff != 1 || yDiff != 1)
66+
{
67+
if (xDiff == 2 && yDiff == 2) // Captured an opponent piece
68+
{
69+
if (--m_playerCheckersLeft[CheckersInvertRole(caller.m_role)] <= 0)
70+
m_state = STATE_GAMEOVER;
71+
}
72+
else
73+
{
74+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"Move\": Invalid move!");
75+
}
76+
}
77+
6078
XMLPrinter sanitizedMoveMessage;
6179
sanitizedMoveMessage.OpenElement("Message");
6280
sanitizedMoveMessage.OpenElement("Move");
@@ -93,7 +111,7 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
93111
if (!strcmp(elMethod->GetText(), "OfferDraw")) // Player has offered a draw to their opponent
94112
{
95113
if (m_drawOfferedBy >= 0)
96-
return {};
114+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"GameManagement\" -> \"OfferDraw\": Draw already offered!");
97115

98116
m_drawOfferedBy = caller.m_role;
99117
return {
@@ -102,8 +120,10 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
102120
}
103121
if (!strcmp(elMethod->GetText(), "DrawAccept")) // Player has accepted a draw request by the opponent
104122
{
105-
if (m_drawOfferedBy < 0 || m_drawOfferedBy == caller.m_role)
106-
return {};
123+
if (m_drawOfferedBy < 0)
124+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"GameManagement\" -> \"DrawAccept\": No draw was offered!");
125+
if (m_drawOfferedBy == caller.m_role)
126+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"GameManagement\" -> \"DrawAccept\": Draw was offered by this player!");
107127

108128
m_drawOfferedBy = -1;
109129
m_state = STATE_GAMEOVER;
@@ -115,8 +135,10 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
115135
}
116136
if (!strcmp(elMethod->GetText(), "DrawReject")) // Player has rejected a draw request by their opponent
117137
{
118-
if (m_drawOfferedBy < 0 || m_drawOfferedBy == caller.m_role)
119-
return {};
138+
if (m_drawOfferedBy < 0)
139+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"GameManagement\" -> \"DrawReject\": No draw was offered!");
140+
if (m_drawOfferedBy == caller.m_role)
141+
throw std::runtime_error("CheckersMatch::ProcessEvent(): \"GameManagement\" -> \"DrawReject\": Draw was offered by this player!");
120142

121143
m_drawOfferedBy = -1;
122144
return {

InternetGamesServer/Win7/CheckersMatch.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include "Match.hpp"
44

5+
#include <array>
6+
57
namespace Win7 {
68

79
class CheckersMatch final : public Match
@@ -19,6 +21,8 @@ class CheckersMatch final : public Match
1921
std::vector<QueuedEvent> ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSocket& caller) override;
2022

2123
private:
24+
std::array<int8_t, 2> m_playerCheckersLeft;
25+
2226
int m_drawOfferedBy;
2327

2428
private:

0 commit comments

Comments
 (0)