Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_UnReal
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 27
#1

Крестики-нолики (не могу отследить ошибку) - C++

06.07.2015, 17:34. Просмотров 239. Ответов 7
Метки нет (Все метки)

Проблема заключается в том, что при ходе (не важно компьютера или моего), ход идет двойной. Ставится 2 крестика или 2 нолика сразу и я не могу понять в чём проблема

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <conio.h>
#include <iostream>
#include <time.h>
 
using namespace::std;
 
bool Select;
int HumanMoveX, HumanMoveY, BotMoveX, BotMoveY, Field[2][2];
 
void Fill(){
    for (int i(0); i <= 2; i++){
        for (int j(0); j <= 2; j++)
            Field[i][j] = 0;
    }
}
void FieldDraw(){
    system("cls");
    for (int i(0); i <= 2; i++){
        for (int j(0); j <= 2; j++){
            if (Field[i][j] == 0)
                cout << " . ";
            else if (Field[i][j] == 1)
                cout << " X ";
            else if (Field[i][j] == 2)
                cout << " O ";
        }
        cout << endl;
    }
}
bool Selection(){
    cout << "*****Выберите O или X(0 или 1)*****" << endl;
    cin >> Select;
    return Select;
}
void HumanMove(){
    cout << "Ваш ход!" << endl;
    cin >> HumanMoveX >> HumanMoveY;
    if (Select == true)
        Field[HumanMoveX][HumanMoveY] = 1;
    if (Select == false)
        Field[HumanMoveX][HumanMoveY] = 2;
    FieldDraw();
}
void BotMove(){
    BotMoveY = rand() % 3;
    BotMoveX = rand() % 3;
    while (true){
        if (Field[BotMoveX][BotMoveY] != 0){
            BotMoveY = rand() % 3;
            BotMoveX = rand() % 3;
        }
        else break;
    }
 
    if (Select == true)
        Field[BotMoveX][BotMoveY] = 2;
    else
        Field[BotMoveX][BotMoveY] = 1;
    
FieldDraw();
}
int CheckWin(){
    int k = 0;
    //Проверка по строкам
    for (int i(0); i <= 2; i++){
        if ((Field[i][0] == 2) && (Field[i][1] == 2) && (Field[i][2] == 2))
            return 2;
        if ((Field[i][0] == 1) && (Field[i][1] == 1) && (Field[i][2] == 1))
            return 1;
    }
    //Проверка по столбцам
    for (int i(0); i <= 2; i++){
        if ((Field[0][i] == 2) && (Field[1][i] == 2) && (Field[2][i] == 2))
            return 2;
        if ((Field[0][i] == 1) && (Field[1][i] == 1) && (Field[2][i] == 1))
            return 1;
    }
    //Проверка главной диагонали
    if ((Field[0][0] == 1) && (Field[1][1] == 1) && (Field[2][2] == 1))
        return 1;
    if ((Field[0][0] == 2) && (Field[1][1] == 2) && (Field[2][2] == 2))
        return 2;
    //Проверка побочной диагонали
    if ((Field[0][2] == 1) && (Field[1][1] == 1) && (Field[2][0] == 1))
        return 1;
    if ((Field[0][2] == 2) && (Field[1][1] == 2) && (Field[2][0] == 2))
        return 2;
    //Проверка на ничью
    for (int i(0); i <= 2; i++){
        for (int j(0); j <= 2; j++)
            if (Field[i][j] != 0)
                k++;
    }
    if (k == 9)
        return 3;
    else return 0;
}
 
int main(){
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    Fill();
 
    if (Selection()){
        while (true){
            FieldDraw();
 
            HumanMove();
            if (CheckWin() == 1){
                cout << "Победил игрок!" << endl;
                break;
            }
            else if (CheckWin() == 2){
                cout << "Победил компьютер!" << endl;
                break;
            }
            else if (CheckWin() == 3){
                cout << "Ничья!" << endl;
                break;
            }
 
            BotMove();
            if (CheckWin() == 1){
                cout << "Победил игрок!" << endl;
                break;
            }
            else if (CheckWin() == 2){
                cout << "Победил компьютер!" << endl;
                break;
            }
            else if (CheckWin() == 3){
                cout << "Ничья!" << endl;
                break;
            }
        }
    }
    else 
        while (true){
            FieldDraw();
 
            BotMove();
            if (CheckWin() == 2){
                cout << "Победил игрок!" << endl;
                break;
            }
            else if (CheckWin() == 1){
                cout << "Победил компьютер!" << endl;
                break;
            }
            else if (CheckWin() == 3){
                cout << "Ничья!" << endl;
                break;
            }
 
            HumanMove();
            if (CheckWin() == 2){
                cout << "Победил игрок!" << endl;
                break;
            }
            else if (CheckWin() == 1){
                cout << "Победил компьютер!" << endl;
                break;
            }
            else if (CheckWin() == 3){
                cout << "Ничья!" << endl;
                break;
            }
 
            
        }
    _getch();
    return 0;
}
Функция Select - выбор игры за крестики или нолики(от неё зависит вывод). Бот ходит на рандом(проверка, есть ли в клетке что-нибудь, если да, то генерирует новое значение)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2015, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крестики-нолики (не могу отследить ошибку) (C++):

Как создать логическую игру “Крестики-нолики” на консоли функцию winner не могу до делать c++ - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; using namespace std; int polya; class o; class x { ...

Крестики-нолики - C++
Доброго времени суток. Решил написать крестики-нолики, но возник какой-то косяк на ровном (и естесно самом неожиданном) месте. Коротко...

Крестики Нолики - C++
вот задали написать игру , скажите нормально впринципе написал или нет , и один вопрос немогу почемут зделать чтоб проверяло кто выиграл ) ...

Крестики-нолики - C++
Ребят! Как сделать проверку на занятость квадратика? #include &lt;iostream&gt; using namespace std; int BoardSquare(int array) ...

Крестики-нолики - C++
Пишу крестики нолики, получается смесь ООП и говнокода:senor: Вот собственно код: #include &quot;Pole.h&quot; void CChunk::setState(e_state...

“Крестики-нолики” - C++
Напишите игру “Крестики-нолики”. Программа выводит игровое поле для двух игроков, проверяет правильность ходов, следит за ситуацией на...

7
ampermetr
06.07.2015, 18:11
  #2

Не по теме:

поторопился с ответом

0
matxon
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
06.07.2015, 18:14 #3
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
void HumanMove(){
    cout << "Ваш ход!" << endl;
    cin >> HumanMoveX >> HumanMoveY;
    if (Select == true)
        Field[HumanMoveX][HumanMoveY] = 1;
    if (Select == false)
        Field[HumanMoveX][HumanMoveY] = 2;
    // FieldDraw(); - Надо убрать
}
void BotMove(){
    BotMoveY = rand() % 3;
    BotMoveX = rand() % 3;
    while (true){
        if (Field[BotMoveX][BotMoveY] != 0){
            BotMoveY = rand() % 3;
            BotMoveX = rand() % 3;
        }
        else break;
    }
 
    if (Select == true)
        Field[BotMoveX][BotMoveY] = 2;
    else
        Field[BotMoveX][BotMoveY] = 1;
    
// FieldDraw();  Надо убрать 
}
0
_UnReal
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 27
06.07.2015, 19:08  [ТС] #4
Нет. Функции FieldDraw() здесь после каждого хода обновляют экран. Проблема не исчезла и даже более, если играть за 0,то первым ходит-то бот и его ход уже не видно.
0
Black Fregat
1382 / 1013 / 224
Регистрация: 31.05.2009
Сообщений: 4,245
06.07.2015, 19:37 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Границы массива поправьте на [3][3]

Добавлено через 12 минут

Не по теме:

ampermetr, мне clang сходу сказал

2
ampermetr
06.07.2015, 19:46
  #6

Не по теме:

Black Fregat, я в первые 5 минут сократил код до такого

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int Field[2][2];
int main()
{
    for (int i(0); i <= 2; i++){
        for (int j(0); j <= 2; j++)
            Field[i][j] = 0;}
 
    Field[0][2] = 2;
 
    for (int i(0); i <= 2; i++){
        for (int j(0); j <= 2; j++){
          cout << Field[i][j] << " ";}
            cout << endl;}
    return 0;
}
и потом полтора часа голову ломал почему он не работает

0
_UnReal
0 / 0 / 0
Регистрация: 16.02.2013
Сообщений: 27
06.07.2015, 22:46  [ТС] #7
Да заработало как нужно. А можете объяснить теперь почему оно работает Оо. Ведь же массив идет 0 1 2, всего 3 значения, зачем ему 4-е?
0
Black Fregat
1382 / 1013 / 224
Регистрация: 31.05.2009
Сообщений: 4,245
06.07.2015, 23:23 #8
Так в записи Field[3][3] указывается как раз количество элементов массива. А индексы будут 0, 1, 2. А у Вас весь массив был 2х2 = 4 элемента. И все проблемы состояли в том, что при индексации этих четырех элементов большим диапазоном индексов возникали наложения. То есть Вы ставите одну двойку, а появляется несколько
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2015, 23:23
Привет! Вот еще темы с ответами:

Крестики-нолики - C++
Здраствуйте,помогите пожалуйсто с програмкои крестики нолики проблема не могу в вести символы. Вот собственно сам код рамки . ...

крестики-нолики - C++
Может у кого-то есть шаблон,чтобы расчертить поле в клетку,например 3x3. Покажите пожалуйста))

Крестики Нолики - C++
Прошу помочь, я написал игру крестики нолики, но при вводе. Выводится только крестик. ПОмогите. Не знаю в чем ошибка. #include &lt;iostream&gt;...

Крестики-нолики - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; void show_cells(); void make_move(int num); void result(); ...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
06.07.2015, 23:23
Ответ Создать тему
Опции темы

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