Puzzle
Alexmegawin
c_cpp
a year ago
5.1 kB
2
Indexable
Never
#include <iostream> #include <fstream> #include <conio.h> #include <windows.h> using namespace std; class Puzzle { private: int size; int** field; int x, y; int count = 0; bool is_win() { int k = 1; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (field[i][j] != k && !(i == size - 1 && j == size - 1)) return false; k++; } } return true; } public: Puzzle(int _size) { size = _size; field = new int* [size]; for (int i = 0; i < size; i++) field[i] = new int[size]; int k = 1; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { field[i][j] = k; k++; } } x = size - 1; y = size - 1; field[x][y] = 0; srand(time(0)); for (int i = 0; i < size * size * 100; i++) { int r = rand() % 4; switch (r) { case 0: move_left(); break; case 1: move_right(); break; case 2: move_up(); break; case 3: move_down(); break; } } } ~Puzzle() { for (int i = 0; i < size; i++) delete[] field[i]; delete[] field; } void print_field() { for (int k = 0; k < size; k++) { cout << "#####"; } cout << "#" << endl; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (field[i][j] == 0) cout << "| " << " "; else if (field[i][j] < 10) cout << "| " << field[i][j] << " "; else cout << "| " << field[i][j] << " "; } cout << "|" << endl; for (int k = 0; k < size; k++) { cout << "#####"; } cout << "#" << endl; } } void move_left() { if (y == size - 1) return; field[x][y] = field[x][y + 1]; field[x][y + 1] = 0; y++; } void move_right() { if (y == 0) return; field[x][y] = field[x][y - 1]; field[x][y - 1] = 0; y--; } void move_up() { if (x == size - 1) return; field[x][y] = field[x + 1][y]; field[x + 1][y] = 0; x++; } void move_down() { if (x == 0) return; field[x][y] = field[x - 1][y]; field[x - 1][y] = 0; x--; } void run_game() { char ch; do { if (is_win()) { int a = 0; system("cls"); ifstream fin; fin.open("record.txt"); fin >> a; if (a == 0 || a > count) { ofstream fout; fout.open("record.txt"); fout << count; fout.close(); } fin.close(); cout << " Ты победил!"; cout << endl << "Число ходов - " << count; if (count < a || a == 0) cout << endl << "Это новый рекорд!"; else cout << endl << "Твой рекорд - " << a << " ходов"; return; } system("cls"); cout << " Пятнашки"; cout << endl << " Чтобы выйти, нажмите Q" << endl << endl; print_field(); cout << endl << "Число ходов - " << count << endl; ch = _getch(); switch (ch) { case 'a': { if (!(y == size - 1)) count++; move_left(); break; } case 'd': { if (!(y == 0)) count++; move_right(); break; } case 'w': { if (!(x == size - 1)) count++; move_up(); break; } case 's': { if (!(x == 0)) count++; move_down(); break; } } } while (ch != 'q'); } }; int main() { setlocale(LC_ALL, "Russian"); Puzzle game(4); game.run_game(); return 0; }