From 68b141fc022a00260aece882a6e67fb12858a992 Mon Sep 17 00:00:00 2001
From: Joker2770 <1214220480@qq.com>
Date: Wed, 21 Jun 2023 11:53:01 +0800
Subject: [PATCH] fix: add win shapes of caro.
 https://github.com/Joker2770/qpiskvork/commit/40fccfdc68f3fd01435ac8b79cd4d9460097892f#r118737310

---
 src/caro.cpp | 10 +++++++---
 src/caro.h   | 17 ++++++++++++++++-
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/caro.cpp b/src/caro.cpp
index 4ceebf5..e0156f0 100644
--- a/src/caro.cpp
+++ b/src/caro.cpp
@@ -48,12 +48,14 @@ bool Caro::findShap(Board *board,  const pair<int, int>& p_drt)
         else
             return false;
 
-        while (!board->isPosOutOfBoard(p_drt_idx))
+        while (true)
         {
             if (STONECOLOR::BLACK == board->getIdxStoneColor(p_drt_idx))
                 vColor.push_back(1);
             else if (STONECOLOR::WHITE == board->getIdxStoneColor(p_drt_idx))
                 vColor.push_back(2);
+            else if (board->isPosOutOfBoard(p_drt_idx))
+                vColor.push_back(3);
             else
                 vColor.push_back(0);
 
@@ -66,12 +68,14 @@ bool Caro::findShap(Board *board,  const pair<int, int>& p_drt)
         reverse(vColor.begin(), vColor.end());
         p_drt_idx.first = p_idx.first - p_drt.first;
         p_drt_idx.second = p_idx.second - p_drt.second;
-        while (!board->isPosOutOfBoard(p_drt_idx))
+        while (true)
         {
             if (STONECOLOR::BLACK == board->getIdxStoneColor(p_drt_idx))
                 vColor.push_back(1);
             else if (STONECOLOR::WHITE == board->getIdxStoneColor(p_drt_idx))
                 vColor.push_back(2);
+            else if (board->isPosOutOfBoard(p_drt_idx))
+                vColor.push_back(3);
             else
                 vColor.push_back(0);
 
@@ -91,7 +95,7 @@ bool Caro::findShap(Board *board,  const pair<int, int>& p_drt)
         {
             for (size_t j = 0; j <= vColor.size() - 7; ++j)
             {
-                for (size_t i = 0; i < 20; ++i)
+                for (size_t i = 0; i < 34; ++i)
                 {
                     if (((WIN_SHAPES[i][0]) == (vColor[j])) &&
                         ((WIN_SHAPES[i][1]) == (vColor[j + 1])) &&
diff --git a/src/caro.h b/src/caro.h
index 9e16802..95d9a4a 100644
--- a/src/caro.h
+++ b/src/caro.h
@@ -32,6 +32,7 @@
 #include<iostream>
 using namespace std;
 
+// 0 - empty, 1 - black, 2 - white, 3 - wall
 const int WIN_SHAPES[][7] = {
     {1, 1, 1, 1, 1, 0, 0},
     {0, 1, 1, 1, 1, 1, 0},
@@ -43,6 +44,13 @@ const int WIN_SHAPES[][7] = {
     {1, 1, 1, 1, 1, 1, 1},
     {0, 1, 1, 1, 1, 1, 1},
     {1, 1, 1, 1, 1, 1, 0},
+    {3, 1, 1, 1, 1, 1, 0},
+    {3, 1, 1, 1, 1, 1, 1},
+    {3, 1, 1, 1, 1, 1, 2},
+    {3, 1, 1, 1, 1, 1, 3},
+    {0, 1, 1, 1, 1, 1, 3},
+    {1, 1, 1, 1, 1, 1, 3},
+    {2, 1, 1, 1, 1, 1, 3},
     {2, 2, 2, 2, 2, 0, 0},
     {0, 2, 2, 2, 2, 2, 0},
     {0, 0, 2, 2, 2, 2, 2},
@@ -52,7 +60,14 @@ const int WIN_SHAPES[][7] = {
     {2, 2, 2, 2, 2, 2, 1},
     {2, 2, 2, 2, 2, 2, 2},
     {0, 2, 2, 2, 2, 2, 2},
-    {2, 2, 2, 2, 2, 2, 0}};
+    {2, 2, 2, 2, 2, 2, 0},
+    {3, 2, 2, 2, 2, 2, 0},
+    {3, 2, 2, 2, 2, 2, 1},
+    {3, 2, 2, 2, 2, 2, 2},
+    {3, 2, 2, 2, 2, 2, 3},
+    {0, 2, 2, 2, 2, 2, 3},
+    {1, 2, 2, 2, 2, 2, 3},
+    {2, 2, 2, 2, 2, 2, 3}};
 
 class Caro final : public rules
 {