|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.01.2024, 21:08 | #11 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 169
|
Как сделать,чтобы поместить функции
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; } |
14.01.2024, 14:27 | #12 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 169
|
Спасибо за помощь.Сам разобрался с уровнями.
|
02.03.2024, 19:44 | #13 |
Форумчанин
Регистрация: 16.02.2013
Сообщений: 169
|
По поводу размеров экрана.
Вывод осуществляется после 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.Получается по ширине размер окна должен быть больше высоты , но это не так при запуске. В чем дело? |
02.03.2024, 20:00 | #14 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,359
|
Потому что каждый символ на экране достаточно узкий (например, на моем мониторе 15 пикселей по ширине и 26 пикселей по высоте). Поэтому каждый символ поля выводится двумя символами на экране (30 на 26 пикселей). А размер всего изображения 40 * 15 = 600 в ширину (scr_width на ширину одного символа), 30 * 26 = 780 в высоту (scr_height на высоту одного символа).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 02.03.2024 в 20:03. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |