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

Крестики-нолики - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.95
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
07.08.2011, 19:18     Крестики-нолики #1
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 <iostream>
#include <cstring>
using namespace std;
 
void show_cells();
void make_move(int num);
void result();
 
char cells[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char PlayerName1[80],
     PlayerName2[80];
         
bool PlayerName1Win,
     PlayerName2Win;
 
int main () {
    cout << "Enter the name of the 1st player: ";
                                               gets(PlayerName1);
    cout << "Enter the name of the 2st player: ";
                                               gets(PlayerName2);
    cout << "\n";
 
    show_cells();
    make_move(1);
    show_cells();
    
    make_move(2);
    show_cells();
    
        for (int move = 1; move <= 9; move++) {
            show_cells();
            if (move % 2) make_move(1);
            else make_move(2);
            if (move >= 5) 
                for (int i = 1; i <= 9; i++)
                    for (int j = 1; i <= 9; j++)
                        for (int k = 1; i <= 9; k++) {
                            if ((i != j) && (j != k) && (cells[i-1] = 'X') && (cells[j-1] = 'X') && (cells[k-1] = 'X'))
                                if (((i * j)/2 == k) || ((i * k)/2 == j) || ((k * j)/2 == i)) {
                                    PlayerName1Win = 1;
                                    goto end;
                                }
                            if ((i != j) && (j != k) && (cells[i-1] = 'O') && (cells[j-1] = 'O') && (cells[k-1] = 'O'))
                                if (((i * j)/2 == k) || ((i * k)/2 == j) || ((k * j)/2 == i)) {
                                    PlayerName2Win = 1;
                                    goto end;
                                }
                            
                        }
        }
    
    end:
    result();
    system ("pause");
    return 0;
}
 
void show_cells() {
    cout << "------------" << "\n" << endl;
    cout << "Numbers of cells:" << endl;
    cout << "-" << 1 << "-" << '|' << "-" << 2 << "-" << '|' << "-" << 3 << "-" << " |" << endl;
    cout << "-" << 4 << "-" << '|' << "-" << 5 << "-" << '|' << "-" << 6 << "-" << " |" <<  endl;
    cout << "-" << 7 << "-" << '|' << "-" << 8 << "-" << '|' << "-" << 9 << "-" << " |" << "\n" << endl;
    
    cout << "Current situation (--- is empty):" << endl;
    cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << " |" <<  endl;
    cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << " |" <<  endl;
    cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << " |" <<  "\n" << endl;
    cout << "------------\n" << endl;
}
 
void make_move(int num) {
    cout << "Enter a cell's number to make move: ";
    int cell;
    cin >> cell;
    cout << "\n";
    while (cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X') {
        cout << "Enter a CORRECT (1-9) or EMPTY (---) cell's number to make move: ";
        cin >> cell;
        cout << "\n";
    }
    
    if (num == 1)
    cells[cell-1] = 'X';
    else cells[cell-1] = 'O';
}
 
void result() {
    if (PlayerName1Win) cout << PlayerName1 << " win! Congratulations! " << PlayerName2 << " is looser! Bugoga...";
    else if (PlayerName2Win) cout << PlayerName2 << " win! Congratulations! " << PlayerName1 << " is looser! Bugoga...";
    else cout << "Draw!!!";
}
При победе одного из игроков программа не хочет выводить результат, а при достижении 7 ходов программа зависает. В чем моя ошибка?

Алгоритм вычисления победы: когда ходов 5 или больше - выбираются 3 ячейки, которые имеют значение X (или O), при этом номера ячеек не должны быть равны и среднее арифметическое двух крайних ячеек должно быть равно средней ячейки выигрышной последовательности.
Пример,
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9

X | - | O
- | X | O
- | - | X

(1 + 9) / 2 = 5
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2011, 19:18     Крестики-нолики
Посмотрите здесь:

C++ Крестики нолики на С
Крестики-нолики C++
C++ Крестики Нолики
Крестики нолики C++
C++ Крестики-нолики
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
07.08.2011, 22:38     Крестики-нолики #2
Цитата Сообщение от Sahon Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
    show_cells();
    make_move(1);
    show_cells();
    
    make_move(2);
    show_cells();
    
        for (int move = 1; move <= 9; move++) {
            show_cells();
            if (move % 2) make_move(1);
            else make_move(2);
и того уже 11 ходов, вас не смущает?

идем дальше
C++
1
2
3
            for (int i = 1; i <= 9; i++)
                for (int j = 1; i <= 9; j++)
                    for (int k = 1; i <= 9; k++) {
а вот и наш вечный цикл.
исправите эти два момента, будет окей.
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
07.08.2011, 23:34  [ТС]     Крестики-нолики #3
Цитата Сообщение от silentnuke Посмотреть сообщение
и того уже 11 ходов, вас не смущает?
Спасибо, а то забыл убрать проверку (проверял как оно будет ходы считывать)

Цитата Сообщение от silentnuke Посмотреть сообщение
идем дальше
C++
1
2
3
            for (int i = 1; i <= 9; i++)
                for (int j = 1; i <= 9; j++)
                    for (int k = 1; i <= 9; k++) {
а вот и наш вечный цикл.
исправите эти два момента, будет окей.
А вот за это еще раз огромное спасибо

Добавлено через 14 минут
Однако теперь, первый игрок выигрывает после пятого хода при любом раскладе (теперь хоть сообщение о победе выводится):
Код

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
#include <iostream>
#include <cstring>
using namespace std;
 
void show_cells();
void make_move(int num);
void result();
 
char cells[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char PlayerName1[80],
     PlayerName2[80];
         
bool PlayerName1Win,
     PlayerName2Win;
 
int main () {
    cout << "Enter the name of the 1st player: ";
                                               gets(PlayerName1);
    cout << "Enter the name of the 2st player: ";
                                               gets(PlayerName2);
    cout << "\n";
    
    show_cells();
    
        for (int move = 1; move <= 9; move++) {
            if (move % 2) make_move(1);
            else make_move(2);
            show_cells();
            if (move >= 5) 
                for (int i = 1; i <= 9; i++)
                    for (int j = 1; j <= 9; j++)
                        for (int k = 1; k <= 9; k++) {
                            if ((i != j) && (j != k) && (cells[i-1] = 'X') && (cells[j-1] = 'X') && (cells[k-1] = 'X')) 
                                if (((i * j)/2 == k) || ((i * k)/2 == j) || ((k * j)/2 == i)) {
                                    PlayerName1Win = 1;
                                    goto end;
                                }
                          
                            if ((i != j) && (j != k) && (cells[i-1] = 'O') && (cells[j-1] = 'O') && (cells[k-1] = 'O'))
                                if (((i * j)/2 == k) || ((i * k)/2 == j) || ((k * j)/2 == i)) {
                                    PlayerName2Win = 1;
                                    goto end;
                                }
                            
                        }
        }
    
    end:
    result();
    system ("pause");
    return 0;
}
 
void show_cells() {
    cout << "------------" << "\n" << endl;
    cout << "Numbers of cells:" << endl;
    cout << "-" << 1 << "-" << '|' << "-" << 2 << "-" << '|' << "-" << 3 << "-" << " |" << endl;
    cout << "-" << 4 << "-" << '|' << "-" << 5 << "-" << '|' << "-" << 6 << "-" << " |" <<  endl;
    cout << "-" << 7 << "-" << '|' << "-" << 8 << "-" << '|' << "-" << 9 << "-" << " |" << "\n" << endl;
    
    cout << "Current situation (--- is empty):" << endl;
    cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << " |" <<  endl;
    cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << " |" <<  endl;
    cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << " |" <<  "\n" << endl;
    cout << "------------\n" << endl;
}
 
void make_move(int num) {
    if (num == 1) cout << PlayerName1;
    else cout << PlayerName2;
    cout << ", enter a cell's number to make move: ";
    int cell;
    cin >> cell;
    cout << "\n";
    while (cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X') {
        cout << "Enter a CORRECT (1-9) or EMPTY (---) cell's number to make move: ";
        cin >> cell;
        cout << "\n";
    }
    
    if (num == 1)
    cells[cell-1] = 'X';
    else cells[cell-1] = 'O';
}
 
void result() {
    if (PlayerName1Win) cout << PlayerName1 << " win! Congratulations! " << PlayerName2 << " is looser! Bugoga..." << endl;
    else if (PlayerName2Win) cout << PlayerName2 << " win! Congratulations! " << PlayerName1 << " is looser! Bugoga..." << endl;
    else cout << "Draw!!!" << endl;
}
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
07.08.2011, 23:59     Крестики-нолики #4
C++
1
2
3
if ((i != j) && (j != k) && (cells[i-1] = 'X') && (cells[j-1] = 'X') && (cells[k-1] = 'X'))
 
if ((i != j) && (j != k) && (cells[i-1] = 'O') && (cells[j-1] = 'O') && (cells[k-1] = 'O'))
ну во первых наверняка там ещё должно быть i!=k.
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
08.08.2011, 00:05  [ТС]     Крестики-нолики #5
Цитата Сообщение от silentnuke Посмотреть сообщение
C++
1
2
3
if ((i != j) && (j != k) && (cells[i-1] = 'X') && (cells[j-1] = 'X') && (cells[k-1] = 'X'))
 
if ((i != j) && (j != k) && (cells[i-1] = 'O') && (cells[j-1] = 'O') && (cells[k-1] = 'O'))
ну во первых наверняка там ещё должно быть i!=k.
блин, почему-то подумал, если i != j и j != k, то i != k. Ну это во-первых. Программа все-равно не пашет нормально.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
08.08.2011, 00:15     Крестики-нолики #6
Цитата Сообщение от Sahon Посмотреть сообщение
блин, почему-то подумал, если i != j и j != k, то i != k. Ну это во-первых. Программа все-равно не пашет нормально.
потому что алгоритм какой-то кривой)
тут уже сами копайтесь, леенб вникать
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
08.08.2011, 00:25  [ТС]     Крестики-нолики #7
Цитата Сообщение от silentnuke Посмотреть сообщение
потому что алгоритм какой-то кривой)
тут уже сами копайтесь, леенб вникать
Придумайте лучше Да уж покопался изрядно и ничего ошибочного больше не нашел
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
08.08.2011, 02:29     Крестики-нолики #8
Цитата Сообщение от Sahon Посмотреть сообщение
Придумайте лучше Да уж покопался изрядно и ничего ошибочного больше не нашел
ну вот как-то так)
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
#include <iostream>
#include <cstring>
using namespace std;
 
void show_cells();
void make_move(int num);
void result();
char check();
 
char cells[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'};
char PlayerName1[80],
    PlayerName2[80];
char win='-';
int main () {
    cout << "Enter the name of the 1st player: ";
    gets(PlayerName1);
    cout << "Enter the name of the 2st player: ";
    gets(PlayerName2);
    cout << "\n";
 
    show_cells();
 
    for (int move = 1; move <= 9; move++) {
        if (move % 2) make_move(1);
        else make_move(2);
        show_cells();
        if (move >= 5) 
        {
            win=check();
            if(win!='-')
                break;
        }
    }
    result();
    system ("pause");
    return 0;
}
 
void show_cells() {
    cout << "------------" << "\n" << endl;
    cout << "Numbers of cells:" << endl;
    cout << "-" << 1 << "-" << '|' << "-" << 2 << "-" << '|' << "-" << 3 << "-" << " |" << endl;
    cout << "-" << 4 << "-" << '|' << "-" << 5 << "-" << '|' << "-" << 6 << "-" << " |" <<  endl;
    cout << "-" << 7 << "-" << '|' << "-" << 8 << "-" << '|' << "-" << 9 << "-" << " |" << "\n" << endl;
 
    cout << "Current situation (--- is empty):" << endl;
    cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << " |" <<  endl;
    cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << " |" <<  endl;
    cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << " |" <<  "\n" << endl;
    cout << "------------\n" << endl;
}
 
void make_move(int num) {
    if (num == 1) cout << PlayerName1;
    else cout << PlayerName2;
    cout << ", enter a cell's number to make move: ";
    int cell;
    cin >> cell;
    cout << "\n";
    while (cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X') {
        cout << "Enter a CORRECT (1-9) or EMPTY (---) cell's number to make move: ";
        cin >> cell;
        cout << "\n";
    }
 
    if (num == 1)
        cells[cell-1] = 'X';
    else cells[cell-1] = 'O';
}
 
void result() {
    if (win=='X') cout << PlayerName1 << " win! Congratulations! " << PlayerName2 << " is looser! Bugoga..." << endl;
    else if (win=='O') cout << PlayerName2 << " win! Congratulations! " << PlayerName1 << " is looser! Bugoga..." << endl;
    else cout << "Draw!!!" << endl;
}
 
char check()
{
    int i;
    for(i = 0; i < 3; i++)
        if(cells[i*3+0] == cells[i*3+1] && cells[i*3+1] == cells[i*3+2] && cells[i*3+2] != '-')
            return cells[i*3+1];
        else if(cells[i] == cells[3+i] && cells[3+i] == cells[6+i] && cells[6+i] != '-')
            return cells[3+i];
    if((cells[0] == cells[4] && cells[4] == cells[8] ||
        cells[2] == cells[4] && cells[4] == cells[6]) &&
        cells[4] != '-')
        return cells[4];
    return '-';
}
Добавлено через 16 минут
1. избавились от не нужного goto. ибо не нужен он такой легкой программе.
2. избавились от лишней переменной.
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
08.08.2011, 13:22  [ТС]     Крестики-нолики #9
silentnuke, вот это уже работает. Большое спасибо.

Добавлено через 48 минут
Полтора часа тра... мучался со своим алгоритмом и понял, что он корявый
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
08.08.2011, 13:33     Крестики-нолики #10
я сразу говорил)
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
08.08.2011, 13:46  [ТС]     Крестики-нолики #11
Цитата Сообщение от silentnuke Посмотреть сообщение
я сразу говорил)
Там надо еще одно ограничение поставить) И это помимо 3-х вложенных циклов и 3 if-ов. Если интересно, то там (в моем алгоритме) если 3 ячейки идут подряд, но находятся в разных рядах, то это тоже считается выигрышной комбинацией, ведь, допустим (2 + 4) / 2 = 3. Но совершенствовать этот алгорит не имеет смысла, ведь твой занимает меньше кода и работает быстрее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2015, 14:50     Крестики-нолики
Еще ссылки по теме:

Крестики нолики C++
C++ Крестики нолики

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

Или воспользуйтесь поиском по форуму:
robertson88
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 10
01.11.2015, 14:50     Крестики-нолики #12
Ребят а есть эта программа с запоминанием всех вариантов их по формуле должно быть 2в9=512 возможных игр.Хочу их всех просмотреть если возможно.Киньте ехе у кого есть с запоминанием игр..спасибо
Yandex
Объявления
01.11.2015, 14:50     Крестики-нолики
Ответ Создать тему
Опции темы

Текущее время: 19:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru