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

Как оптимизировать данный код игры крестики нолики? - C++

Восстановить пароль Регистрация
 
Oleg98
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 41
04.08.2014, 15:49     Как оптимизировать данный код игры крестики нолики? #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
#include <iostream>
#include <locale>
 
using namespace std;
 
void fieldConstruction (char gf[3][3]) 
{
    cout << "--1---2---3--\n";
    cout << "1 " << gf[0][0] << " | " << gf[0][1] << " | " << gf[0][2] << " |\n";
    cout << "-------------\n";
    cout << "2 " << gf[1][0] << " | " << gf[1][1] << " | " << gf[1][2] << " |\n";
    cout << "-------------\n";
    cout << "3 " << gf[2][0] << " | " << gf[2][1] << " | " << gf[2][2] << " |\n";
    cout << "-------------\n";
}
 
char testWinner (char gf[3][3])
{
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[1][1])&&(gf[1][1]==gf[2][2])) return gf[0][0]; else
    if ((gf[2][0] != ' ')&&(gf[2][0] == gf[1][1])&&(gf[1][1]==gf[0][2])) return gf[2][0]; else 
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[0][1])&&(gf[0][1]==gf[0][2])) return gf[0][0]; else 
    if ((gf[1][0] != ' ')&&(gf[1][0] == gf[1][1])&&(gf[1][1]==gf[1][2])) return gf[1][0]; else 
    if ((gf[2][0] != ' ')&&(gf[2][0] == gf[2][1])&&(gf[2][1]==gf[2][2])) return gf[2][0]; else
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[1][0])&&(gf[1][0]==gf[2][0])) return gf[0][0]; else 
    if ((gf[0][1] != ' ')&&(gf[0][1] == gf[1][1])&&(gf[1][1]==gf[2][1])) return gf[0][1]; else 
    if ((gf[0][2] != ' ')&&(gf[0][2] == gf[1][2])&&(gf[1][2]==gf[2][2])) return gf[0][2]; else
    return 'n';
}
 
int main()
{
    setlocale (LC_ALL, "Russian");
 
    cout << "Добро пожаловать!!! \nДанная игра называется \"Крестики нолики\"\n";
    cout << "Поле игры: \n";
    char gameField[3][3] = {{' ', ' ', ' '},
                            {' ', ' ', ' '}, 
                            {' ', ' ', ' '}};
    int x, y;
    int player = 1;
    int freeCell = 9;
    bool winner = false; 
    char whoWinner;
 
    while (freeCell != 0 && !winner)
    {
        fieldConstruction(gameField);
        bool error = false;
        cout << player << " игрок введите координаты (X, Y): ";
        do
        {
            cin >> x >> y;
            if ((x > 3 || y > 3) || (gameField[y-1][x-1] != ' '))
            {
                cout << "Данная ячейка занята или не существует.\nВведите другие координаты: ";
                error = true;
            }
            else
            {
                error = false;
            }
        } while (error);
 
        if (player == 1){
            gameField[y-1][x-1] = 'X';
            player = 2;
        }
        else
        {
            gameField[y-1][x-1] = '0';
            player = 1;
        }
        freeCell--;
        system("cls");
        whoWinner = testWinner(gameField);
        if (whoWinner != 'n')
        {
            winner = true;
        }
        else
        {
            winner = false;
        }
    }
 
    fieldConstruction(gameField);
    
    if (whoWinner == 'X') cout << "Победил 1 игрок!!!\n"; else
    if (whoWinner == '0') cout << "Победил 2 игрок!!!\n"; else
    cout << "Ничья!!! \n";
 
    system ("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 15:49     Как оптимизировать данный код игры крестики нолики?
Посмотрите здесь:

Крестики-нолики C++
Крестики нолики(сократить код) C++
C++ Логика для игры крестики нолики
C++ Крестики-нолики: как определить победителя?
C++ Народ нужен рабочи код Крестики-нолики на visual studio 2010
C++ Оптимизация кода игры в крестики нолики.
C++ Приделать к коду игры крестики нолики ИИ
C++ Крестики-нолики - алгоритм для игры против ПК

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
04.08.2014, 17:10     Как оптимизировать данный код игры крестики нолики? #2
1) Так вводить данные не очень удобно, сделайте своеобразный прицел, где сейчас указатель и стрелками передвигаем его и по нажатию Enter ставим знак в соответсвии чей сейчас ход.
2) Человеку понятней 'X' 'Y' ' ' - но компьютеру то зачем эти числа(символы). Храните -1 0 1. Тогда иниц массива
C++
1
char gameField[3][3] = {};
внесение данных
C++
1
gf[x-1][y-1]++;
C++
1
gf[x-1][y-1]--;
3) Функция testWinner() перепишите циклами: если будет реализован 2 пункт, то просто ищем сумму гор, вер и диагоналей: если где-то сума будет 3 или -3, то возращаем победу.
4) Реализация freeCell кстате прикольная - ниразу не видел такого тут у первокурсников. Все пихали это дело в проверку на победу. Молодец
Oleg98
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 41
06.08.2014, 22:32  [ТС]     Как оптимизировать данный код игры крестики нолики? #3
Как вам такое:
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
#include <iostream>
#include <locale>
#include <conio.h>
 
void fieldConstruction (char gf[3][3]) 
{
    std::cout << "-------------\n";
    std::cout << "| " << gf[0][0] << " | " << gf[0][1] << " | " << gf[0][2] << " |\n";
    std::cout << "-------------\n";
    std::cout << "| " << gf[1][0] << " | " << gf[1][1] << " | " << gf[1][2] << " |\n";
    std::cout << "-------------\n";
    std::cout << "| " << gf[2][0] << " | " << gf[2][1] << " | " << gf[2][2] << " |\n";
    std::cout << "-------------\n";
}
 
char testWinner (char gf[3][3])
{
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[1][1])&&(gf[1][1]==gf[2][2])) return gf[0][0]; else
    if ((gf[2][0] != ' ')&&(gf[2][0] == gf[1][1])&&(gf[1][1]==gf[0][2])) return gf[2][0]; else 
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[0][1])&&(gf[0][1]==gf[0][2])) return gf[0][0]; else 
    if ((gf[1][0] != ' ')&&(gf[1][0] == gf[1][1])&&(gf[1][1]==gf[1][2])) return gf[1][0]; else 
    if ((gf[2][0] != ' ')&&(gf[2][0] == gf[2][1])&&(gf[2][1]==gf[2][2])) return gf[2][0]; else
    if ((gf[0][0] != ' ')&&(gf[0][0] == gf[1][0])&&(gf[1][0]==gf[2][0])) return gf[0][0]; else 
    if ((gf[0][1] != ' ')&&(gf[0][1] == gf[1][1])&&(gf[1][1]==gf[2][1])) return gf[0][1]; else 
    if ((gf[0][2] != ' ')&&(gf[0][2] == gf[1][2])&&(gf[1][2]==gf[2][2])) return gf[0][2]; else
    return 'n';
}
 
int main()
{
    setlocale (LC_ALL, "Russian");
 
    char gameField[3][3] = {{' ', ' ', ' '}, 
                            {' ', '+', ' '}, 
                            {' ', ' ', ' '}};
    int x(1), y(1);
    int player = 1;
    int freeCell = 9; 
    int key;
    bool winner = false;
    char whoWinner;
    char contentCell(' ');
 
    std::cout << "Добро пожаловать!!! \nДанная игра называется \"Крестики нолики\"\n";
    std::cout << "Управление в игре:\n";
    std::cout << "Управление в игре осуществляется стелкали Вверх, Вниз, Вправо, Влево. \nПри нажатии ENTER на текущей, свободной, ячейке будет установлен Х или 0 в зависимости чей ход.\n";
    std::system ("pause");
    std::system ("cls");
    while (freeCell != 0 && !winner)
    {
        std::cout << player << " игрок ходит\n";
        fieldConstruction(gameField);
        key = getch();
        if (key == 224 || key == 13)
        {
            key = (key != 13) ? getch() : 13;
            switch (key)
            {
            case 72:
                if (y > 0)
                {
                    gameField[y][x] = contentCell;
                    y--;
                    contentCell = gameField[y][x];
                    gameField[y][x] = '+';
                }
                break;
            case 77:
                if (x < 2)
                {
                    gameField[y][x] = contentCell;
                    x++;
                    contentCell = gameField[y][x];
                    gameField[y][x] = '+';
                }
                break;
            case 80:
                if (y < 2)
                {
                    gameField[y][x] = contentCell;
                    y++;
                    contentCell = gameField[y][x];
                    gameField[y][x] = '+';
                } 
                break;
            case 75:
                if (x > 0)
                {
                    gameField[y][x] = contentCell;
                    x--;
                    contentCell = gameField[y][x];
                    gameField[y][x] = '+';
                }
                break;
            default:
                if (contentCell == ' ')
                {
                    freeCell--;
                    if (player == 1)
                    {
                        gameField[y][x] = 'X';
                        player = 2;
                    }
                    else
                    {
                        gameField[y][x] = '0';
                        player = 1;
                    }
                    contentCell = gameField[y][x];
                }
            }
        }
        std::system("cls");
 
        // проверка на победу.
        whoWinner = testWinner(gameField);
 
        winner = (whoWinner != 'n') ? true : false;
    }
 
    fieldConstruction(gameField);
    
    if (whoWinner == 'X') std::cout << "Победил 1 игрок!!!\n"; else
    if (whoWinner == '0') std::cout << "Победил 2 игрок!!!\n"; else
    std::cout << "Ничья!!! \n";
 
    std::system ("pause");
    return 0;
}
Yandex
Объявления
06.08.2014, 22:32     Как оптимизировать данный код игры крестики нолики?
Ответ Создать тему
Опции темы

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