Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
27.01.2024
Размер:
32.29 Кб
Скачать

Варіант 6

Лабораторна робота 8

Тема роботи: Гра «П’ятнашки»

Завдання.

Розробити програму, яка реалізує гру «П’ятнашки» у консольному варіанті. Гра представляє собою квадратне поле, в клітинах якого розміщуються гральні фішки з числами. Одна клітина залишається вільною. Користувач повинен пересувати гральні фішки по полю, використовуючи пусту клітину. Мета гри - впорядкувати фішки за зростанням по рядках грального поля, при цьому пуста клітина повинна бути в правому нижньому куті грального поля.

Розробку проводити за технологією ООП. Для цього потрібно розробити два класи.

1. Клас, який реалізує поняття фішки: елемент грального поля, який визначається своїм розташуванням на гральному полі та числовим значенням. Пуста фішка позначається числом 0. Методи обрати самостійно за потребою.

    1. 2. Клас, який реалізує гральне поле. Клас визначається розміром поля d (значення виключно в діапазоні 3 – 9) та множиною фішок, розташованих на ньому. В класі повинні бути передбачені: a. стандартний конструктор, який створює поле розміром

b. додатковий конструктор, який створює поле з розміром, вказаним користувачем;

c. метод заповнення грального поля у випадковому порядку. Номери фішок повинні генеруватися в діапазоні: максимальне значення = d2-1; мінімальне значення=1. Пуста клітина повинна розташовуватися в правому нижньому куті поля.

3х3;

    1. d. метод заповнення грального поля у такому порядку: в лівому верхньому куті розташовується максимальне значення (d2-1). Далі заповнення відбувається по рядках зі зменшенням кожного наступного значення на 1 до мінімального значення (1).

    2. e. Метод друку грального поля на екрані.

    3. f. Метод, який визначає, чи можна вказану користувачем фішку перемістити на полі в даний час.

    4. g. Метод, який виконує переміщення вказаної користувачем фішки.

    5. h. Метод, що перевіряє, чи знаходиться поле у виграшному стані.

Зверніть увагу: якщо максимальне значення є непарним, то потрібно дві останні фішки (зі значеннями «2» та «1») поміняти місцями.

• Виконати завдання;

• Побудувати блок-схему алгоритму;

• Оформити звіт;

• Дати відповіді на контрольні питання;

• Зробити висновки.

#include <iostream>

#include <conio.h>

#include <windows.h>

#include <conio.h>

#include <ctime>

using namespace std;

bool gameover;

int zahod = 0;

enum InputKey

{

LEFT,

RIGHT,

UP,

DOWN,

STOP,

};

InputKey key;

class Field;

class Chip;

class Field

{

int arr[9][9];

int mas[81];

int razmer;

int chips;

public:

Field()

{

//Zapolnenie_Random(3);

//ShowField(3);

}

Field(int d)

{

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

}

}

}

void Povtor(int d, int temp) // проверка и перезаполнения элементов массива если есть это число уже используется

{

int per = temp;

for (int i = 0; i < temp; i++)

{

per--;

while (mas[temp] == mas[per])

{

mas[temp] = rand() % (d * d - 1) + 1;

}

}

}

void Zapolnenie_Random(int d) // заполнения массива рандомными числами без повторений

{

for (int i = 0; i < d * d; i++)

{

if (i == 0) // присвоение первому элементу массива число

{

mas[i] = rand() % (d * d - 1) + 1;

continue;

}

mas[i] = rand() % (d * d - 1) + 1; // присвоение остальных элементов числам

for (int k = 0; k < d * d; k++) // рандом без повторений

{

Povtor(d, i);

}

}

Preobrazovanie(d);

}

void Preobrazovanie(int d)

{

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

if (i == d - 1 && j == d - 1) // пустая фишка в правом нижнем углу

{

arr[i][j] = 0;

continue;

}

arr[i][j] = mas[i * d + j];

}

}

}

int Zapolnenie_Ubivanie(int d) // функция заполнения двумерного массива по убыванию

{

int uvelichenie = 0;

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

uvelichenie++;

if (i == d - 1 && j == d - 1)

{

arr[i][j] = 0;

return 0;

}

if (i == 0 && j == 0)

{

arr[i][j] = (d * d) - 1;

continue;

}

arr[i][j] = (d * d) - uvelichenie;

}

}

return 1;

}

void ShowField(int d) // функция вывода двумерного массива на экран пользователя

{

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

if (arr[i][j] < 10) // чтобы все числа были под друг другом

cout << " ";

cout << arr[i][j] << " ";

}

cout << endl;

}

cout << "Количество ходов: " << zahod << endl;

}

int Proverka_Pobeda(int d)

{

int shodstvo = 0;

int mas[9][9];

int uvelichenie = 1;

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

if (i == 0 && j == 0)

{

mas[i][j] = uvelichenie;

continue;

}

if (i == (d - 1) && j == (d - 1))

{

mas[i][j] = 0;

continue;

}

uvelichenie++;

mas[i][j] = uvelichenie;

}

}

for (int i = 0; i < d; i++)

{

for (int j = 0; j < d; j++)

{

if (mas[i][j] == arr[i][j])

shodstvo++;

}

}

if (shodstvo == d * d)

{

cout << "Поздравляем, Вы победили!";

return 1;

}

}

friend class Chip;

};

class Chip

{

int x, y;

int value;

public:

void Setup(int d)

{

gameover = 0;

x = d - 1;

y = d - 1;

value = 0;

key = STOP;

}

void Input()

{

if (_kbhit())

{

switch (_getch())

{

case 'w':

key = UP;

break;

case 'W':

key = UP;

break;

case 's':

key = DOWN;

break;

case 'S':

key = DOWN;

break;

case 'a':

key = LEFT;

break;

case 'A':

key = LEFT;

break;

case 'd':

key = RIGHT;

break;

case 'D':

key = RIGHT;

break;

}

}

}

int Logic(Field & pole, int d)

{

int temp;

switch (key)

{

case UP:

if (Proverka(d) == 0) return 0;

x--;

pole.arr[x + 1][y] = pole.arr[x][y];

pole.arr[x][y] = 0;

key = STOP;

zahod++;

break;

case DOWN:

if (Proverka(d) == 0) return 0;

x++;

pole.arr[x - 1][y] = pole.arr[x][y];

pole.arr[x][y] = 0;

key = STOP;

zahod++;

break;

case LEFT:

if (Proverka(d) == 0) return 0;

y--;

pole.arr[x][y + 1] = pole.arr[x][y];

pole.arr[x][y] = 0;

key = STOP;

zahod++;

break;

case RIGHT:

if (Proverka(d) == 0) return 0;

y++;

pole.arr[x][y - 1] = pole.arr[x][y];

pole.arr[x][y] = 0;

key = STOP;

zahod++;

break;

}

return 1;

}

int Proverka(int d)

{

switch (key)

{

case UP:

if (x <= 0)

return 0;

else

break;

case DOWN:

if(x >= d-1)

return 0;

else

break;

case LEFT:

if (y <= 0)

return 0;

else

break;

case RIGHT:

if (y >= d-1)

return 0;

else

break;

}

return 1;

}

friend class Field;

};

int main()

{

srand(time(NULL));

int razmer_polya;

int vibor;

setlocale(LC_ALL, "Russian");

cout << "Укажите размер поля" << endl;

cin >> razmer_polya;

Field pole;

Chip fishka;

cout << "Введите способ заполнения поля(1 - рандомными числами, 2 - числами по убыванию): " << endl;

cin >> vibor;

system("cls");

switch (vibor)

{

case 1:

{

pole.Zapolnenie_Random(razmer_polya);

break;

}

case 2:

{

pole.Zapolnenie_Ubivanie(razmer_polya);

break;

}

}

fishka.Setup(razmer_polya);

while (gameover == false)

{

pole.ShowField(razmer_polya);

if (pole.Proverka_Pobeda(razmer_polya) == 1)

{

gameover = true;

return 0;

}

fishka.Input();

fishka.Logic(pole, razmer_polya);

system("cls");

}

system("pause");

return 0;

}

Скріншот роботи програми:

Висновки:

На лабораторній роботі я закріпив свої навички роботи з класами. І навчився грати в п’ятнашки. Дуже крута гра.

Соседние файлы в папке еще какието лабки разных вариантов