Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- //#include "game/engine.h"
- //#include "game/engine.cpp"
- class World{
- public:
- //bool bTols[5]; //Tols
- /*
- bTols[0]:
- 0 - Мир пустой/играбелен
- 1 - Мир переполнен/неиграбелен
- bTols[1]
- */
- char sPlayerName[10];
- int nScore; // Очки за игру
- int nWorldCopy[4][4]; // Копия мира, для проверки на изменение
- int nWorld[4][4]; //World
- // Начальные
- void SetWorldToZero();
- void SetPlayerName();
- //Основные
- void Display(bool type); //Вывод в консоль
- void SpawnNumber(bool nMove[4]); //Спавнит числа с зависимостью от предыдущего действия
- void PlayerCommander(); //Принимает команды на движение
- bool WorldChecker(); //Проверяет мир на возможность хода: если return - 0 то мир играбелен, иначе не играбелен
- void RecursionFN(); //Рекурсивная функция для повторного вызова функции PlayerCommander()
- //Управление
- bool MoveUP();
- bool MoveDown();
- bool MoveLeft();
- bool MoveRight();
- };
- int main(){
- World gm;
- gm.SetPlayerName(); //Ввод ника игрока
- int nGames = 0;
- for(;;nGames++){
- gm.nScore = 0;
- std::cout << "----------------------------\nGame: " << nGames << "\n";
- /*
- Цикл всей игры
- */
- gm.SetWorldToZero(); //Установка всему массиву значение 0
- gm.Display(1); //Вывод ника игрока
- bool st[4] = {0,0,0,0}; //Вызов первоначального спавна
- gm.SpawnNumber(st); //Спавн произвольных чисел
- for (;;){
- /*
- Цикл "вложенной" игры
- */
- gm.Display(0); //Вывод массива в консоль
- if (gm.WorldChecker() != 0){
- std::cout << "\t\t----Game Over!----\n\tScore: " << gm.nScore;
- break;
- }
- gm.PlayerCommander(); //Просит ввести команду
- }
- }
- }
- void World::PlayerCommander(){
- char command;
- std::cout << " (h, w,a,s,d) " << sPlayerName << " :>> ";
- bool statusW = 1;
- for (;statusW == 1;){
- std::cin >> command;
- switch (command){
- //UP
- case 'w':
- if (MoveUP() == 0){
- bool st[4] = {0,0,0,1};
- SpawnNumber(st);
- statusW = 0;
- } else {
- std::cout << "--- NO! ---";
- }
- break;
- case 'W':
- if (MoveUP() == 0){
- bool st[4] = {0,0,0,1};
- SpawnNumber(st);
- statusW = 0;
- } else {
- std::cout << "--- NO! ---";
- }
- break;
- //Down
- case 's':
- break;
- case 'S':
- break;
- //Left
- case 'a':
- break;
- case 'A':
- break;
- //Right
- case 'd':
- break;
- case 'D':
- break;
- //Help
- case 'h':
- std::cout << "\n-----------------------\n\t---2048---\n-----------------------\n\n";
- break;
- default:
- std::cout << "\n Command incorect!\n";
- break;
- }
- break;
- }
- }
- void World::SpawnNumber(bool nMove[4]){
- /*
- nMove = {0,0,0,0}:
- Спавн рандомных точек
- nMove = {0,0,0,1}:
- UP Спавн точки в x: 2-3 y: 0-3
- nMove = {0,0,1,0}:
- DOWN Спавн точки в x: 0-1 y: 0-3
- nMove = {0,1,0,0}:
- LEFT Спавн точки в x: 0-3 y: 2-3
- nMove = {1,0,0,0}:
- RIGHT Спавн точки в x: 0-3 y: 0-1
- */
- /*
- Для UP
- */
- if (nMove[0] == 0 && nMove[1] == 0 && nMove[2] == 0 && nMove[3] == 1){
- for (;;){
- bool nTypeBlock = rand()%2;
- int nBlock;
- int nRandomPosX = rand()%3;
- int nRandomPosY = rand()%4;
- if (nTypeBlock == 1){
- nBlock = 2;
- } else {
- nBlock = 4;
- }
- if (nRandomPosX == 0){
- nRandomPosX = 1;
- } else if (nRandomPosX == 1) {
- nRandomPosX = 2;
- } else {
- nRandomPosX = 3;
- }
- if (nWorld[nRandomPosX][nRandomPosY] == 0){
- nWorld[nRandomPosX][nRandomPosY] = nBlock;
- break;
- }
- }
- }
- //Установка блоков в самом начале:
- if (nMove[0] == 0 && nMove[1] == 0 && nMove[2] == 0 && nMove[3] == 0){
- int nCollvo;
- for (;;){
- //Проверка на не пустой спавн
- int nColichestvo = rand()%4; //Количество блоков в начале
- if (nColichestvo != 0){
- nCollvo = nColichestvo;
- break;
- }
- }
- for (int i = 0; i < nCollvo; i++){
- int nRandomPosX = rand()%4;
- int nRandomPosY = rand()%4;
- bool nTypeBlock = rand()%2;
- switch (nTypeBlock){
- case 0:
- nWorld[nRandomPosX][nRandomPosY] = 2;
- break;
- case 1:
- nWorld[nRandomPosX][nRandomPosY] = 4;
- break;
- }
- }
- }
- }
- /*
- void World::RecursionFN(){
- Функция рекурсии
- PlayerCommander();
- }
- */
- bool World::MoveUP(){
- /*
- Двигает блоки вверх
- */
- /*
- Копия мира для проверки на изменения
- */
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 4; y++){
- nWorldCopy[x][y] = nWorld[x][y];
- }
- }
- //Перемещение
- for (int i = 0; i < 2; i++){
- /*
- Заставляет циклам перемещения выполниться 2 раза
- */
- for (int x = 0; x < 3; x++){
- for (int y = 0; y < 4; y++){
- if (nWorld[x][y] == 0 && nWorld[x+1][y] != 0){
- nWorld[x][y] = nWorld[x+1][y];
- nWorld[x+1][y] = 0;
- }
- }
- }
- }
- //Сложение
- for (int x = 0; x < 3; x++){
- for (int y = 0; y < 4; y++){
- if (nWorld[x][y] == nWorld[x+1][y] && nWorld[x][y] != 0){
- nWorld[x][y] += nWorld[x+1][y];
- nScore += nWorld[x][y];
- nWorld[x+1][y] = 0;
- }
- }
- }
- /*
- Проверка отличий мира
- */
- /*
- Проверялась адекватность этой херни
- std::cout << "nWC: " << nWorldCopy[1][1] << "\n";
- std::cout << "nW: " << nWorld[1][1] << "\n";
- */
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 4; y++){
- if (nWorld[x][y] != nWorldCopy[y][x]){
- return 0;
- }
- }
- }
- return 1;
- }
- bool World::WorldChecker(){
- /*
- Проверяет мир на играбельность
- */
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 4; y++){
- if (nWorld[x][y] == 0){
- /*
- Если в мире есть хоть один 0 то вернуть "все хорошо"
- */
- return 0;
- }
- }
- }
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 3; y++){
- if (nWorld[x][y] == nWorld[x][y+1]){
- /*
- Если в мире есть блоки одинаковые по горизонтали то
- вернуть "все хорошо"
- */
- return 0;
- }
- }
- }
- for (int x = 0; x < 3; x++){
- for (int y = 0; y < 4; y++){
- if (nWorld[x][y] == nWorld[x+1][y]){
- /*
- Если в мире есть блоки одинаковые по вертикали то
- вернуть "все хорошо"
- */
- return 0;
- }
- }
- }
- return 1;
- }
- void World::Display(bool type){
- /*
- Если type = 0: Выводится массив
- Если type = 1: Выводится имя игрока
- */
- switch (type){
- case 0:
- /*
- Вывод массива в консоль
- */
- std::cout << "----------------------------\nScore: " << nScore << "\n----------------------------\n";
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 4; y++){
- std::cout << nWorld[x][y] << " ";
- }
- std::cout << "\n\n";
- }
- std::cout << "----------------------------\n";
- break;
- case 1:
- //Вывод ника игрока
- std::cout << "Hi! ";
- for (int i = 0; i < 10; i++) {
- std::cout << sPlayerName[i];
- }
- std::cout << "\n----------------------------\n";
- break;
- }
- }
- void World::SetWorldToZero(){
- /*
- Установка всему массиву значение 0
- */
- for (int x = 0; x < 4; x++){
- for (int y = 0; y < 4; y++){
- nWorld[x][y] = 0;
- }
- }
- }
- void World::SetPlayerName(){
- /*
- Установка имени
- */
- for (int i = 0; i < 10; i++){
- sPlayerName[i] = ' ';
- }
- std::cout << "You nick name: ";
- std::cin >> sPlayerName;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement