Пятница, 18.07.2025, 10:00
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
.:: Меню ::.
.:: Категории каталога ::.
Разное [5]
Различные темы по программированию
Пакет SWT [4]
Практикуемся в написании оконных приложений на Java
Среды разработки, компиляторы и т.п [3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
Java [8]
Объектно-ориентированные соображения.
Си++ [19]
Коротко и ясно
Ассемблер [6]
Машинные коды, побитно :)
Форма входа
.:: Поиск ::.
.:: Дополнительно ::.
    Хостинг от Loqo.ru
             .:: Коментируем ::.
Главная » Статьи » Текстовый материал » Си++

Консольные крестики - нолики.
Может пример покажется для начинающих программистов сложным, но это только кажется.
Разобрав программу по кусочкам, вы это поймёте.
Code

#include <iostream> // Copyright 2007 Xoax

void main() {
  char cSquare1('1');
  char cSquare2('2');
  char cSquare3('3');
  char cSquare4('4');
  char cSquare5('5');
  char cSquare6('6');
  char cSquare7('7');
  char cSquare8('8');
  char cSquare9('9');
  int iPlayerTurn(1);
  bool bGameOver(true);

  // Main game loop
  do {
  // Print board
  std::cout << cSquare1 << "|" << cSquare2 << "|" << cSquare3 << std::endl;
  std::cout << "-+-+-"<< std::endl;
  std::cout << cSquare4 << "|" << cSquare5 << "|" << cSquare6 << std::endl;
  std::cout << "-+-+-"<< std::endl;
  std::cout << cSquare7 << "|" << cSquare8 << "|" << cSquare9 << std::endl;

  // Set player marker: Player 1 uses X and Player 2 uses O
  char cPlayerMark;
  if (iPlayerTurn == 1)  
  {
  cPlayerMark = 'X';
  }  
  else  
  {
  cPlayerMark = 'O';
  }
   
  // Prompt the player for a move
  std::cout << "Player" << iPlayerTurn << "'s move:" << std::endl;
  bool bValidMove;
  // Loop until we get a valid move
  do {
  char cNextMove;
  std::cin >> cNextMove;
  bValidMove = true;

  // Check for a valid move
  if (cNextMove == '1' && cSquare1 == '1')  
  {
  cSquare1 = cPlayerMark;
  }  
  else  
  if (cNextMove == '2' && cSquare2 == '2')  
  {
  cSquare2 = cPlayerMark;
  }  
  else  
  if (cNextMove == '3' && cSquare3 == '3')  
  {
  cSquare3 = cPlayerMark;
  }  
  else  
  if (cNextMove == '4' && cSquare4 == '4')  
  {
  cSquare4 = cPlayerMark;
  }  
  else  
  if (cNextMove == '5' && cSquare5 == '5')  
  {
  cSquare5 = cPlayerMark;
  }  
  else  
  if (cNextMove == '6' && cSquare6 == '6')  
  {
  cSquare6 = cPlayerMark;
  }  
  else  
  if (cNextMove == '7' && cSquare7 == '7')  
  {
  cSquare7 = cPlayerMark;
  }  
  else  
  if (cNextMove == '8' && cSquare8 == '8')  
  {
  cSquare8 = cPlayerMark;
  }  
  else  
  if (cNextMove == '9' && cSquare9 == '9')  
  {
  cSquare9 = cPlayerMark;
  }  
  else  
  {
  std::cout << "Invalid Move. Try again." << std::endl;
  bValidMove = false;
  }
  } while (!bValidMove);
  //------------------------------------------------------
  bGameOver = false;
  bool bWinGame = true;
  // Check for end of game conditions
  if (cSquare1 != '1')  
  {
  if (cSquare2 == cSquare1 && cSquare3 == cSquare1)  
  {
  bGameOver = true;
  }
  if (cSquare4 == cSquare1 && cSquare7 == cSquare1)  
  {
  bGameOver = true;
  }
  }
  if (cSquare5 != '5') {
  if (cSquare1 == cSquare5 && cSquare9 == cSquare5) {
  bGameOver = true;
  }
  if (cSquare2 == cSquare5 && cSquare8 == cSquare5) {
  bGameOver = true;
  }
  if (cSquare4 == cSquare5 && cSquare6 == cSquare5) {
  bGameOver = true;
  }
  if (cSquare3 == cSquare5 && cSquare7 == cSquare5) {
  bGameOver = true;
  }
  }
  if (cSquare9 != '9') {
  if (cSquare3 == cSquare9 && cSquare6 == cSquare9) {
  bGameOver = true;
  }
  if (cSquare7 == cSquare9 && cSquare8 == cSquare9) {
  bGameOver = true;
  }
  }
  // Need to check the board full (no-win condition)
  if (cSquare1 != '1' && cSquare2 != '2' && cSquare3 != '3' &&
  cSquare4 != '4' && cSquare5 != '5' && cSquare6 != '6' &&
  cSquare7 != '7' && cSquare8 != '8' && cSquare9 != '9' && !bGameOver)
  {
  bGameOver = true;
  bWinGame = false;
  }

  if (bGameOver) {
  if (bWinGame) {
  std::cout << "Player" << iPlayerTurn << " wins!" << std::endl;
  }
  // Print ending board
  std::cout << cSquare1 << "|" << cSquare2 << "|" << cSquare3 << std::endl;
  std::cout << "-+-+-"<< std::endl;
  std::cout << cSquare4 << "|" << cSquare5 << "|" << cSquare6 << std::endl;
  std::cout << "-+-+-"<< std::endl;
  std::cout << cSquare7 << "|" << cSquare8 << "|" << cSquare9 << std::endl;

  std::cout << "Game Over!" << std::endl;
  std::cout << "Play again (y/n)?" << std::endl;
  char cPlayAgain;
  std::cin >> cPlayAgain;

  if (cPlayAgain == 'y')  
  {
  bGameOver = false;
  // Clear the board
  cSquare1 = '1';
  cSquare2 = '2';
  cSquare3 = '3';
  cSquare4 = '4';
  cSquare5 = '5';
  cSquare6 = '6';
  cSquare7 = '7';
  cSquare8 = '8';
  cSquare9 = '9';
  }
  iPlayerTurn = 1;
  } else {
  // Alternate player turns
  if (iPlayerTurn == 1) {
  iPlayerTurn = 2;
  } else {
  iPlayerTurn = 1;
  }
  }
  } while (!bGameOver);
}

// Author: Michael Hall
//
// This program is available for download through our website Xoax.net with no guarantees.
// Disclaimer: While we have made every effort to ensure the quality of our content, all risks associated
// with downloading or using this solution, project and code are assumed by the user of this material.
//
// Copyright 2007 Xoax - For personal use only, not for distribution

В конце кода, автор запетрушил небольшую лицензию, но мы продавать его супер игру не будем, так что всё нормально.

Используем iostream для ввода/вывода.
Создаём 9 переменных типа char, модно инициализируем их.
Эти символы, от 1-го до 9-и в дальнейшем мы будем заменять на крестики и нулики. (По словарю Ожегова, нуль или ноль, одинаково правильно !)

iPlayerTurn - определяет ход игрока (первого или второго), в данном варианте, играют два человека, поочерёдно вводящие номера клеток.
По умолчанию ходит первый игрок.

bGameOver - флаг окончания игры, по умолчанию, игра окончена.

Далее идёт игровой цикл.
Выводим клетки с номерами.
Вводим переменную cPlayerMark, которая в зависимости от номера игрока, будет принимать значение 'X' или 'O'.
Выводим номер игрока, который должен сделать ход.
Далее цикл проверки валидности (правильности) хода, для этого вводим две переменные bValidMove и cNextMove.
Цикл продолжается до того как, bValidMove примет значение - ложь.
В cNextMove хранится номер клетки, куда хотим сделать ход.
Если клетка указана не верно, то будет выведено на экран сообщение об ошибке и предложение попробовать снова.

Далее идёт логические конструкции, после которых определяется конец игры.
В конце игры выводится номер выигравшего игрока, игровое поле, сообщение о конце игры и предложение играть сначала.

Если игрок соглашается на повтор, игровое поле приводится в первоначальное состояние.
Вот, вкратце, всё.

Категория: Си++ | Добавил: C0demaker (23.05.2009) | Автор: Michael Hall
Просмотров: 3913 | Комментарии: 3 | Рейтинг: 2.0/1
Всего комментариев: 3
0  
3 MP   (28.05.2011 03:10) [Материал]
Как раз таки наоборот, микрософтовский компилятор позволяет писать всякую ерунду, противоречащую стандарту языка Си, типа void main(). Остальные компиляторы вынуждены поддерживать такой формат, чтобы обеспечить совместимость. А g++ гораздо строже относится к соблюдению стандарта языка, нежели микрософтовский компилятор.

0  
1 gb   (13.03.2011 23:58) [Материал]
Только надо "int main()", а не "void main"

0  
2 C0demaker   (18.03.2011 15:13) [Материал]
Некоторые компиляторы допускают конструкцию void main()
Программа написана не мной, поэтому предположу, что её компилировали g++ или подобным "не майкрософт" компилятором


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ant1 © 2025