拆分多个文件。

This commit is contained in:
unlockable
2023-03-01 17:06:16 +08:00
parent b86ed536c4
commit 6070fbfd57
5 changed files with 439 additions and 395 deletions

View File

@@ -0,0 +1,274 @@
#include "fiveInARow.h"
// clang-format off
char ChessBoard::emptyBoardString[3][29][4] = {
{
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
},
{
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
},
{
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
}
};
// clang-format on
char ChessBoard::toHex(int num) {
if (num < 10) {
return num + '0';
}
else {
return num - 10 + 'A';
}
}
void ChessBoard::makeTitle() {
std::cout << " ";
for (int i = 1; i <= this->size; i++) {
std::cout << " " << this->toHex(i);
}
std::cout << std::endl;
}
ChessBoard::ChessBoard() {
this->chessCount = 0;
this->size = 15;
}
ChessBoard::~ChessBoard() {
}
void ChessBoard::show() {
this->makeTitle();
for (int i = 0; i < 15; i++) {
std::cout << this->toHex(i + 1) << ' ';
char(*emptyLineRef)[29][4] = NULL;
if (i == 0) {
emptyLineRef = &emptyBoardString[0];
}
else if (i == 14) {
emptyLineRef = &emptyBoardString[2];
}
else {
emptyLineRef = &emptyBoardString[1];
}
int j = 0;
for (; j < 15; j++) {
if (this->ChessPieces[i][j].isEmpty()) {
std::cout << (*emptyLineRef)[j * 2];
}
else {
std::cout << this->ChessPieces[i][j].show();
}
if (j < 14) {
std::cout << (*emptyLineRef)[j * 2 + 1];
}
}
std::cout << std::endl;
}
}
bool ChessBoard::setChess(bool color, int row, int column) {
if (row > 14 || row < 0 || column > 14 || column < 0) {
std::cout << "Out of border!" << std::endl;
return false;
}
if (!this->ChessPieces[row][column].isEmpty()) {
std::cout << "There already is a chess piece!" << std::endl;
return false;
}
this->ChessPieces[row][column].setColor(color);
this->chessCount++;
return true;
}
void ChessBoard::reset() {
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
this->ChessPieces[i][j].reset();
}
}
this->chessCount = 0;
}
bool ChessBoard::isFull() {
return this->chessCount == 15 * 15;
}
bool ChessBoard::checkWinner(int row, int column, bool color) {
int connetCount = 0;
int i = row, j = column;
int possiblePieces[9][2] = {0};
// vertical
for (; i < 15; i++) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
}
for (i = row - 1; i >= 0; i--) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
}
if (connetCount >= 5) {
for (connetCount--; connetCount >= 0; connetCount--) {
this->ChessPieces[possiblePieces[connetCount][0]]
[possiblePieces[connetCount][1]]
.setWin();
}
return true;
}
// horizontal
i = row;
j = column;
connetCount = 0;
for (; j < 15; j++) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
}
for (j = column - 1; j >= 0; j--) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
}
if (connetCount >= 5) {
for (connetCount--; connetCount >= 0; connetCount--) {
this->ChessPieces[possiblePieces[connetCount][0]]
[possiblePieces[connetCount][1]]
.setWin();
}
return true;
}
// left-up
i = row;
j = column;
connetCount = 0;
while (i < 15 && j < 15) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
i++;
j++;
}
i = row - 1;
j = column - 1;
while (i >= 0 && j >= 0) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
i--;
j--;
}
if (connetCount >= 5) {
for (connetCount--; connetCount >= 0; connetCount--) {
this->ChessPieces[possiblePieces[connetCount][0]]
[possiblePieces[connetCount][1]]
.setWin();
}
return true;
}
// right-up
i = row;
j = column;
connetCount = 0;
while (i >= 0 && j < 15) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
i--;
j++;
}
i = row + 1;
j = column - 1;
while (i < 15 && j >= 0) {
if (this->ChessPieces[i][j].isEmpty()) {
break;
}
if (this->ChessPieces[i][j].getColor() == color) {
possiblePieces[connetCount][0] = i;
possiblePieces[connetCount][1] = j;
connetCount++;
}
else {
break;
}
i++;
j--;
}
if (connetCount >= 5) {
for (connetCount--; connetCount >= 0; connetCount--) {
this->ChessPieces[possiblePieces[connetCount][0]]
[possiblePieces[connetCount][1]]
.setWin();
}
return true;
}
return false;
}