Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342

Крестики-нолики (3х3)

04.11.2011, 17:41. Показов 3164. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Прошу проконсультировать. Необходимо сделать игру крестики-нолики (3х3).
Как вообще посоветуете действовать? Просто if-ать или есть более "интересные" (меня интересуют простые) способы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2011, 17:41
Ответы с готовыми решениями:

Крестики-нолики 3х3 и 5х5 МиниМакс
Реализовал крестики нолики 3х3 с использованием минимакса, все работает отлично. При попытке сделать поле 5х5 Игра зависает после моего...

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

Крестики-нолики
main.cpp #include "KR.h" using namespace std; int main() { RandomPlayer *r = new RandomPlayer('x'); ...

12
365 / 366 / 167
Регистрация: 11.06.2010
Сообщений: 703
04.11.2011, 17:51
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Как вообще посоветуете действовать?
Сначала предлагаю пользоваться поиском: https://www.cyberforum.ru/sear... id=3702680
0
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
04.11.2011, 18:18  [ТС]
-comrade-, спасибо, но перед тем, как создать тему, я уже искал
Толкового ничего не нашел - только игры "сам с собой" или что-то размытое.
Просто прошу пару советов.
0
365 / 366 / 167
Регистрация: 11.06.2010
Сообщений: 703
04.11.2011, 20:38
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Толкового ничего не нашел - только игры "сам с собой" или что-то размытое.
А вы хотите играть по сети?
Что следует понимать под "что-то размытое"?
0
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
04.11.2011, 21:25  [ТС]
Конкретный алгоритм я не нашел.
А играть "хочу" с компьютером, поэтому и интересуюсь - как создавать элементарную логику (интелект) программы.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 09:43
Цитата Сообщение от ViT(Vet@l)
как создавать элементарную логику (интелект) программы
определяешь, где можно закрыть
определяешь, где противник может закрыть
определяешь, где можно поставить вилку
определяешь, где противник может поставить вилку
1
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
07.11.2011, 23:39  [ТС]
Короче сделал все по "деревянному"
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
class Screen{
 
    string massiv[9];
    int i;
 
public:
 
    Screen(){
        for(i = 0; i < 9; i++)
            massiv[i] = " ";
    }
 
    void table(void)
    {
 
        cout << "    |   |    " << endl;
        cout << " " << massiv[0] << "  | " << massiv[1] << " |  " << massiv[2] << " " << endl;
        cout << "____|___|____" << endl;
        cout << "    |   |    " << endl;
        cout << " " << massiv[3] << "  | " << massiv[4] << " |  " << massiv[5] << " " << endl;
        cout << "____|___|____" << endl;
        cout << "    |   |    " << endl;
        cout << " " << massiv[6] << "  | " << massiv[7] << " |  " << massiv[8] << " " << endl;
        cout << "    |   |    " << endl;
    }
 
    void krest(void)
    {
        cout << "poziciia" << endl;
        vvod: cin >> i;
        int cifr_klav[9] = {7, 8, 9, 4, 5, 6, 1, 2, 3};
        for(int j = 0; j < 9; j++){
            if(i == cifr_klav[j]){
                if(massiv[j] == " ")
                    massiv[j] = "X";
                else{
                    cout << endl << "Oshibka! Poprobyte eshe!" << endl;
                    goto vvod;
                }
            }
        }
    }
 
    void nol(void)
    {
        srand(time(NULL));
        label: i = 0 + rand() % 9;
 
        if(massiv[i] == "X" || massiv[i] == "0")
            goto label;
        else
            massiv[i] = "0";
    }
 
    int proverka(void)
    {
         for(int i = 0; i < 9; i++){
            int counter = 0;
            if(massiv[i] != " ")
                counter++;
            if(counter == 9)
                return 0;
            }
 
          if((massiv[0] == massiv[1] && massiv[1] == massiv[2]) && massiv[0] != " ")
            return 0;
        else if((massiv[3] == massiv[4] && massiv[4] == massiv[5]) && massiv[3] != " ")
            return 0;
        else if((massiv[6] == massiv[7] && massiv[7] == massiv[8]) && massiv[6] != " ")
            return 0;
        else if((massiv[0] == massiv[4] && massiv[4] == massiv[8]) && massiv[0] != " ")
            return 0;
        else if((massiv[2] == massiv[4] && massiv[4] == massiv[6]) && massiv[2] != " ")
            return 0;
        else if((massiv[0] == massiv[3] && massiv[3] == massiv[6]) && massiv[0] != " ")
            return 0;
        else if((massiv[1] == massiv[4] && massiv[4] == massiv[7]) && massiv[1] != " ")
            return 0;
        else if((massiv[2] == massiv[5] && massiv[5] == massiv[8]) && massiv[2] != " ")
            return 0;
        else
            return 1;
 
        
 
    }
 
    void pervii_nol(void){
        if(massiv[4] == " ")
            massiv[4] = "0";
        else{
            massiv[0] = "0";
        }
    }
 
    void zakrit(void)
    {
        if(((massiv[1] == massiv[2] && massiv[1] != " ") || (massiv[4] == massiv[8] && massiv[4] != " ") || (massiv[3] == massiv[6] && massiv[3] != " ")) && massiv[0] != "0" && massiv[0] != "X"){
            massiv[0] = "0";
 
        }
        else if(((massiv[0] == massiv[2] && massiv[0] != " ") || (massiv[4] == massiv[7]) && massiv[4] != " ") && massiv[1] != "0" && massiv[1] != "X"){
            massiv[1] = "0";
 
        }
        else if(((massiv[0] == massiv[1] && massiv[1] != " ") || (massiv[5] == massiv[8] && massiv[5] != " ") || (massiv[4] == massiv[6] && massiv[4] != " ")) && massiv[2] != "0" && massiv[2] != "X"){
            massiv[2] = "0";
 
        }
        else if(((massiv[4] == massiv[5] && massiv[4] != " ") || (massiv[0] == massiv[6] && massiv[0] != " ")) && massiv[3] != "0" && massiv[3] != "X"){
            massiv[3] = "0";
 
        }
        else if(((massiv[3] == massiv[5] && massiv[3] != " ") || (massiv[1] == massiv[7] && massiv[1] != " ") || (massiv[0] == massiv[8] && massiv[0] != " ")|| (massiv[2] == massiv[6] && massiv[2] != " ")) && massiv[4] != "0" && massiv[4] != "X"){
            massiv[4] = "0";
 
        }
        else if(((massiv[3] == massiv[4] && massiv[3] != " ") || (massiv[2] == massiv[8] && massiv[2] != " ")) && massiv[5] != "0" && massiv[5] != "X"){
            massiv[5] = "0";
 
        }
        else if(((massiv[0] == massiv[3] && massiv[0] != " ") || (massiv[7] == massiv[8] && massiv[7] != " ") || (massiv[2] == massiv[4] && massiv[2] != " ")) && massiv[6] != "0" && massiv[6] != "X"){
            massiv[6] = "0";
 
        }
        else if(((massiv[1] == massiv[4] && massiv[1] != " ") || (massiv[6] == massiv[8] && massiv[6] != " ")) && massiv[7] != "0" && massiv[7] != "X"){
            massiv[7] = "0";
 
        }
        else if(((massiv[6] == massiv[7] && massiv[6] != " ") || (massiv[2] == massiv[5] && massiv[2] != " ") || (massiv[0] == massiv[4]) && massiv[0] != " ") && massiv[8] != "0" && massiv[8] != "X"){
            massiv[8] = "0";
        }
         else
            nol();
    }
 
};
 
 
int main()
{
    Screen a;
    a.table();
    a.krest();
    system("cls");
 
    a.table();
    a.pervii_nol();
    system("cls");
    a.table();
 
    while(a.proverka()){
 
        a.krest();
        system("cls");
        a.table();
        if(a.proverka() == 0)
            break;
        a.zakrit();
        system("cls");
        a.table();
    }
 
    return 0;
}
Почему если ничья то начинается бесконечный цикл
Здесь проверяю не заполнен ли полностью массив
C++
1
2
3
4
5
6
7
 for(int i = 0; i < 9; i++){
            int counter = 0;
            if(massiv[i] != " ")
                counter++;
            if(counter == 9)
                return 0;
            }
Добавлено через 1 минуту
вводить данные надо на цифровой клавиатуре - размещение клавиш соответствует ячейкам
0
365 / 366 / 167
Регистрация: 11.06.2010
Сообщений: 703
07.11.2011, 23:50
Максимальное значение, которое может принимать counter - 8
0
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
08.11.2011, 00:08  [ТС]
Попробовал изменить - что-то результат нулевый...
Если Вам не сложно, отредактируйте пожалуйста хотя бы часть кода
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
08.11.2011, 08:32
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
как создавать элементарную логику (интелект) программы
В книге: Мозговой 85 нетривиальных проектов, решений и задач. (стр. 167)

самообучающиеся крестики нолики
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.11.2011, 08:55
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Конкретный алгоритм я не нашел.
А играть "хочу" с компьютером, поэтому и интересуюсь - как создавать элементарную логику (интелект) программы
Просчитывай до конца партии (попеды одного из игроков, считая комп тоже игроком, или закрытия всего поля). Каждое ход начинает какое то продолжение партии, а в нём будет какой то резуьтат. Если хотя бы в одном продолжении человек побеждает одним ответным ходом, или во всех продолжениях побеждает человек, то такой ход помечаешь как абсолютно проигрышный. Далее, если ход ещё не помечен и ни в одном продолжнии не побеждает компьютер, такой ход помечаешь как не выигрышный (еще не проигрышный, возможно он ведёт к ничьей). Если ход невыигрышный, но ни в одном продолжении нет поражения то ход помечается, как гарнтирующий ничью. Если все продолжения завершаются победой компьютера, такой ход помечаешь, как однозначно выигрышный. Отавшиеся ходы могут вести к победе компьютера, но не гарантируют её. Если есть хотябы один однозначно выигрышный ход, по любому алгоритму (можно случайно) выбираешь один из таких ходов. Если однозначно выигрышных ходов нет, но есть хоятбы один ход, не исключающий, но и не гарантирующий победу, то из числа таких ходов выбираешь тот, где побед больше всего. Если нет ни однозначно выигрышных ходов, ни ходов, не гарнтирующих, но и не исключающих победу, но есть хотябы один ход, гарантирующий ничью, то из таких ходов выбиарешь один по любому алгоритму (можно случайно). Если нет и ходов, гарантирующих ничью, то среди ходов, допускающих её выбиарешь тот, где ничьих меньше в долях от общего числа продолжений, начинающихся с этого хода. Если же все ходы абсолютно проигрышные, то сдаёшься.
2
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
08.11.2011, 10:23  [ТС]
Ошибка в том, что counter объявлен внутри цикла и при каждой итерации он обнуляется
0
33 / 32 / 7
Регистрация: 13.12.2010
Сообщений: 342
09.11.2011, 22:32  [ТС]
Теперь возник ещё один вопрос - решил немного "оформить".
Код:
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
while(1){
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                        1 - Start                      X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                        2 - Exit                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
 
            Sleep(1750);
            system("cls");
 
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                       1 - Start                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                       2 - Exit                        0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0                                                       0 0 0 0 0 0 " << endl;
            cout << "X X X X X X                                                       X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
            cout << " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " << endl;
            cout << "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X" << endl;
 
            Sleep(1750);
            system("cls");
        }
Подскажите пожалуйста, как бы так сделать, что бы при нажатии 1 закончить этот цикл, а 2 - выйти. Но так, что бы программа не ожидала нажатия, а продолжлась до нажатия
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.11.2011, 22:32
Помогаю со студенческими работами здесь

Крестики нолики
Здравствуйте. Никак не получается определить, кто победил, всегда выводит ничью. Почему? #include &lt;iostream&gt; #include...

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

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

Крестики-нолики
Захотелось написать игру Крестики-нолики но тут возник один вопрос, как будет ходить компютер, если пользоватся rand-ом то компютер будет...

Крестики нолики на С
Здраствуйте. Помогите пожалуйста написать игру в консоли. Это крестики нолики поле 3х3. Буду благодарен если поможете и объясните. ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru