|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.05.2017, 17:18 | #1 |
Регистрация: 01.03.2016
Сообщений: 7
|
Круговой тетрис.
Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново? Я сделал так, чтобы игра началась заново, только когда игра идет, если же фигура достигает верха, то кнопка никак не реагирует.
Код HTML:
void __fastcall TForm1::N1Click(TObject *Sender) { game.ResetGame(); game.NewFigure(); } //--------------------------------------------------------------------------- Код HTML:
#ifndef _game_h #define _game_h #include <stdlib.h> #include <memory.h> typedef int TFig[4][4]; // Фигуры TFig fig1 = { { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, }; TFig fig2 = { { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 }, }; TFig fig3 = { { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, }; TFig fig4 = { { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, }; // Массив фигур const TFig* figs[] = { &fig1, &fig2, &fig3, &fig4 }; // Класс, реализущий логику игры (без указания движения) class TTetrisGame { public: // Координаты фигуры int figX, figY; // Текущая фигура TFig cfig; // Цвет фигуры int cfig_col; TTetrisGame() { } // Игровое поле int Width, Height; int Field[50][50]; // Какие линии удалять bool FRemove[50]; void ResetGame() { memset( &Field, 0, sizeof(Field) ); } void InitField () { Width = 16; Height = 20; ResetGame (); } // Можно ли текущую фигуру поставить в даное место на поле bool CanPlace( int nx, int ny ) { int x, y; for( x = 0; x < 4; x++ ) for( y = 0; y < 4; y++ ) if (cfig[x][y] > 0) { // Выход из поля по бокам // if ((x + nx < 0) | (x + nx >= Width)) return false; // Выход из поля снизу if (y + ny >= Height) return false; // Фигура еще не до конца появилась на поле if (y + ny < 0) continue; // Касание уже существуюшего if (Field[ (nx+x + Width*10) % Width ][ ny+y ] > 0) return false; } return true; } // Можно ли сместить фигуру bool CanMove( int dx, int dy ) { return CanPlace( figX + dx, figY + dy ); } // Повернуть фигуру void RotateFig( bool check ) { TFig r, old; int x, y; // Поворачиваем временно for( x = 0; x < 4; x++ ) for( y = 0; y < 4; y++ ) r[3-y][x] = cfig[x][y]; // копируем текущую и вместо нее ставим поверную memcpy( &old, &cfig, sizeof(TFig) ); memcpy( &cfig, &r, sizeof(TFig) ); // Если проверять и нельзя повернуть - копируем обратно if (check & !CanPlace(figX, figY)) memcpy( &cfig, &old, sizeof(TFig) ); } bool NewFigure () { // Новая фигура figX = Width/2; figY = -3; cfig_col = rand() % 4; memcpy( &cfig, figs[ cfig_col ], sizeof(TFig) ); // Немного поворачиваем int c; c = (rand() % 4); for( ; c > 0; c-- ) RotateFig ( false ); /* while (!IsOnScreen( cfig )) figY++; // */ // Что-то пошло не так, например нет места if (!CanPlace( figX, figY)) return false; return true; } // Поставить фигуру на поле void SetFig() { int x, y; for( x = 0; x < 4; x++ ) for( y = 0; y < 4; y++ ) if (cfig[x][y] > 0) Field[ (x+figX + Width*10) % Width ][ y+figY ] = cfig_col+1; } // Есть ли заполненные ряды bool CheckRows () { int x, y, c, rem = 0; memset( &FRemove, 0, sizeof(FRemove) ); for( y = 0; y < Height; y++ ) { c = 0; for( x = 0; x < Width; x++ ) if (Field[x][y] > 0) c++; if (c == Width) { FRemove[y] = true; rem++; } } return (rem > 0); } // Удалить заполненные ряды void RemoveRows () { int y, y2, x; for( y = Height-1; y >= 0; ) { if (FRemove[y]) { for( y2 = y; y2 >= 1; y2-- ) { for( x = 0; x < Width; x++ ) Field[x][y2] = Field[x][y2-1]; FRemove[y2] = FRemove[y2-1]; } } else y--; } } }; #endif // _game_h |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Автоматическое построение круговой диаграммы с переменным количеством элементов: возможно ли ? | ArtModern | Microsoft Office Excel | 4 | 15.12.2016 00:19 |
круговой список | hartman | Помощь студентам | 0 | 30.05.2012 21:02 |
Тетрис на си | фыф123 | Помощь студентам | 1 | 22.06.2011 10:48 |
Алгоритм генерации матчей по круговой системе | Cronos20 | PHP | 0 | 19.11.2010 00:50 |
Тетрис | k1r1ch | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 2 | 02.01.2010 12:20 |