Mecz kilku partii z wynikiem

Kółko i krzyżyk w konsoli krok po kroku - Podstawy C++ (C++)

Cała partia trafia do funkcji playGame: czyści planszę, gra ruchy z listy zakończonej -1 i zwraca wynik 'X', 'O' albo 'R' (remis). Partie meczu to wiersze tablicy dwuwymiarowej; wiersz games[g] można podać funkcji jak zwykłą tablicę. Liczniki zbierają wynik meczu.

#include <iostream>
using namespace std;

// plansza: 9 pol, numer pola = wiersz * 3 + kolumna, '.' = puste
char board[9] = {'.', '.', '.', '.', '.', '.', '.', '.', '.'};

// ruch na pole index; false, gdy pole jest zajete
bool play(int index, char player) {
  if (board[index] != '.') {
    cout << "Pole " << index << " zajete" << endl;
    return false;
  }
  board[index] = player;
  return true;
}

// osiem linii: trzy wiersze, trzy kolumny, dwie przekatne
int lines[8][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6},
                   {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};

// numer linii z trzema takimi samymi znakami albo -1
int winningLine() {
  for (int i = 0; i < 8; i++) {
    char a = board[lines[i][0]];
    if (a != '.' && a == board[lines[i][1]] && a == board[lines[i][2]]) {
      return i;
    }
  }
  return -1;
}

bool isFull() {
  for (int i = 0; i < 9; i++) {
    if (board[i] == '.') {
      return false;
    }
  }
  return true;
}

// pole zwycieskiej linii w nawiasach: [X]
void printBoard() {
  int line = winningLine();
  for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
      int cell = row * 3 + col;
      bool win = line != -1 && (lines[line][0] == cell || lines[line][1] == cell || lines[line][2] == cell);
      cout << (win ? "[" : " ") << board[cell] << (win ? "]" : " ");
      if (col < 2) {
        cout << "|";
      }
    }
    cout << endl;
    if (row < 2) {
      cout << "---+---+---" << endl;
    }
  }
}

void clearBoard() {
  for (int i = 0; i < 9; i++) {
    board[i] = '.';
  }
}

// cala partia z listy ruchow zakonczonej -1; wynik: 'X', 'O' albo 'R' (remis)
char playGame(int moves[]) {
  clearBoard();
  char player = 'X';
  for (int i = 0; moves[i] != -1; i++) {
    if (!play(moves[i], player)) {
      continue;
    }
    if (winningLine() != -1) {
      return player;
    }
    if (isFull()) {
      return 'R';
    }
    player = player == 'X' ? 'O' : 'X';
  }
  return 'R';
}

void printResult(char result) {
  if (result == 'R') {
    cout << "Remis" << endl;
  } else {
    cout << "Wygrywa " << result << endl;
  }
}

int main() {
  int games[3][10] = {{4, 0, 3, 6, 5, 8, 2, -1},
                      {0, 1, 2, 4, 3, 5, 7, 6, 8, -1},
                      {0, 4, 1, 2, 8, 6, -1}};
  int x = 0, o = 0, draws = 0;
  for (int g = 0; g < 3; g++) {
    char result = playGame(games[g]);
    cout << "Partia " << g + 1 << ": ";
    printResult(result);
    printBoard();
    if (result == 'X') {
      x++;
    } else if (result == 'O') {
      o++;
    } else {
      draws++;
    }
  }
  cout << "Wynik: X " << x << ", O " << o << ", remisy " << draws << endl;
  return 0;
}

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Podstawy C++·Zaloguj się, aby zapisać postęp na koncie.