Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2024, 21:08   #11
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 150
По умолчанию

Как сделать,чтобы поместить функции
screen.Put(buf, scr_height / 2, scr_width / 2 - 9);
screen.Show();
в TGame.У меня что-то не получается.
Если просто использовать screen->Put(); ,то выдает ошибку.
#include <iostream>
#include<windows.h>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <cstring>

using namespace std;

const int fld_width = 20;
const int fld_height = 30;
const int scr_width = fld_width * 2;
const int scr_height = fld_height;

const char c_fig = 219;
const char c_field = 176;
const char c_figDwn = 178;

typedef char TScreenMap[scr_height + 1][scr_width];
typedef char TFieldMap[fld_height][fld_width];

const int shp_width = 4;
const int shp_height = 4;

typedef char TShape[shp_height][shp_width];

char* shpArr[] = {
(char*)".....**..**.....",
(char*)"....****........",
(char*)"....***..*......",
(char*)"....***.*.......",
(char*)".....**.**......" };

const int shpArrCnt = sizeof(shpArr) / sizeof(shpArr[0]);

int score = 0;
int dx = 0, dy = 1;
int level = 1;


void SetCurPos(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHand le(STD_OUTPUT_HANDLE), coord);
}

class TScreen
{
void SetEnd() { scr[scr_height][0] = '\0'; }
public:
TScreenMap scr;
TScreen() { Clear(); }
void Clear() { memset(scr, ' ', sizeof(scr)); }
void Show() { SetEnd(); cout << scr[0]; }
void Put(const char* s, int y, int x) { memcpy(&scr[y][x], s, strlen(s)); }
};

class TField
{
public:
TFieldMap fld;
TField() { Clear(); }
void Clear() { memset(fld, c_field, sizeof(fld)); }
void Put(TScreenMap& src);
void Burning();
};

class TFigure
{
int x, y;
TShape vid;
TField* field;
COORD coord[shp_width * shp_height];
int coordCnt;
char turn;
public:
bool exists = false;
TFigure() { memset(this, 0, sizeof(*this)); }
void Shape(char* _vid) { memcpy(vid, _vid, sizeof(vid)); }
void Pos(int _x, int _y) { x = _x; y = _y; Calccoord(); }
void Put(TScreenMap& scr);
void Move(int dx, int dy);
char TurnGet() { return turn; }
void TurnSet(char _turn);
void FieldSet(TField* _field) { field = _field; }
void Calccoord();
void NewFigure();
void Newlevel();
};

class TGame
{
TScreen screen;
TFigure figure;
TField field;
public:
TGame();
void PlayerControl();
void Show();
void Loop();
};

TGame::TGame()
{
figure.FieldSet(&field);
figure.NewFigure();
}

void TFigure::NewFigure()
{
Shape(shpArr[rand() % shpArrCnt]);
Pos(fld_width / 2 - shp_width / 2, 0);

bool Possible = true;
for (int i = 0; i < coordCnt && Possible; i++)
Possible = field->fld[coord[i].Y][coord[i].X] != c_figDwn;
if (!Possible)
{
field->Clear();
Newlevel();
}
}

void TGame::PlayerControl()
{
static int trn = 0;

if (GetKeyState('W') < 0) trn += 1;
if (trn == 1) figure.TurnSet(figure.TurnGet() + 1), trn++;
if (GetKeyState('W') > 0) trn = 0;

if (GetKeyState('S') < 0) figure.Move(0, 1);
if (GetKeyState('A') < 0) figure.Move(-1, 0);
if (GetKeyState('D') < 0) figure.Move(1, 0);
}


void TGame::Show()
{
screen.Clear();
field.Put(screen.scr);/*Выводим игровое поле*/
figure.Put(screen.scr);/*Выводим фигуру*/
screen.Show();
}

void TFigure::Move(int dx, int dy)
{
static int tick = 0;

tick++;
if (tick >= 5)
{
int oldX = x, oldY = y, new_dx = 0, new_dy = 0;

if (dx > 0)
for (int j = 1; j <= dx; ++j)
{
Pos(oldX + j, oldY);
bool Possible = true;
for (int i = 0; i < coordCnt && Possible; i++)
Possible = coord[i].X < fld_width && field->fld[coord[i].Y][coord[i].X] != c_figDwn;
if (Possible)
new_dx = j;
else
break;
}
else if (dx < 0)
{
for (int j = -1; j >= dx; --j)
{
Pos(oldX + j, oldY);
bool Possible = true;
for (int i = 0; i < coordCnt && Possible; i++)
Possible = coord[i].X >= 0 && field->fld[coord[i].Y][coord[i].X] != c_figDwn;
if (Possible)
new_dx = j;
else
break;
}
}
oldX += new_dx;

for (int j = 1; j <= dy; ++j)
{
Pos(oldX, oldY + j);
bool Possible = true;
for (int i = 0; i < coordCnt && Possible; i++)
Possible = coord[i].Y < fld_height && field->fld[coord[i].Y][coord[i].X] != c_figDwn;
if (Possible)
new_dy = j;
else
break;
}
oldY += new_dy;
Pos(oldX, oldY);

if (dy != 0 && new_dy == 0)
{
for (int i = 0; i < coordCnt; i++)
field->fld[coord[i].Y][coord[i].X] = c_figDwn;
NewFigure();
}


field->Burning();
tick = 0;

}
}

void TFigure::Put(TScreenMap& scr) /*Выводим фигуру*/
{
if (exists)
for (int i = 0; i < coordCnt; i++)
scr[coord[i].Y][coord[i].X * 2] = scr[coord[i].Y][coord[i].X * 2 + 1] = c_fig;
}

void TFigure::TurnSet(char _turn)
{
/* */
}

void TFigure::Calccoord()
{
int xx;
int yy;
coordCnt = 0;
for (int i = 0; i < shp_width; i++)
for (int j = 0; j < shp_height; j++)
if (vid[j][i] == '*')
{
if (turn == 0) xx = x + i; yy = y + j;
/* */
coord[coordCnt] = { (short)xx,(short)yy };
coordCnt++;
}
}

void TField::Put(TScreenMap& scr)
{
for (int i = 0; i < fld_width; i++)
for (int j = 0; j < fld_height; j++)
scr[j][i * 2] = scr[j][i * 2 + 1] = fld[j][i]; /*Выводим измененное игровое поле*/
}


void TField::Burning()
{
for (int j = fld_height - 1; j >= 0; j--)
{
static bool fillLine;
fillLine = true;
for (int i = 0; i < fld_width; i++)
if (fld[j][i] != c_figDwn)
fillLine = false;
if (fillLine)
{
for (int y = j; y >= 1; y--)
memcpy(fld[y], fld[y - 1], sizeof(fld[y]));
score += 20;
return;
}
}
}


void TFigure::Newlevel()
{
char buf[80];
dy += 1;
level++;
sprintf_s(buf, "Welcome to level %d", level);
screen.Put(buf, scr_height / 2, scr_width / 2 - 9);
screen.Show();
if (level > 5)
exists = Possible;
}


void TGame::Loop()
{
char buf[80];
while (figure.exists)
{
PlayerControl();
figure.Move(dx, dy);
Show();
if (GetKeyState(VK_ESCAPE) < 0) break;
Sleep(50);
}
if (!figure.exists)
{
screen.Clear();
screen.Put("GAME OVER", scr_height / 2, scr_width / 2 - 5);
sprintf_s(buf, "Score: %d", score);
screen.Put(buf, scr_height / 2 + 2, scr_width / 2 - 4);
screen.Show();
while (1)
{
if (GetKeyState(VK_ESCAPE) < 0) break;
Sleep(50);
}
}
}


int main()
{
char command[1000];
sprintf_s(command, "mode con cols=%d lines=%d", scr_width, scr_height);
system(command);

srand(time(0));


TGame game;

game.Loop();

return 0;
}
Timurkh77 вне форума Ответить с цитированием
Старый 14.01.2024, 14:27   #12
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 150
По умолчанию

Спасибо за помощь.Сам разобрался с уровнями.
Timurkh77 вне форума Ответить с цитированием
Старый 02.03.2024, 19:44   #13
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 150
По умолчанию

По поводу размеров экрана.
Вывод осуществляется после
sprintf_s(command, "mode con cols=%d lines=%d", scr_width, scr_height);
По-моему , этой командой задается размер консоли.Так ли это?
const int fld_width = 20;
const int fld_height = 30;
const int scr_width = fld_width * 2;
const int scr_height = fld_height;

scr_width задается умножением fld_width на 2,то есть 40,в то время как scr_height остается 30.Получается по ширине размер окна должен быть больше высоты , но это не так при запуске.
В чем дело?
Timurkh77 вне форума Ответить с цитированием
Старый 02.03.2024, 20:00   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потому что каждый символ на экране достаточно узкий (например, на моем мониторе 15 пикселей по ширине и 26 пикселей по высоте). Поэтому каждый символ поля выводится двумя символами на экране (30 на 26 пикселей). А размер всего изображения 40 * 15 = 600 в ширину (scr_width на ширину одного символа), 30 * 26 = 780 в высоту (scr_height на высоту одного символа).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.03.2024 в 20:03.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Game Over в Тетрисе. Delphi 7 Divia Общие вопросы Delphi 2 06.12.2021 09:50
Алгоритм вращения фигуры в тетрисе Joose Помощь студентам 11 14.07.2013 19:34
таблица рекордов в тетрисе! Юлия11 C++ Builder 10 12.06.2013 10:34
GraphABC фигура dosha Помощь студентам 6 11.03.2013 19:31
фигура-грани lex1398 Помощь студентам 2 28.08.2010 09:54