Как избавиться от глобальных переменных?

Имеется шахматная программа. В ней используются глобальные переменные. Как можно от них избавиться? Пробовал объявить строки через 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)
→ Ссылка