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

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

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

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

08.09.2013, 18:00. Просмотров 345. Ответов 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
#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     Крестики-нолики ревью
Посмотрите здесь:

Крестики нолики 10 на 10 - C++
Нашел код крестики нолики 4 на 4 но не компилируется, там ошибки почему то в &lt;&lt; хочу сделать из него 10 на 10 Может кто нибудь...

Крестики-нолики - C++
Всем привет и заранее спасибо, кто откликнется. Проблема следующая: игра работает почти корректно, за исключением одной детали: при вызове...

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

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

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

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

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

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

Крестики-нолики - C++
При запуске выдаёт ошибку error LNK2001: неразрешенный внешний символ &quot;&quot;char __cdecl check(void)&quot; (?check@@YADXZ)&quot; Судя по всему,...

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


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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     Крестики-нолики ревью
Ответ Создать тему
Опции темы

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