Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //board.cpp
- #include<iostream>
- #include<iomanip>
- #include"board.h"
- using namespace std;
- Board::Board()
- {
- char c = (char)49;
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- b[i][j] = c++;
- }
- char Board::GetCell(int x, int y)
- {
- return b[x][y];
- }
- bool Board::makeMove(char x, int sign)
- {
- bool res = true;
- char simvol;
- if (sign == 0)
- simvol = 'x';
- else
- simvol = 'o';
- switch (x)
- {
- case('1'):if (b[0][0] != 'x' && b[0][0] != 'o') { b[0][0] = simvol; break; }
- else { res = sms(); break; }
- case('2'):if (b[0][1] != 'x' && b[0][1] != 'o') { b[0][1] = simvol; break; }
- else { res = sms(); break; }
- case('3'):if (b[0][2] != 'x' && b[0][2] != 'o') { b[0][2] = simvol; break; }
- else { res = sms(); break; }
- case('4'):if (b[1][0] != 'x' && b[1][0] != 'o') { b[1][0] = simvol; break; }
- else { res = sms(); break; }
- case('5'):if (b[1][1] != 'x' && b[1][1] != 'o') { b[1][1] = simvol; break; }
- else { res = sms(); break; }
- case('6'):if (b[1][2] != 'x' && b[1][2] != 'o') { b[1][2] = simvol; break; }
- else { res = sms(); break; }
- case('7'):if (b[2][0] != 'x' && b[2][0] != 'o') { b[2][0] = simvol; break; }
- else { res = sms(); break; }
- case('8'):if (b[2][1] != 'x' && b[2][1] != 'o') { b[2][1] = simvol; break; }
- else { res = sms(); break; }
- case('9'):if (b[2][2] != 'x' && b[2][2] != 'o') { b[2][2] = simvol; break; }
- else { res = sms(); break; }
- default:cout << "Error!\nНеверный ввод!Повторите!\n"; res = false;
- }
- return res;
- }
- bool Board::WhoWin(int sign)
- {
- ++counter; //00-01-02
- if ((b[0][0] == b[1][1] && b[0][0] == b[2][2]) || (b[0][2] == b[1][1] && b[0][2] == b[2][0])) //10-11-12
- {
- if (sign == 0) //20-21-22
- {
- cout << "\nВыграл Крестик!\nпо диагоноли!\n"; return true;
- }
- else
- {
- cout << "\nВыграл Нолик!\nпо диагоноли!\n"; return true;
- }
- }
- if ((b[0][0] == b[0][1] && b[0][0] == b[0][2]) || (b[1][0] == b[1][1] && b[1][0] == b[1][2]) || (b[2][0] == b[2][1] && b[2][0] == b[2][2]))
- {
- if (sign == 0)
- {
- cout << "\nВыграл Крестик!\nпо горизонтали!\n"; return true;
- }
- else
- {
- cout << "\nВыграл Нолик!\nпо горизонтали!\n"; return true;
- }
- }
- if ((b[0][0] == b[1][0] && b[0][0] == b[2][0]) || (b[0][1] == b[1][1] && b[0][1] == b[2][1]) || (b[0][2] == b[1][2] && b[0][2] == b[2][2]))
- {
- if (sign == 0)
- {
- cout << "\nВыграл Крестик!\nпо вертикали!\n"; return true;
- }
- else
- {
- cout << "\nВыграл Нолик!\nпо вертикали!\n"; return true;
- }
- }
- if (counter == 9) {
- cout << "\nНичья!\n"; return true;
- }
- return false;
- }
- bool Board::sms()
- {
- std::string str="Error! Kлетка занята\n";
- return false;
- }
- int Board::counter = 0;
- //BoardView.cpp
- #include<iostream>
- #include<iomanip>
- #include"BoardView.h"
- using namespace std;
- View::View(Board* b)
- {
- boar = b;
- }
- void View::show()
- {
- for (int i = 0; i < 3; i++) {
- for (int j = 0; j < 3; j++)
- cout << setw(3) << boar->GetCell(i, j);
- cout << endl;
- }
- }
- void View::StartGame()
- {
- char x;
- bool ui, game = false;
- star_show();
- while (game != true)
- {
- if (sign == 0) //конструкция которая пропускается если НОЛИК не походил правильно
- {
- cout << "\nХодит Крестик!\n" << "Введите цифру:";
- cin >> x;
- ui = boar->makeMove(x, sign);
- if (ui == false)
- continue;
- system("cls");
- show();
- game = boar->WhoWin(sign);
- if (game == true)
- break;
- ++sign;
- }
- cout << "\nХодит Нолик!\n" << "Введите цифру:";
- cin >> x;
- ui = boar->makeMove(x, sign);
- if (ui == false)
- continue;
- system("cls");
- show();
- game = boar->WhoWin(sign);
- if (game == true)
- break;
- --sign;
- }
- }
- void View::star_show()
- {
- cout << "Крестики-нолики на двоих!" << endl;
- cout << "Введите 1 чтобы увидеть особенности игры,\n";
- char y;
- cin >> y;
- if (y == '1' || y == 'y') {
- cout << "Это известная игра, с обычными\n"
- "правилами! Но кое что нужно знать!\n";
- cout << "Вот поле:\n";
- show();
- cout << "Ячейки пронумерованные цифрами,\n"
- "вводите соответствующую цыфру,\n"
- "и там появиться ваш знак,\n"
- "и так вы разберитесь кто крестик,\n"
- "а кто нолик!\nУдачи!\n\n";
- }
- else
- show();
- }
- int View::sign = 0;
- //main.cpp
- #include<iostream>
- #include<windows.h>
- #include"board.h"
- #include"BoardView.h"
- using namespace std;
- int main()
- {
- setlocale(LC_ALL, "Rus");
- Board b;
- View h(&b);
- h.StartGame();
- Sleep(2000);
- system("pause");
- return 0;
- }
- //CFigure.h
- #pragma once
- #include <iostream>
- using namespace std;
- class CFigure
- {
- public:
- virtual ~CFigure() = default;
- virtual std::ostream& Show(std::ostream& out) const = 0;
- };
- class CCross : public CFigure
- {
- public:
- virtual std::ostream& Show(std::ostream& out) const
- {
- return out << 'X';
- }
- };
- class CZero : public CFigure
- {
- public:
- virtual std::ostream& Show(std::ostream& out) const
- {
- return out << 'O';
- }
- };
- #pragma once
- #include "CFigure.h"
- //board.h
- //Как программа расположенна в памяти,кто ходит,
- //кто выграл,что в каждой ячейки.
- class Board
- {
- private:
- CFigure *b[3][3];
- static int counter;
- public:
- Board();
- bool makeMove(char x, int sign);//метод для занесения хода игрока.
- bool WhoWin(int x); //Метод для выявления результата игры
- char GetCell(int x, int y); //метод для вывода конкретной ячейки игрового поля.
- bool sms(); //вспомогательный метод для вывода инфы про ошибку
- };
- #pragma once
- //BoardView.h
- #include"board.h"
- //графический интерфейс,ввод данных.
- class View
- {
- private:
- Board* boar;
- static int sign; //счетчик для определения кто ходит 'X' или 'O'
- void show(); //выводит доску
- void star_show(); //начальное приветствие
- public:
- View(Board* b);
- void StartGame(); //главный метод для взаимодействия с играками!
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement