Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
JohnBlack123
200 / 151 / 48
Регистрация: 09.12.2017
Сообщений: 474
1

Крестики-нолики: не определяется победа

11.12.2018, 11:10. Просмотров 178. Ответов 0

Здравствуйте. Пишу игру крестики нолики на С++. Столкнулся с проблемой, что победа по горизонтали не определяется, вот само условие if (arr[i * 3] == arr[i * 3 + 1] && arr[i * 3 + 1] == arr[i * 3 + 2]). Находится с другими вариантами победы в функции CheckSituation. При табуляции определил, что цикл, который сделан специально для этих проверок (опять же функция CheckSituation) почему-то не увеличивает i. Что делать? Помогите, пожалуйста, в код написал комментарии для простоты разбора.
Спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// -- -- -- -- -- -- -- Подключаем библиотеки
#include "stdafx.h"
#include "time.h"
#include <iostream>
// -- -- -- -- -- -- --
using namespace std;
// -- -- -- -- -- -- --
 
void PrintArray(int cnt, char *arr) // Функция, которая выводит номера ячеек и текущую ситуацию
{
    cout << " Numbers of cells: " << endl;
    for (int i = 0; i < 9; i++)
    {
        cout << " | -" << i << "-";
        if ((i + 1) % 3 == 0) cout << " | " << endl;
    }
    cout << " Current Situation: " << endl;
    for (int i = 0; i < 9; i++)
    {
        cout << " | -" << arr[i] << "-";
        if ((i + 1) % 3 == 0) cout << " | " << endl;
    }
}
 
bool WhoseTurn() { // Определяет, кто будет ходить первым
    return rand() % 2;
}
 
char CheckSituation(char *arr) // Функция с условиями победы (о ней я и говорил)
{
    for (int i = 0; i < 3; i++) // тот самый цикл, который не хочет увеличивать i. (она все время равна 0 ! )
        if (arr[i * 3] == arr[i * 3 + 1] && arr[i * 3 + 1] == arr[i * 3 + 2]) // победа по горизонталях 
        { 
            return arr[i];
        }
        else if (arr[i] == arr[i + 3] && arr[i + 3] == arr[i + 6]) { // победа по вертикалях
            return arr[i];
        }
        else if ((arr[0] == arr[4] && arr[4] == arr[8]) || (arr[2] == arr[4] && arr[4] == arr[6])) { // победа по двум //диагоналям
            return arr[i];
        }
                else{
        return '-'; // если ничья
                }
}
 
void main()
{
    // -- -- -- -- -- -- --
    srand(time(0)); // чтобы rand() возвращал разные значения
    // -- -- -- -- -- -- --
    const int size = 9; // массив
    char arr[size];
    // -- -- -- -- -- -- --
    for (int i = 0; i < size; i++) arr[i] = '-'; // заполняем его
    PrintArray(size, arr);
    // -- -- -- -- -- -- --
    bool whoseTurn = WhoseTurn(); // переменная приравнивается к результату ф-и WhoseTurn()
    // -- -- -- -- -- -- --
 
    for(int step=1; step<=9; step++) // 9 ходов, т.к. 9 клеточек
    {
        //  -- -- проверка на правильность ввода ячейки
        int index;
        do { 
            cout << " " << step << ". Enter index (0-8) = "; cin >> index; 
            if (index > 8 || index < 0 || arr[index] == 'X' || arr[index] == '0') cout << " Error ! Try again -> " << endl;
        } while (index > 8 || index < 0 || arr[index] == 'X' || arr[index] == '0');
        // -- -- -- -- -- -- --
 
        //  -- -- -- Организовываем ход
        whoseTurn ? arr[index] = 'X' : arr[index] = '0'; // если whoseTurn  == 1, то ходит Х 
        whoseTurn = !whoseTurn;
 
        PrintArray(size, arr);
        
        if (step >= 5) { // После 5 ходов проверяем, кто победил. Ранее 5 ходов нельзя выиграть
            if (CheckSituation(arr) != '-') // если кто-то выиграл
                break;
        }
 
        // -- -- -- -- -- -- --
    }
    //  - -- -- -- -- Говорим результат игры
    if (CheckSituation(arr) == 'X')
        cout << " X is the winner ! " << endl;
    else if (CheckSituation(arr) == '0')
        cout << " 0 is the winner ! " << endl;
    else
        cout << " Draw " << endl;
    // -- -- -- -- -- -- --
}
Нумерация ячеек идет от 0!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2018, 11:10
Ответы с готовыми решениями:

Крестики-нолики
Помогите пожалуйста создать игру крестики-нолики на 2 игроков, поле игры - массив 3х3. Нашла...

Крестики нолики
Уж слишком запутался даже в такой простом коде: #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Крестики нолики
Здравствуйте. Я сделал программу позволяющую играть в крестики-нолики. Можете помочь найти...

Крестики нолики
Недавно начал изучать C++. Фактически это первый язык программирования который я осваиваю. Решил...

Крестики-нолики
Добрый вечер. Хочу попробовать написать свои крестики-нолики. Игру еще не дописал, но уже появилась...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2018, 11:10

Крестики нолики
Нужно написать программу крестики нолики.

Крестики нолики
Доброго времени суток, недавно я решил написать игру крестики нолики, написал, но код в ~1300...

Крестики нолики
Доброго времени суток, недавно, я решил написать программу Крестики нолики, опираясь на свои знания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru