Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
Bossx
-11 / 1 / 0
Регистрация: 14.02.2017
Сообщений: 188
Завершенные тесты: 2
1

Написать игру «Пятнашки»

31.03.2017, 16:53. Просмотров 4589. Ответов 33
Метки нет (Все метки)

Кто знает, как на С++ написать игру «Пятнашки». Программа должна содержать следующие функции:
  1. заполнение поля числами в случайном порядке;
  2. поиск позиции нуля;
  3. перестановки элементов(Left, Right, Up, Down);
  4. проверки окончания игры.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2017, 16:53
Ответы с готовыми решениями:

Подправьте игру пятнашки
Решил написать игрушку 15-ки я хочу что бы прога содержала такие функции: заполнение поля...

Есть заготовка для кода в игру пятнашки. Нужно подописывать функции (котовые после майна)
#include <stdio.h> #include<conio.h> #include <stdlib.h> #include <windows.h> #include <math.h>...

Си++ написать игру
Помогите пожалуйста написать игру на си ++,четыре в ряд!Очень нужно!!!!!

написать игру
Всем привет! Нужна срочно самая простая игра, написанная на С/С++, можно Паскаль. Сам персонаж...

Написать игру
Нужно игру написать,где есть три монстра и два игрока,у каждого игрока по 3 монстра. Эти монстры...

33
повар1
290 / 225 / 173
Регистрация: 24.02.2017
Сообщений: 859
Завершенные тесты: 1
31.03.2017, 22:34 2
можно использовать визуальную разработку приложения. На форму выносится 16 кнопок, которым присваиваються соответствующие числа рандомно. Одна кнопка пустая. Алгоритм работы приложения: обмен значениями между пустой кнопкой и кнопкой с числом (используя свойство caption кнопки).
0
Bossx
-11 / 1 / 0
Регистрация: 14.02.2017
Сообщений: 188
Завершенные тесты: 2
31.03.2017, 23:41  [ТС] 3
А есть варианты, как это можно на С++ написать?
0
GbaLog-
Любитель чаепитий
3171 / 1476 / 466
Регистрация: 24.08.2014
Сообщений: 5,211
Записей в блоге: 1
Завершенные тесты: 2
01.04.2017, 10:03 4
Цитата Сообщение от Bossx Посмотреть сообщение
как это можно на С++ написать?
на чистом с++ - никак.
0
01.04.2017, 10:03
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,134
Записей в блоге: 87
01.04.2017, 10:26 5
Bossx, вы можете найти пример этой игры в 15-м сообщении темы: http://www.cyberforum.ru/graphics/thread93716.html Используется C++ Builder.
0
Mohan
76 / 39 / 23
Регистрация: 03.02.2017
Сообщений: 104
Завершенные тесты: 2
01.04.2017, 11:20 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
Сообщение от Bossx
как это можно на С++ написать?
на чистом с++ - никак.
Можно сделать консольную версию с игровым полем в виде двумерного массива. Тем более раз поля должны быть заполнены числами. Для реализации игрового алгоритма этого достаточно.

04 10 05 01
08 00 09 03
11 02 06 13
07 12 15 14
0
GbaLog-
Любитель чаепитий
3171 / 1476 / 466
Регистрация: 24.08.2014
Сообщений: 5,211
Записей в блоге: 1
Завершенные тесты: 2
01.04.2017, 11:36 7
Цитата Сообщение от Mohan Посмотреть сообщение
Можно сделать консольную версию
никак не коррелирует с тем, о чем спрашивал ТС.
0
Mohan
76 / 39 / 23
Регистрация: 03.02.2017
Сообщений: 104
Завершенные тесты: 2
01.04.2017, 11:56 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
никак не коррелирует с тем, о чем спрашивал ТС.
Но он и не спрашивал про форму визуализации. Только про функции. А для них чистого С++ достаточно.
0
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
01.04.2017, 16:55 9
Цитата Сообщение от GbaLog- Посмотреть сообщение
на чистом с++ - никак.
Почему же? Можно сделать консольный интерфейс.
0
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,134
Записей в блоге: 87
01.04.2017, 19:41 10
Дилемма получается. С одной стороны кажется, что проще сделать GUI интерфейс с квадратными кнопками, а с другой - если человек никогда в жизни не работал с GUI, то может для него будет проще в консоле. Только не понятно, как сделать удобное взаимодействие с игрой в консоле?
0
Mohan
76 / 39 / 23
Регистрация: 03.02.2017
Сообщений: 104
Завершенные тесты: 2
01.04.2017, 19:53 11
Лучший ответ Сообщение было отмечено Bossx как решение

Решение

Вот моё видение для консоли. Интерфейс не оформлял.
Я нуб, поэтому критика приветствуется.

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 <vector>
#include <cstdlib>
#include <iomanip>
#include <conio.h>
 
using std::vector;
using std::cout;
 
const unsigned short SIZE = 4; // размер игрового поля
 
vector<int> in_game_map(SIZE); 
vector<vector<int>> game_map(SIZE, in_game_map); // игровая карта
 
vector<int> in_right_map(SIZE); 
vector<vector<int>> right_map(SIZE, in_right_map); // правильная итоговая карта
 
struct coordinate // хранилище координат нулевого элемента
{
    unsigned x;
    unsigned y;
} zero; // объект
 
void create_right_map() // создаем правильную карту заполненую по порядку
{
    unsigned right_value = 1;
    for (unsigned i = 0; i < SIZE; i++)
    {
        for (unsigned j = 0; j < SIZE; j++)
            right_map[i][j] = right_value++;
    }
    right_map[SIZE-1][SIZE-1] = 0; // нулевой элемент в нижний правый угол
}
 
void create_game_map() // рандомно создаем игровую карту
{
    unsigned limit = SIZE*SIZE;
    vector<int> temporary; // временный массив из которого будем брать значения в игровую карту
    for (unsigned i = 0; i < limit; i++)
        temporary.push_back(i);
 
    int value;
    for (unsigned i = 0; i < SIZE; i++)
    {
        for (unsigned j = 0; j < SIZE; j++)
        {
            value = rand() % limit--;
            game_map[i][j] = temporary[value];
            if (temporary[value] == 0) // сохраняем координаты нулевого элемента
            {
                zero.x = j;
                zero.y = i;
            }
            temporary.erase(temporary.begin() + value);
        }
    }
}
 
bool check_map() // сравнение игровой и правильной карты для определения конца игры
{
    if (game_map == right_map)
        return true;
    return false;
}
 
void up_move() // ход вверх (нулевой элемент вниз)
{
    if (zero.y < SIZE - 1)
    {
        game_map[zero.y][zero.x] = game_map[zero.y + 1][zero.x];
        zero.y++;
        game_map[zero.y][zero.x] = 0;
    }
}
 
void down_move() // ход вниз (нулевой элемент вверх)
{
    if (zero.y > 0)
    {
        game_map[zero.y][zero.x] = game_map[zero.y - 1][zero.x];
        zero.y--;
        game_map[zero.y][zero.x] = 0;
    }
}
 
void right_move() // ход вправо (нулевой элемент влево)
{
    if (zero.x > 0)
    {
        game_map[zero.y][zero.x] = game_map[zero.y][zero.x - 1];
        zero.x--;
        game_map[zero.y][zero.x] = 0;
    }
}
 
void left_move() // ход влево (нулевой элемент вправо)
{
    if (zero.x < SIZE - 1)
    {
        game_map[zero.y][zero.x] = game_map[zero.y][zero.x + 1];
        zero.x++;
        game_map[zero.y][zero.x] = 0;
    }
}
 
void get_direction() // определяем нажатую игроком стрелку
{
    int move = static_cast<int> (_getch()); // UP = 72, DOWN = 80, RIGHT = 77, LEFT = 75
    switch (move)
    {
        case 72:
        {
            up_move(); break;
        }
        case 80:
        {
            down_move(); break;
        }
        case 77:
        {
            right_move(); break;
        }
        case 75:
        {
            left_move(); break;
        }
        default:
        {
            get_direction();
        }
    }
}
void screen() // выводим массив на экран
{
    system("cls");
    for (unsigned i = 0; i < SIZE; i++)
    {
        for (unsigned j = 0; j < SIZE; j++)
        {
            if (game_map[i][j] != 0)
                cout << std::setw(2) << std::setfill('0') << game_map[i][j] << ' ';
            else
                cout << "** "; // нулевой элемент
        }
        cout << '\n';
    }
}
 
int main()
{
    srand(static_cast<int>(time(NULL)));
    
    create_right_map(); // создание игровых карт
    do
    {
        create_game_map();
    } while (check_map());
    
    do // игровой цикл
    {
        screen();
        get_direction();
    }
    while (!check_map());
 
    cout << "\nYou win!\nGame over!\n";
    _getch();
}
1
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,134
Записей в блоге: 87
01.04.2017, 20:03 12
Точно! Клавишами-стрелками же можно загонять числа в свободную клетку. Молодец!
0
Bossx
-11 / 1 / 0
Регистрация: 14.02.2017
Сообщений: 188
Завершенные тесты: 2
12.04.2017, 16:55  [ТС] 13
Есть еще у кого-то варианты?
0
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
12.04.2017, 19:02 14
Цитата Сообщение от Bossx Посмотреть сообщение
Есть еще у кого-то варианты?
Полный гугл их http://bfy.tw/BBmG
0
8Observer8
2704 / 1663 / 293
Регистрация: 05.10.2013
Сообщений: 5,134
Записей в блоге: 87
12.04.2017, 22:24 15
Цитата Сообщение от Bossx Посмотреть сообщение
Есть еще у кого-то варианты?
А консольный вариант от Mohan вам не понравился? Почему?

Кликните здесь для просмотра всего текста

На C# не пойдёт? Пример из книги: Puzzle.rar

Книга называется: Microsoft Visual C# в задачах и примерах

Написать игру «Пятнашки»

0
Mohan
76 / 39 / 23
Регистрация: 03.02.2017
Сообщений: 104
Завершенные тесты: 2
13.04.2017, 06:41 16
Пусть и не понравился, поправки в код:
Для инициализации векторов, достаточно объявления одного вектора.
C++
1
2
3
vector<int> in_map(SIZE); 
vector<vector<int>> game_map(SIZE, in_map); // игровая карта
vector<vector<int>> right_map(SIZE, in_map); // правильная итоговая карта
Нулевой элемент лучше и логичнее смотрится в виде пустого пространства, а не в виде звёздочек.
C++
1
2
3
// screen()
 else
       cout << "   "; // нулевой элемент - 3 пробела
Баг - завершающий ход не отобразится, поэтому...
C++
1
2
3
screen();
cout << "\nYou win!\nGame over!\n";
_getch();
0
GoshaM
210 / 99 / 35
Регистрация: 02.06.2016
Сообщений: 226
13.04.2017, 12:48 17
Mohan, случайная карта имеет решение с вероятностью 50%
1
Mohan
76 / 39 / 23
Регистрация: 03.02.2017
Сообщений: 104
Завершенные тесты: 2
13.04.2017, 13:33 18
GoshaM, да, действительно. Спасибо за информацию.
Если пойти по пути наименьшего сопротивления, то можно считать выигрышной и положение с нулевым элементом в верхнем левом углу.
0
Bossx
-11 / 1 / 0
Регистрация: 14.02.2017
Сообщений: 188
Завершенные тесты: 2
13.04.2017, 19:33  [ТС] 19
8Observer8, Да мне то нравится, но нужно по заданию сделать на С++, и с теми условиями, которые я написал в описании темы.
0
DevAlone
324 / 276 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
13.04.2017, 19:41 20
Цитата Сообщение от Bossx Посмотреть сообщение
8Observer8, Да мне то нравится, но нужно по заданию сделать на С++, и с теми условиями, которые я написал в описании темы.
Так возьми и сделай, в чём проблема?
1
13.04.2017, 19:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2017, 19:41

Написать игру кости
Здравствуйте, стоит вот такая задача: &quot;Основное правило игры в кости — каждый игрок по очереди...

Написать игру гонки
Прошу написать игру гонки в которые играют на тетырсе!

Написать игру «Питон»
Написать игру «Питон». Игрок управляет питоном, который постоянно движется. На карте по одному...


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

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

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