Как избавиться от глобальных переменных?
Имеется шахматная программа. В ней используются глобальные переменные. Как можно от них избавиться? Пробовал объявить строки через enum и поместить это всё в main, а потом передавать их в функции, но ничего не вышло. Подскажите как исправить?
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
string board[8][8];
std::string
BLANK = " ",
PAWN_WHITE = "pw", ROOK_WHITE = "Rw", KNIGHT_WHITE = "Nw", BISHOP_WHITE = "Bw", QUEEN_WHITE = "Qw", KING_WHITE = "Kw",
PAWN_BLACK = "pb", ROOK_BLACK = "Rb", KNIGHT_BLACK = "Nb", BISHOP_BLACK = "Bb", QUEEN_BLACK = "Qb", KING_BLACK = "kb";
void InitializingBoard()
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (i < 2) board[i][j] = PAWN_WHITE;
else if (i > 5) board[i][j] = PAWN_BLACK;
else board[i][j] = BLANK;
}
}
board[0][0] = ROOK_WHITE;
board[0][1] = KNIGHT_WHITE;
board[0][2] = BISHOP_WHITE;
board[0][3] = QUEEN_WHITE;
board[0][4] = KING_WHITE;
board[0][5] = BISHOP_WHITE;
board[0][6] = KNIGHT_WHITE;
board[0][7] = ROOK_WHITE;
board[7][0] = ROOK_BLACK;
board[7][1] = KNIGHT_BLACK;
board[7][2] = BISHOP_BLACK;
board[7][3] = QUEEN_BLACK;
board[7][4] = KING_BLACK;
board[7][5] = BISHOP_BLACK;
board[7][6] = KNIGHT_BLACK;
board[7][7] = ROOK_BLACK;
cout << endl;
}
void BoardStatus()
{
char num = 'a';
for (int i = 7; i >= 0; --i)
{
cout << "\t" << i + 1;
for (int j = 0; j < 8; j++)
{
cout << "|" << board[i][j] << "|";
}
cout << endl;
}
cout << "\t";
for (int i = 0; i < 8; i++)
{
cout << " " << num;
++num;
}
cout << endl << endl;
}
void FigureMove(int hod)
{
if (hod % 2 == 1)
{
cout << endl << "Чёрные ходят: ";
}
else
{
cout << endl << "Белые ходят: ";
}
}
void ShessHod()
{
string from, to;
cin >> from >> to;
int c0 = from[0] - 'a', r0 = from[1] - '1';
int c1 = to[0] - 'a', r1 = to[1] - '1';
if (board[r1][c1] != BLANK)
{
board[r1][c1] = BLANK;
}
if (board[r1][c1] > board[7][7])
{
cout << "ОШИБКА: Выход за пределы доски. Ход передан следующему игроку!" << endl;
}
else
{
swap(board[r0][c0], board[r1][c1]);
}
cout << endl;
}
int main()
{
setlocale(0, "");
cout << "ВНИМАНИЕ! При выходе за пределы доски, ход будет передан другому игроку! Фигура останется на исходной позиции!" << endl << endl;
cout << "Ход вводится в формате:e2 e4" << endl;
InitializingBoard();
int hod = 0;
BoardStatus();
do
{
FigureMove(hod);
ShessHod();
BoardStatus();
++hod;
}
while (hod < 500);
system("PAUSE");
return 0;
}
Ответы (1 шт):
Автор решения: nevilad
→ Ссылка
Раз вопрос помечен тегом с++, то можно перенести все глобальные переменные в класс, а его вынести в отдельный заголовочный файл:
class Chess
{
std::string board[8][8];
const std::string BLANK = " ";
const std::string PAWN_WHITE = "pw";
const std::string ROOK_WHITE = "Rw";
const std::string KNIGHT_WHITE = "Nw";
const std::string BISHOP_WHITE = "Bw";
const std::string QUEEN_WHITE = "Qw";
const std::string KING_WHITE = "Kw";
const std::string PAWN_BLACK = "pb";
const std::string ROOK_BLACK = "Rb";
const std::string KNIGHT_BLACK = "Nb";
const std::string BISHOP_BLACK = "Bb";
const std::string QUEEN_BLACK = "Qb";
const std::string KING_BLACK = "kb";
public:
Chess();
void BoardStatus();
void FigureMove(int hod);
void ShessHod();
};
В cpp-файле будет это (код InitializingBoard перенесен в конструктор):
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include "заголовочный файл класса Chess"
using namespace std;
Chess::Chess()
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (i < 2) board[i][j] = PAWN_WHITE;
else if (i > 5) board[i][j] = PAWN_BLACK;
else board[i][j] = BLANK;
}
}
board[0][0] = ROOK_WHITE;
board[0][1] = KNIGHT_WHITE;
board[0][2] = BISHOP_WHITE;
board[0][3] = QUEEN_WHITE;
board[0][4] = KING_WHITE;
board[0][5] = BISHOP_WHITE;
board[0][6] = KNIGHT_WHITE;
board[0][7] = ROOK_WHITE;
board[7][0] = ROOK_BLACK;
board[7][1] = KNIGHT_BLACK;
board[7][2] = BISHOP_BLACK;
board[7][3] = QUEEN_BLACK;
board[7][4] = KING_BLACK;
board[7][5] = BISHOP_BLACK;
board[7][6] = KNIGHT_BLACK;
board[7][7] = ROOK_BLACK;
cout << endl;
}
void Chess::BoardStatus()
{
char num = 'a';
for (int i = 7; i >= 0; --i)
{
cout << "\t" << i + 1;
for (int j = 0; j < 8; j++)
{
cout << "|" << board[i][j] << "|";
}
cout << endl;
}
cout << "\t";
for (int i = 0; i < 8; i++)
{
cout << " " << num;
++num;
}
cout << endl << endl;
}
void Chess::FigureMove(int hod)
{
if (hod % 2 == 1)
{
cout << endl << "Чёрные ходят: ";
}
else
{
cout << endl << "Белые ходят: ";
}
}
void Chess::ShessHod()
{
string from, to;
cin >> from >> to;
int c0 = from[0] - 'a', r0 = from[1] - '1';
int c1 = to[0] - 'a', r1 = to[1] - '1';
if (board[r1][c1] != BLANK)
{
board[r1][c1] = BLANK;
}
if (board[r1][c1] > board[7][7])
{
cout << "ОШИБКА: Выход за пределы доски. Ход передан следующему игроку!" << endl;
}
else
{
swap(board[r0][c0], board[r1][c1]);
}
cout << endl;
}
int main()
{
setlocale(0, "");
cout << "ВНИМАНИЕ! При выходе за пределы доски, ход будет передан другому игроку! Фигура останется на исходной позиции!" << endl << endl;
cout << "Ход вводится в формате:e2 e4" << endl;
Chess game;
int hod = 0;
game.BoardStatus();
do
{
game.FigureMove(hod);
game.ShessHod();
game.BoardStatus();
++hod;
} while (hod < 500);
system("PAUSE");
return 0;
}
Кстати для проверки четности числа, можно проверять не остаток его деления на 2:
if (hod % 2 == 1)
а младший бит:
if (hod & 1)