https://pastein.ru/t/kw
скопируйте уникальную ссылку для отправки
// игра "Пятнашки"
// управление стрелками
#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();
}