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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2017, 17:18   #1
Neotwalker
 
Регистрация: 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
Neotwalker вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое построение круговой диаграммы с переменным количеством элементов: возможно ли ? 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