summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoursoir <chat@joursoir.net>2021-02-18 12:24:56 +0000
committerJoursoir <chat@joursoir.net>2021-02-18 12:24:56 +0000
commit84b689ec06623c32b634b9824336b20e6fe38677 (patch)
treea1ab209b3c5d8896ef2a62fcd6528ae93b45838b
parentb89e003d7e1ed6997d2a5a9da45b5305b3bb9b05 (diff)
downloadlp-gomoku-84b689ec06623c32b634b9824336b20e6fe38677.tar.gz
lp-gomoku-84b689ec06623c32b634b9824336b20e6fe38677.tar.bz2
lp-gomoku-84b689ec06623c32b634b9824336b20e6fe38677.zip
fix bug in rows/cols and improve diags scaning
-rw-r--r--GameField.cpp70
-rw-r--r--GameField.hpp2
2 files changed, 54 insertions, 18 deletions
diff --git a/GameField.cpp b/GameField.cpp
index acc742b..75485b4 100644
--- a/GameField.cpp
+++ b/GameField.cpp
@@ -53,7 +53,7 @@ void GameField::UpdateState(int y, int x)
return;
if((state = ScanColsAround(y, x)) != G_NONE)
return;
- if((state = ScanDiags()) != G_NONE)
+ if((state = ScanDiagsAround(y, x)) != G_NONE)
return;
}
@@ -61,7 +61,7 @@ int GameField::ScanRowsAround(int y, int x)
{
int i, n;
int player = field[y][x];
- // ray left
+ // ray to left
for(i = x, n = 0; i >= 0; i--) {
if(player == field[y][i]) {
n++;
@@ -71,8 +71,8 @@ int GameField::ScanRowsAround(int y, int x)
else break;
}
- // ray right
- for(i = x; i < rows; i++) {
+ // ray to right
+ for(i = x, n -= 1; i < rows; i++) {
if(player == field[y][i]) {
n++;
if(n == win_length)
@@ -88,7 +88,7 @@ int GameField::ScanColsAround(int y, int x)
{
int i, n;
int player = field[y][x];
- // ray up
+ // ray to up
for(i = y, n = 0; i >= 0; i--) {
if(player == field[i][x]) {
n++;
@@ -98,8 +98,8 @@ int GameField::ScanColsAround(int y, int x)
else break;
}
- // ray down
- for(i = y; i < cols; i++) {
+ // ray to down
+ for(i = y, n -= 1; i < cols; i++) {
if(player == field[i][x]) {
n++;
if(n == win_length)
@@ -111,15 +111,51 @@ int GameField::ScanColsAround(int y, int x)
return G_NONE;
}
-/* This version is a dummy */
-int GameField::ScanDiags()
+int GameField::ScanDiagsAround(int y, int x)
{
- if(field[0][0] == field[1][1] && field[1][1] == field[2][2] &&
- field[1][1] != G_EMPTY)
- return field[1][1];
- else if(field[0][2] == field[1][1] && field[1][1] == field[2][0] &&
- field[1][1] != G_EMPTY)
- return field[1][1];
-
- return 0;
+ int i, j, n;
+ int player = field[y][x];
+ // ray to left up corner
+ for(i = x, j = y, n = 0; i >= 0 && j >= 0; i--, j--) {
+ if(player == field[j][i]) {
+ n++;
+ if(n == win_length)
+ return player;
+ }
+ else break;
+ }
+
+ // ray to right down corner
+ for(i = x, j = y, n -= 1; i < rows && j < cols; i++, j++) {
+ if(player == field[j][i]) {
+ n++;
+ if(n == win_length)
+ return player;
+ }
+ else break;
+ }
+
+ /* change the diagonal */
+
+ // ray to right up corner
+ for(i = x, j = y, n = 0; i < rows && j >= 0; i++, j--) {
+ if(player == field[j][i]) {
+ n++;
+ if(n == win_length)
+ return player;
+ }
+ else break;
+ }
+
+ // ray to left down cornet
+ for(i = x, j = y, n -= 1; i >= 0 && j < cols; i--, j++) {
+ if(player == field[j][i]) {
+ n++;
+ if(n == win_length)
+ return player;
+ }
+ else break;
+ }
+
+ return G_NONE;
}
diff --git a/GameField.hpp b/GameField.hpp
index 9975caa..4c6d61d 100644
--- a/GameField.hpp
+++ b/GameField.hpp
@@ -31,7 +31,7 @@ private:
void UpdateState(int y, int x);
int ScanRowsAround(int y, int x);
int ScanColsAround(int y, int x);
- int ScanDiags();
+ int ScanDiagsAround(int y, int x);
};
#endif /* LPG_GAMEFIELD_H */