с++ крестики нолики баг

335
27 мая 2017, 18:48

Здравствуйте я новенький в мире программирования c++. вот решил устроится стажером в фирму. Первое тестовое задание было сделать игру крестики нолики. Человек против компьютера чтоб компьютер всегда выигрывал. Вот взял шаблон с видео-уроков Дениса Маркова. Но что то не то не могу найти баг после 3-4 ходов прога проста не реагирует. Пожалуйста помогите.

personvscomp.h

#include<iostream>
#include<time.h>
#include<random>
#include<conio.h>
int n;
using namespace std;
class personvscomp {
protected:
    char name1[30];
    char name2[30]="computer";
    char table[3][3];
    bool step;
public:
    void instruction()
    {
        cout << "\t\t*** Крестики-Нолики***\n\n";
        cout << "Правила:\n";
        cout << "Играют 2 игрока на поле 3x3\n";
        cout << "Побеждает тот кто составит выйграшную комбинацию\n";
        cout << "Вид поля:\n\n";
        int l = 0;
        for (int i(0); i < 3; i++)
        {
            for (int j(0); j < 3; j++)
            {
                cout << "| " << l + 1 << ' ';
                table[i][j] = char(49 + l);
                l++;
            }
            cout << '|';
            cout << endl;
        }
        cout << "\nДля хода нажмите цифру ячейки поля\n";
        cout << "Для начала игры нажмите клавишу:";
        _getch();
        system("cls");
    }
    bool input()
    {
        for (int i(0); i < 3; i++)
        {
            for (int j(0); j < 3; j++)
            {
                cout << "| " << table[i][j] << ' ';
            }
            cout << '|';
            cout << endl;
        }
        cout << endl;
        if (step)
            cout << "Ходит " << name1 << " : ";
        else cout << "Ходит " << name2 << " : ";
        if (step)
        {
            cin >> n;
        }
        else
        {
            while (!step)
            {
                /*Нападение*/
             if     (((table[1][0] == 'O') && (table[2][0] == 'O')) || ((table[0][2] == 'O') && (table[0][1] == 'O')) || ((table[2][2] == 'O') && (table[1][1] == 'O')))
            {
                if ((table[0][0] != 'X') && (table[0][0] != 'O'))
                {
                    n = 1;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[0][2] == 'O')) || ((table[1][1] == 'O') && (table[2][1] == 'O')))
            {
                if ((table[0][1] != 'X') && (table[0][1] != 'O'))
                {
                    n = 2;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[0][1] == 'O')) || ((table[1][2] == 'O') && (table[2][2] == 'O')) || ((table[1][1] == 'O') && (table[2][0] == 'O')))
            {
                if ((table[0][2] != 'X') && (table[0][2] != 'O'))
                {
                    n = 3;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[2][0] == 'O')) || ((table[1][1] == 'O') && (table[1][2] == 'O')))
            {
                if ((table[1][0] != 'X') && (table[1][0] != 'O'))
                {
                    n = 4;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[2][2] == 'O')) || ((table[2][0] == 'O') && (table[0][2] == 'O')) || (((table[1][2] == 'O') && (table[1][0] == 'O')) || ((table[0][1] == 'O') && (table[2][1] == 'O'))))
            {
                if ((table[1][1] != 'X') && (table[1][1] != 'O'))
                {
                    n = 5;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[1][0] == 'O') && (table[1][1] == 'O')) || ((table[0][2] == 'O') && (table[2][2] == 'O')))
            {
                if ((table[1][2] != 'X') && (table[1][2] != 'O'))
                {
                    n = 6;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[1][0] == 'O')) || ((table[2][1] == 'O') && (table[2][2] == 'O')) || ((table[0][2] == 'O') && (table[1][1] == 'O')))
            {
                if ((table[2][0] != 'X') && (table[2][0] != 'O'))
                {
                    n = 7;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][1] == 'O') && (table[1][1] == 'O')) || ((table[2][0] == 'O') && (table[2][2] == 'O')))
            {
                if ((table[2][1] != 'X') && (table[2][1] != 'O'))
                {
                    n = 8;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[2][0] == 'O') && (table[2][1] == 'O')) || ((table[0][2] == 'O') && (table[1][2] == 'O')) || ((table[0][0] == 'O') && (table[1][1] == 'O')))
            {
                if ((table[2][2] != 'X') && (table[2][2] != 'O'))
                {
                    n = 9;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[0][2] == 'O')) && ((table[0][0] == 'O') && (table[2][0] == 'O')))
            {
                if (((table[0][1] != 'O') && (table[0][1] != 'X')) && ((table[1][0] != 'O') && (table[1][0] != 'X')))
                {
                    int array1[2] = { 2,4 };
                    int l;
                    l = rand() % 2;
                    n = array1[l - 1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[0][2] == 'O')) && ((table[0][2] == 'O') && (table[2][2] == 'O')))
            {
                if (((table[0][1] != 'O') && (table[0][1] != 'X')) && ((table[1][2] != 'O') && (table[1][2] != 'X')))
                {
                    int array1[2] = { 2,6 };
                    int l;
                    l = rand() % 2;
                    n = array1[l - 1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'O') && (table[2][0] == 'O')) && ((table[2][2] == 'O') && (table[2][0] == 'O')))
            {
                if (((table[2][1] != 'O') && (table[2][1] != 'X')) && ((table[1][0] != 'O') && (table[1][0] != 'X')))
                {
                    int array1[2] = { 8,4 };
                    int l;
                    l = rand() % 2;
                    n = array1[l - 1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[2][0] == 'O') && (table[2][2] == 'O')) && ((table[2][0] == 'O') && (table[0][0] == 'O')))
            {
                if (((table[2][1] != 'O') && (table[2][1] != 'X')) && ((table[1][2] != 'O') && (table[1][2] != 'X')))
                {
                    int array1[2] = { 8,6 };
                    int l;
                    l = rand() % 2;
                    n = array1[l - 1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            /*Нападение*/
            /*Оборона*/
            else if (((table[0][2] == 'X') && (table[0][1] == 'X')) || ((table[2][0] == 'X') && (table[1][0] == 'X')) || ((table[2][2] == 'X') && (table[1][1] == 'X')))
                {
                    if ((table[0][0] != 'X') && (table[0][0] != 'O'))
                    {
                        n = 1;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            else if (((table[0][0] == 'X') && (table[0][2] == 'X')) || ((table[1][1] == 'X') && (table[2][1] == 'X')))
                {
                    if ((table[0][1] != 'X') && (table[0][1] != 'O'))
                    {
                        n = 2;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            else if (((table[0][0] == 'X') && (table[0][1] == 'X')) || ((table[1][2] == 'X') && (table[2][2] == 'X')) || ((table[1][1] == 'X') && (table[2][0] == 'X')))
                {
                    if ((table[0][2] != 'X') && (table[0][2] != 'O'))
                    {
                        n = 3;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            else if (((table[0][0] == 'X') && (table[2][0] == 'X')) || ((table[1][1] == 'X') && (table[1][2] == 'X')))
                {
                    if ((table[1][0] != 'X') && (table[1][0] != 'O'))
                    {
                        n = 4;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            else if (((table[0][0] == 'X') && (table[2][2] == 'X')) || ((table[0][2] == 'X') && (table[2][0] == 'X')) || ((table[0][1] == 'X') && (table[2][1] == 'X')) || ((table[1][2] == 'X') && (table[1][0] == 'X')))
            {
                if ((table[1][1] != 'X')&& (table[1][1] != 'O'))
                {
                    n = 5;
                    break;
                }
                else
                {
                    continue;
                }
            }   
            else if (((table[0][2] == 'X') && (table[2][2] == 'X')) || ((table[1][0] == 'X') && (table[1][1] == 'X')))
                {
                if ((table[1][2] != 'X') && (table[1][2] != 'O'))
                {
                    n = 6;
                    break;
                }
                else
                {
                    continue;
                }
                }
            else if (((table[0][0] == 'X') && (table[1][0] == 'X')) || ((table[1][1] == 'X') && (table[0][2] == 'X')) || ((table[2][1] == 'X') && (table[2][2] == 'X')))
                {
                    if ((table[2][0] != 'X') && (table[2][0] != 'O'))
                    {
                        n = 7;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            else if (((table[2][0] == 'X') && (table[2][2] == 'X')) || ((table[1][1] == 'X') && (table[0][1] == 'X')))
                {
                if ((table[2][1] != 'X') && (table[2][1] != 'O'))
                {
                    n = 8;
                    break;
                }
                else
                {
                    continue;
                }
                }
            else if (((table[0][0] == 'X') && (table[1][1] == 'X')) || ((table[0][2] == 'X') && (table[1][2] == 'X')) || ((table[2][0] == 'X') && (table[2][1] == 'X')))
            {
                if ((table[2][2] != 'X') && (table[2][2] != 'O'))
                {
                    n = 9;
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'X') && (table[0][2] == 'X')) && ((table[0][0] == 'X') && (table[2][0] == 'X')))
            {
                if  (((table[0][1] != 'O') && (table[0][1] != 'X')) && ((table[1][0] != 'O') && (table[1][0] != 'X')))
                {
                    int array1[2] = { 2,4 };
                    int l;
                    l = rand() % 2;
                    n = array1[l-1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'X') && (table[0][2] == 'X')) && ((table[0][2] == 'X') && (table[2][2] == 'X')))
            {
                if  (((table[0][1] != 'O') && (table[0][1] != 'X')) && ((table[1][2] != 'O') && (table[1][2] != 'X')))
                {
                    int array1[2] = { 2,6 };
                    int l;
                    l = rand() % 2;
                    n = array1[l-1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[0][0] == 'X') && (table[2][0] == 'X')) && ((table[2][2] == 'X') && (table[2][0] == 'X')))
            {
                if (((table[2][1] != 'O') && (table[2][1] != 'X')) && ((table[1][0] != 'O') && (table[1][0] != 'X')))
                {
                    int array1[2] = { 8,4 };
                    int l;
                    l = rand() % 2;
                    n = array1[l-1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if (((table[2][0] == 'X') && (table[2][2] == 'X')) && ((table[2][0] == 'X') && (table[0][0] == 'X')))
            {
                if (((table[2][1] != 'O') && (table[2][1] != 'X')) && ((table[1][2] != 'O') && (table[1][2] != 'X')))
                {
                    int array1[2] = { 8,6 };
                    int l;
                    l = rand() % 2;
                    n = array1[l-1];
                    break;
                }
                else
                {
                    continue;
                }
            }
            else {
                srand(time(NULL));
                int array[9] = { 1,2,3,4,5,6,7,8,9 };
                int k;
                k = rand() % 9;
                n = array[k-1];
                break;
            }
            }
        }
            if (n < 1 || n > 9)
            return false;
        int i, j;
        if (n % 3 == 0)
        {
            i = n / 3 - 1;
            j = 2;
        }
        else
        {
            j = n % 3 - 1;
            i = n / 3;
        }
        if (table[i][j] == 'O' || table[i][j] == 'X')
            return false;
        if (step)
        {
            table[i][j] = 'X';
            step = false;
        }
        else { table[i][j] = 'O'; step = true; }
        return true;
    }
    bool win()
    {
        for (int i(0); i < 3; i++)
            if ((table[i][0] == table[i][1]) && (table[i][0] == table[i][2]))
                return true;
            else
                if ((table[0][i] == table[1][i]) && (table[0][i] == table[2][i]))
                    return true;
                else if ((table[0][0] == table[1][1] && table[0][0] == table[2][2]) || (table[0][2] == table[1][1] && table[0][2] == table[2][0]))
                    return true;

        return false;
    }
    int main1() {
        //int i = 0;
        cout << "Введите имя игрока: ";
        cin >> name1;

        /*srand(time(NULL));
        if (rand() & 1)//
            step = true;
        else step = false;
        */
        while (!win())
        {
            //if (i == 9)
            //{
                //cout << "Ничья!!";
                //_getch();
                //return -1;
        //  }
            system("cls");
            if (!input())
            {
                /*cout << "Вы ввели неверные данные повторите!" << endl;
                _getch();*/
                continue;
            }
        //  i++;
        }
        system("cls");
        if (step)
            cout << "Победил " << name2 << endl;
        else cout << "Победил " << name1 << endl;

        _getch();
    }
};

source.cpp

#include <iostream>
#include <conio.h>
#include<random>
#include<time.h>
#include"person vs person.h"
#include"comp vs comp.h"
#include"person vs comp.h"
using namespace std;
void greetings() 
{
    system("Color B2");
    cout << "***Добро пожаловать в игру крестики нолики***" << endl;
    cout << "***Выберите режим игры и нажмите клавишу ENTER***" << endl;
    cout << "1 Против Компьютера\n";
    cout << "2 Против Человека \n";
    cout << "3 Компьютер против компьютера: ";
}

int main()
{
    setlocale(LC_ALL, "russian");
    int n;
    greetings();
    cin >> n;
    system("cls");
    while (true)
    {
        if (n < 1 || n>3)
        {
            cout << "Вы ввели неправильный номер пожалуйста повторите: ";
            cin >> n;
        }
        else
            break;
    }
    if (n == 1)
    {
        personvscomp *ptr = new personvscomp;
        ptr->instruction();
        ptr->main1();
    }
    /*else if (n == 2)
    {
        personvsperson *dp = new personvsperson;
        system("cls");
        dp->instruction();
        _getch();
        system("cls");
        dp->main1();
        _getch();
    }
    else if (n == 3)
    {
        compvscomp *ptr = new compvscomp;
        ptr->instruction();
        ptr->main1();
    }*/
    else
    {
        cerr << "Произошла ошибка!!!";
    }
    _getch();
    return 0;
}
READ ALSO
Firebird API создание базы программно

Firebird API создание базы программно

Я использую Firebird API для программного создания базыДля создания базы я использую код из этого поста

251
Angularjs checkbox фильтр, как сделать кнопку сброса выборок

Angularjs checkbox фильтр, как сделать кнопку сброса выборок

Всем приветПомогите решить проблему

313
повторно запускается таймер

повторно запускается таймер

добрый деньнакрутил не очень понимая, но нужно срочно

290
Как писать юнит тесты для функций манипулирующих DOM?

Как писать юнит тесты для функций манипулирующих DOM?

Или это только на глаз проверяется?

246