Game Maker - создание игр | HellRoom Games

Game Maker | GameMaker: Studio [Game-Maker.ru] => Проекты в разработке => Тема начата: iwa306 от Август 23, 2022, 00:15:07



Название: Консольная игра "Обвал"
Отправлено: iwa306 от Август 23, 2022, 00:15:07
Обозревателям игр:
Наконец-то! За 6 дней я сделал первую консольную игру на C++, которую, пожалуй, назову "ОБВАЛ".
Смысл в чём: (Идея не ORIGINAL)
На точку, находящуюся внизу комнаты под управлением игроком, падают ступеньки блоков в которых есть дыры. Эти дыры нужно заделать другими блоками, которые управляют, чтобы при заполнении ступенька удалилась, освобождая место под блоками.

Есть небольшой баг с заполнением, есть недочёт, много костылей, но для v1,0 думаю добротно получилось.

Запуск в формате: EXE
Права админа: не нужны.

Исходный код:
Код:
#include <iostream>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <time.h>

using namespace std;
string s = "o";
string m = " ";

const int level = 5; //Изменяем вручную уровень сложности (длина комнаты)
const int HEIGHT = 22; //Высота площадки
int score = 0;      //Начисление очков
bool a[5+level][HEIGHT];
const int delay=2; //Замедление
void Draw();

int main()
{ srand(time(NULL)); 
  int to = time(NULL);
  int delta=0;
  int dop=0;

  //Координаты игрока
  int xp=5;
  a[xp][HEIGHT-1]=1;
//////////////////////////////////////////
while (delta<=(HEIGHT-1)*delay) {  int sec=time(NULL)-to+dop*delay;

//Постепенное заполнение игрового поля блоками//
if ((sec>delta)*(sec%delay==0)){ 
for (int x=0;x<(level+5);x++){
for(int st=sec/delay; st>0;st--)
{a[x][st]=a[x][st-1];}
a[x][0]= rand()%2;  }
 Draw();
}delta=sec;

//Реализация управления игроком//
if (_kbhit())
{
switch(getch()) //75- клавиша влево; 77- клавиша вправо; 72- вверх;
{
case 77:a[xp][HEIGHT-1]=0;xp++;a[xp][HEIGHT-1]=1; if(xp>(level+4)){a[0][HEIGHT-1]=1;xp=0;}; Draw(); break;
case 75:a[xp][HEIGHT-1]=0;xp--;a[xp][HEIGHT-1]=1; if(xp<0){a[level+4][HEIGHT-1]=1;xp=level+4;}; Draw(); break;
case' ': 
for(int yp=HEIGHT-2;yp>-1 ;yp--) {if (!a[xp][yp]==1){a[xp][yp+1]=0;a[xp][yp]=1; }else{if (yp>=sec/delay)dop+=1; break;} a[xp][HEIGHT-1]=1; Draw();}
break;
}
};

//Удаление полей и начисление очков//
for (int y=0;y<HEIGHT;y++){
bool bpp=1;
for(int i=0;i<(5+level);i++) {bpp=a[i][y]*bpp;}
if(bpp==1){ dop-=1; score+=level; for(int i=0;i<(5+level);i++)a[i][y]=0;} //Начисление очков в этой строке
} ;

for (int y=0;y<HEIGHT;y++){
int bpp=0;
for(int i=0; i<(5+level);i++) {if (a[i][y]+bpp>=1)bpp=1;};
if((bpp==0)* (y<sec/delay)){for(int x=0;x<(5+level);x++) {a[x][y] = a[x][y+1]; a[x][y+1]=0;}}
}
  }
 /////////////////////////////////
system("pause");
return 0;
}

//прорисовка/ перерисовка игрового поля
void Draw()
{
  system("cls");
 for (int y=0;y<HEIGHT;y++){
 for (int x=0;x<(level+5);x++){
 if (a[x][y]) cout << s;
 if (!a[x][y]) cout << m;
  }; cout<<"\n";}

 cout<<"\n"<<"Score: "<<score;
};

(https://psv4.userapi.com/c235031/u298845592/docs/d48/bc478ed97ea3/izobrazhenie_2022-08-22_233619461.png?extra=GtEEOLo597dhL6eQ5kmzH1-yb-p6fDPcVP1s98fecINgozKq_8l7yzthXfrVNVHJD3Hzwc3Fi9N6xOeb4fmIF9e89KK7XSNvZ4ZfNBBe1KkcobYsLDIdT8MxXNU3e6g9YbFcI-EG3nbm3tJyqhBbJJtR)