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

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

Восстановить пароль Регистрация
 
BigStrangeBeing
0 / 0 / 0
Регистрация: 03.09.2013
Сообщений: 2
08.09.2013, 18:00     Крестики-нолики ревью #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
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
#include <iostream>
#include <clocale>
 
using namespace std;
 
void show_board(char[]);
int get_move();
bool check_state(char[]);
bool check_cell(char[], int);
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
 
    int const BOARD_SISE = 9;
    char board[BOARD_SISE] = {};
    for (int i = 0; i < BOARD_SISE; i++)
    {
        board[i] = '-';
    }
 
    bool game_state = true;
    int user_move = 0;
    int count = 1;
 
    while (game_state)
    {
        show_board(board);
        user_move = get_move();
        
        while (check_cell(board, user_move - 1))
        {
            if (count % 2 != 0)
            {
                board[user_move - 1] = 'X';
            }
            else
            {
                board[user_move - 1] = 'O';
            }
        }
        
        game_state = check_state(board);
        count++;
    }
 
    show_board(board);
    cout << endl;
    cout << "Победа!!!" << endl;
 
    return 0;
}
 
void show_board(char board[])
{
    system("cls");
 
    cout << endl;
    cout << "Опции выбора:" << endl;
    cout << "-1-|-2-|-3-" << endl;
    cout << "-4-|-5-|-6-" << endl;
    cout << "-7-|-8-|-9-" << endl;
    
    cout << endl;
    cout << "Доска:" << endl;
    cout << "-" << board[0] << "-|-" << board[1] << "-|-" << board[2] << "-" << endl;
    cout << "-" << board[3] << "-|-" << board[4] << "-|-" << board[5] << "-" << endl;
    cout << "-" << board[6] << "-|-" << board[7] << "-|-" << board[8] << "-" << endl;
}
 
int get_move()
{
    cout << endl;
    cout << "Ваш ход: ";
 
    int move;
    cin >> move;
 
    if (move < 1 || move > 9)
    {
        cout << "Введите правильное число (1-9): ";
        cin >> move;
    }
 
    return move;
}
 
bool check_state(char board[])
{
    bool state = true;
 
    if (board[0] == 'X' && board[1] == 'X' && board[2] == 'X') state = false;
    if (board[3] == 'X' && board[4] == 'X' && board[5] == 'X') state = false;
    if (board[6] == 'X' && board[7] == 'X' && board[8] == 'X') state = false;
    if (board[0] == 'X' && board[3] == 'X' && board[6] == 'X') state = false;
    if (board[1] == 'X' && board[4] == 'X' && board[7] == 'X') state = false;
    if (board[2] == 'X' && board[5] == 'X' && board[8] == 'X') state = false;
    if (board[0] == 'X' && board[4] == 'X' && board[8] == 'X') state = false;
    if (board[6] == 'X' && board[4] == 'X' && board[2] == 'X') state = false;
 
    if (board[0] == 'O' && board[1] == 'O' && board[2] == 'O') state = false;
    if (board[3] == 'O' && board[4] == 'O' && board[5] == 'O') state = false;
    if (board[6] == 'O' && board[7] == 'O' && board[8] == 'O') state = false;
    if (board[0] == 'O' && board[3] == 'O' && board[6] == 'O') state = false;
    if (board[1] == 'O' && board[4] == 'O' && board[7] == 'O') state = false;
    if (board[2] == 'O' && board[5] == 'O' && board[8] == 'O') state = false;
    if (board[0] == 'O' && board[4] == 'O' && board[8] == 'O') state = false;
    if (board[6] == 'O' && board[4] == 'O' && board[2] == 'O') state = false;
 
    return state;
}
 
bool check_cell(char board[], int cell)
{
    if (board[cell] != '-')
    {
        return false;
    }
    
    return true;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 18:00     Крестики-нолики ревью
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.09.2013, 18:37     Крестики-нолики ревью #2
Цитата Сообщение от BigStrangeBeing Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool check_state(char board[])
{
* * bool state = true;
if (board[0] == 'X' && board[1] == 'X' && board[2] == 'X') state = false;
* * if (board[3] == 'X' && board[4] == 'X' && board[5] == 'X') state = false;
* * if (board[6] == 'X' && board[7] == 'X' && board[8] == 'X') state = false;
* * if (board[0] == 'X' && board[3] == 'X' && board[6] == 'X') state = false;
* * if (board[1] == 'X' && board[4] == 'X' && board[7] == 'X') state = false;
* * if (board[2] == 'X' && board[5] == 'X' && board[8] == 'X') state = false;
* * if (board[0] == 'X' && board[4] == 'X' && board[8] == 'X') state = false;
* * if (board[6] == 'X' && board[4] == 'X' && board[2] == 'X') state = false;
if (board[0] == 'O' && board[1] == 'O' && board[2] == 'O') state = false;
* * if (board[3] == 'O' && board[4] == 'O' && board[5] == 'O') state = false;
* * if (board[6] == 'O' && board[7] == 'O' && board[8] == 'O') state = false;
* * if (board[0] == 'O' && board[3] == 'O' && board[6] == 'O') state = false;
* * if (board[1] == 'O' && board[4] == 'O' && board[7] == 'O') state = false;
* * if (board[2] == 'O' && board[5] == 'O' && board[8] == 'O') state = false;
* * if (board[0] == 'O' && board[4] == 'O' && board[8] == 'O') state = false;
* * if (board[6] == 'O' && board[4] == 'O' && board[2] == 'O') state = false;
return state;
}
тут всё стоит переправить. Например, зачем после срабатывания какого-либо из условий присваивается state=false а затем продолжается проверка? Не проще ли заменить это на return false?

Почему доска представлена в виде одномерного массива, а не двумерного? В принципе, одномерный тоже имеет право на существование, но не проще ли иметь board[3][3] ???

Зачем копипастить эти 14 одинаковых строчек? Это называется "индусский код" ? Не легче воспользоваться циклом?
BigStrangeBeing
0 / 0 / 0
Регистрация: 03.09.2013
Сообщений: 2
08.09.2013, 21:09  [ТС]     Крестики-нолики ревью #3
Kuzia domovenok, на счет двумерного массива - это я действительно сглупил,
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не проще ли заменить это на return false?
где-то читал что возвращать напрямую false или true не есть хорошо, но сам если честно даже не задумывался об этом,
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не легче воспользоваться циклом?
если честно не совсем понимаю как?
Yandex
Объявления
08.09.2013, 21:09     Крестики-нолики ревью
Ответ Создать тему
Опции темы

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