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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
#1

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

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

Доброго времени суток!
Прошу проконсультировать. Необходимо сделать игру крестики-нолики (3х3).
Как вообще посоветуете действовать? Просто if-ать или есть более "интересные" (меня интересуют простые) способы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крестики-нолики (3х3) (C++):

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

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

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

Крестики нолики - C++
Привет всем! Пишу крестики нолики в консоли и проблема вот в чем: нарисовал само поле, и нужно при вводе координат определенного участка...

крестики-нолики - C++
Здравствуйте! у кого есть примеры программ крестики-нолики? если не затруднит поделитесь пожалуйста..

крестики нолики - C++
Я дошел до проверки или кто-то выиграл и тут мне немного не понравилось.Для того чтобы проверить есть ли победитель, я сравниваю элементы...

12
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
04.11.2011, 17:51 #2
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Как вообще посоветуете действовать?
Сначала предлагаю пользоваться поиском: http://www.cyberforum.ru/search.php?searchid=3702680
0
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
04.11.2011, 18:18  [ТС] #3
-comrade-, спасибо, но перед тем, как создать тему, я уже искал
Толкового ничего не нашел - только игры "сам с собой" или что-то размытое.
Просто прошу пару советов.
0
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
04.11.2011, 20:38 #4
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Толкового ничего не нашел - только игры "сам с собой" или что-то размытое.
А вы хотите играть по сети?
Что следует понимать под "что-то размытое"?
0
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
04.11.2011, 21:25  [ТС] #5
Конкретный алгоритм я не нашел.
А играть "хочу" с компьютером, поэтому и интересуюсь - как создавать элементарную логику (интелект) программы.
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.11.2011, 09:43 #6
Цитата Сообщение от ViT(Vet@l)
как создавать элементарную логику (интелект) программы
определяешь, где можно закрыть
определяешь, где противник может закрыть
определяешь, где можно поставить вилку
определяешь, где противник может поставить вилку
1
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
07.11.2011, 23:39  [ТС] #7
Короче сделал все по "деревянному"
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
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
07.11.2011, 23:50 #8
Максимальное значение, которое может принимать counter - 8
0
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
08.11.2011, 00:08  [ТС] #9
Попробовал изменить - что-то результат нулевый...
Если Вам не сложно, отредактируйте пожалуйста хотя бы часть кода
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.11.2011, 08:32 #10
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
как создавать элементарную логику (интелект) программы
В книге: Мозговой 85 нетривиальных проектов, решений и задач. (стр. 167)

самообучающиеся крестики нолики
1
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.11.2011, 08:55 #11
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
Конкретный алгоритм я не нашел.
А играть "хочу" с компьютером, поэтому и интересуюсь - как создавать элементарную логику (интелект) программы
Просчитывай до конца партии (попеды одного из игроков, считая комп тоже игроком, или закрытия всего поля). Каждое ход начинает какое то продолжение партии, а в нём будет какой то резуьтат. Если хотя бы в одном продолжении человек побеждает одним ответным ходом, или во всех продолжениях побеждает человек, то такой ход помечаешь как абсолютно проигрышный. Далее, если ход ещё не помечен и ни в одном продолжнии не побеждает компьютер, такой ход помечаешь как не выигрышный (еще не проигрышный, возможно он ведёт к ничьей). Если ход невыигрышный, но ни в одном продолжении нет поражения то ход помечается, как гарнтирующий ничью. Если все продолжения завершаются победой компьютера, такой ход помечаешь, как однозначно выигрышный. Отавшиеся ходы могут вести к победе компьютера, но не гарантируют её. Если есть хотябы один однозначно выигрышный ход, по любому алгоритму (можно случайно) выбираешь один из таких ходов. Если однозначно выигрышных ходов нет, но есть хоятбы один ход, не исключающий, но и не гарантирующий победу, то из числа таких ходов выбираешь тот, где побед больше всего. Если нет ни однозначно выигрышных ходов, ни ходов, не гарнтирующих, но и не исключающих победу, но есть хотябы один ход, гарантирующий ничью, то из таких ходов выбиарешь один по любому алгоритму (можно случайно). Если нет и ходов, гарантирующих ничью, то среди ходов, допускающих её выбиарешь тот, где ничьих меньше в долях от общего числа продолжений, начинающихся с этого хода. Если же все ходы абсолютно проигрышные, то сдаёшься.
2
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
08.11.2011, 10:23  [ТС] #12
Ошибка в том, что counter объявлен внутри цикла и при каждой итерации он обнуляется
0
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 334
09.11.2011, 22:32  [ТС] #13
Теперь возник ещё один вопрос - решил немного "оформить".
Код:
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
09.11.2011, 22:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 22:32
Привет! Вот еще темы с ответами:

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

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

Крестики-нолики - C++
Доброго времени суток! Вот, решил для курсовой работы написать игру Крестики-нолики. Но мне требуется маленькая помощь. Подскажите, как...

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


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

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

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