grid.cpp

来自「Source code (C++) of the Amoebax game fo」· C++ 代码 · 共 1,733 行 · 第 1/5 页

CPP
1,733
字号
//// Cross-platform free Puyo-Puyo clone.// Copyright (C) 2006, 2007 Emma's Software//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.//#if defined (HAVE_CONFIG_H)#include <config.h>#endif // HAVE_CONFIG_H#include <algorithm>#include <assert.h>#include <cmath>#include "ChainLabel.h"#include "File.h"#include "Grid.h"#include "GridStatus.h"#include "PairGenerator.h"#include "System.h"using namespace Amoebax;// Constants.static const float k_Cos[360] = {1.000000f, 0.999848f, 0.999391f, 0.998630f,                                 0.997564f, 0.996195f, 0.994522f, 0.992546f,                                 0.990268f, 0.987688f, 0.984808f, 0.981627f,                                 0.978148f, 0.974370f, 0.970296f, 0.965926f,                                 0.961262f, 0.956305f, 0.951057f, 0.945519f,                                 0.939693f, 0.933580f, 0.927184f, 0.920505f,                                 0.913545f, 0.906308f, 0.898794f, 0.891007f,                                 0.882948f, 0.874620f, 0.866025f, 0.857167f,                                 0.848048f, 0.838671f, 0.829038f, 0.819152f,                                 0.809017f, 0.798636f, 0.788011f, 0.777146f,                                 0.766044f, 0.754710f, 0.743145f, 0.731354f,                                 0.719340f, 0.707107f, 0.694658f, 0.681998f,                                 0.669131f, 0.656059f, 0.642788f, 0.629320f,                                 0.615661f, 0.601815f, 0.587785f, 0.573576f,                                 0.559193f, 0.544639f, 0.529919f, 0.515038f,                                 0.500000f, 0.484810f, 0.469472f, 0.453990f,                                 0.438371f, 0.422618f, 0.406737f, 0.390731f,                                 0.374607f, 0.358368f, 0.342020f, 0.325568f,                                 0.309017f, 0.292372f, 0.275637f, 0.258819f,                                 0.241922f, 0.224951f, 0.207912f, 0.190809f,                                 0.173648f, 0.156434f, 0.139173f, 0.121869f,                                 0.104528f, 0.087156f, 0.069756f, 0.052336f,                                 0.034899f, 0.017452f, 0.000000f, -0.017452f,                                 -0.034899f, -0.052336f, -0.069756f, -0.087156f,                                 -0.104528f, -0.121869f, -0.139173f, -0.156434f,                                 -0.173648f, -0.190809f, -0.207912f, -0.224951f,                                 -0.241922f, -0.258819f, -0.275637f, -0.292372f,                                 -0.309017f, -0.325568f, -0.342020f, -0.358368f,                                 -0.374607f, -0.390731f, -0.406737f, -0.422618f,                                 -0.438371f, -0.453990f, -0.469472f, -0.484810f,                                 -0.500000f, -0.515038f, -0.529919f, -0.544639f,                                 -0.559193f, -0.573576f, -0.587785f, -0.601815f,                                 -0.615661f, -0.629320f, -0.642788f, -0.656059f,                                 -0.669131f, -0.681998f, -0.694658f, -0.707107f,                                 -0.719340f, -0.731354f, -0.743145f, -0.754710f,                                 -0.766044f, -0.777146f, -0.788011f, -0.798636f,                                 -0.809017f, -0.819152f, -0.829038f, -0.838671f,                                 -0.848048f, -0.857167f, -0.866025f, -0.874620f,                                 -0.882948f, -0.891007f, -0.898794f, -0.906308f,                                 -0.913545f, -0.920505f, -0.927184f, -0.933580f,                                 -0.939693f, -0.945519f, -0.951057f, -0.956305f,                                 -0.961262f, -0.965926f, -0.970296f, -0.974370f,                                 -0.978148f, -0.981627f, -0.984808f, -0.987688f,                                 -0.990268f, -0.992546f, -0.994522f, -0.996195f,                                 -0.997564f, -0.998630f, -0.999391f, -0.999848f,                                 -1.000000f, -0.999848f, -0.999391f, -0.998630f,                                 -0.997564f, -0.996195f, -0.994522f, -0.992546f,                                 -0.990268f, -0.987688f, -0.984808f, -0.981627f,                                 -0.978148f, -0.974370f, -0.970296f, -0.965926f,                                 -0.961262f, -0.956305f, -0.951057f, -0.945519f,                                 -0.939693f, -0.933580f, -0.927184f, -0.920505f,                                 -0.913545f, -0.906308f, -0.898794f, -0.891007f,                                 -0.882948f, -0.874620f, -0.866025f, -0.857167f,                                 -0.848048f, -0.838671f, -0.829038f, -0.819152f,                                 -0.809017f, -0.798636f, -0.788011f, -0.777146f,                                 -0.766044f, -0.754710f, -0.743145f, -0.731354f,                                 -0.719340f, -0.707107f, -0.694658f, -0.681998f,                                 -0.669131f, -0.656059f, -0.642788f, -0.629320f,                                 -0.615661f, -0.601815f, -0.587785f, -0.573576f,                                 -0.559193f, -0.544639f, -0.529919f, -0.515038f,                                 -0.500000f, -0.484810f, -0.469472f, -0.453990f,                                 -0.438371f, -0.422618f, -0.406737f, -0.390731f,                                 -0.374607f, -0.358368f, -0.342020f, -0.325568f,                                 -0.309017f, -0.292372f, -0.275637f, -0.258819f,                                 -0.241922f, -0.224951f, -0.207912f, -0.190809f,                                 -0.173648f, -0.156434f, -0.139173f, -0.121869f,                                 -0.104528f, -0.087156f, -0.069756f, -0.052336f,                                 -0.034899f, -0.017452f, -0.000000f, 0.017452f,                                 0.034899f, 0.052336f, 0.069756f, 0.087156f,                                 0.104528f, 0.121869f, 0.139173f, 0.156434f,                                 0.173648f, 0.190809f, 0.207912f, 0.224951f,                                 0.241922f, 0.258819f, 0.275637f, 0.292372f,                                 0.309017f, 0.325568f, 0.342020f, 0.358368f,                                 0.374607f, 0.390731f, 0.406737f, 0.422618f,                                 0.438371f, 0.453990f, 0.469472f, 0.484810f,                                 0.500000f, 0.515038f, 0.529919f, 0.544639f,                                 0.559193f, 0.573576f, 0.587785f, 0.601815f,                                 0.615661f, 0.629320f, 0.642788f, 0.656059f,                                 0.669131f, 0.681998f, 0.694658f, 0.707107f,                                 0.719340f, 0.731354f, 0.743145f, 0.754710f,                                 0.766044f, 0.777146f, 0.788011f, 0.798636f,                                 0.809017f, 0.819152f, 0.829038f, 0.838671f,                                 0.848048f, 0.857167f, 0.866025f, 0.874620f,                                 0.882948f, 0.891007f, 0.898794f, 0.906308f,                                 0.913545f, 0.920505f, 0.927184f, 0.933580f,                                 0.939693f, 0.945519f, 0.951057f, 0.956305f,                                 0.961262f, 0.965926f, 0.970296f, 0.974370f,                                 0.978148f, 0.981627f, 0.984808f, 0.987688f,                                 0.990268f, 0.992546f, 0.994522f, 0.996195f,                                 0.997564f, 0.998630f, 0.999391f, 0.999848f};static const float k_Sin[360] = {0.000000f, 0.017452f, 0.034899f, 0.052336f,                                 0.069756f, 0.087156f, 0.104528f, 0.121869f,                                 0.139173f, 0.156434f, 0.173648f, 0.190809f,                                 0.207912f, 0.224951f, 0.241922f, 0.258819f,                                 0.275637f, 0.292372f, 0.309017f, 0.325568f,                                 0.342020f, 0.358368f, 0.374607f, 0.390731f,                                 0.406737f, 0.422618f, 0.438371f, 0.453990f,                                 0.469472f, 0.484810f, 0.500000f, 0.515038f,                                 0.529919f, 0.544639f, 0.559193f, 0.573576f,                                 0.587785f, 0.601815f, 0.615661f, 0.629320f,                                 0.642788f, 0.656059f, 0.669131f, 0.681998f,                                 0.694658f, 0.707107f, 0.719340f, 0.731354f,                                 0.743145f, 0.754710f, 0.766044f, 0.777146f,                                 0.788011f, 0.798636f, 0.809017f, 0.819152f,                                 0.829038f, 0.838671f, 0.848048f, 0.857167f,                                 0.866025f, 0.874620f, 0.882948f, 0.891007f,                                 0.898794f, 0.906308f, 0.913545f, 0.920505f,                                 0.927184f, 0.933580f, 0.939693f, 0.945519f,                                 0.951057f, 0.956305f, 0.961262f, 0.965926f,                                 0.970296f, 0.974370f, 0.978148f, 0.981627f,                                 0.984808f, 0.987688f, 0.990268f, 0.992546f,                                 0.994522f, 0.996195f, 0.997564f, 0.998630f,                                 0.999391f, 0.999848f, 1.000000f, 0.999848f,                                 0.999391f, 0.998630f, 0.997564f, 0.996195f,                                 0.994522f, 0.992546f, 0.990268f, 0.987688f,                                 0.984808f, 0.981627f, 0.978148f, 0.974370f,                                 0.970296f, 0.965926f, 0.961262f, 0.956305f,                                 0.951057f, 0.945519f, 0.939693f, 0.933580f,                                 0.927184f, 0.920505f, 0.913545f, 0.906308f,                                 0.898794f, 0.891007f, 0.882948f, 0.874620f,                                 0.866025f, 0.857167f, 0.848048f, 0.838671f,                                 0.829038f, 0.819152f, 0.809017f, 0.798636f,                                 0.788011f, 0.777146f, 0.766044f, 0.754710f,                                 0.743145f, 0.731354f, 0.719340f, 0.707107f,                                 0.694658f, 0.681998f, 0.669131f, 0.656059f,                                 0.642788f, 0.629320f, 0.615661f, 0.601815f,                                 0.587785f, 0.573576f, 0.559193f, 0.544639f,                                 0.529919f, 0.515038f, 0.500000f, 0.484810f,                                 0.469472f, 0.453990f, 0.438371f, 0.422618f,                                 0.406737f, 0.390731f, 0.374607f, 0.358368f,                                 0.342020f, 0.325568f, 0.309017f, 0.292372f,                                 0.275637f, 0.258819f, 0.241922f, 0.224951f,                                 0.207912f, 0.190809f, 0.173648f, 0.156434f,                                 0.139173f, 0.121869f, 0.104528f, 0.087156f,                                 0.069756f, 0.052336f, 0.034899f, 0.017452f,                                 0.000000f, -0.017452f, -0.034899f, -0.052336f,                                 -0.069756f, -0.087156f, -0.104528f, -0.121869f,                                 -0.139173f, -0.156434f, -0.173648f, -0.190809f,                                 -0.207912f, -0.224951f, -0.241922f, -0.258819f,                                 -0.275637f, -0.292372f, -0.309017f, -0.325568f,                                 -0.342020f, -0.358368f, -0.374607f, -0.390731f,                                 -0.406737f, -0.422618f, -0.438371f, -0.453990f,                                 -0.469472f, -0.484810f, -0.500000f, -0.515038f,                                 -0.529919f, -0.544639f, -0.559193f, -0.573576f,                                 -0.587785f, -0.601815f, -0.615661f, -0.629320f,                                 -0.642788f, -0.656059f, -0.669131f, -0.681998f,                                 -0.694658f, -0.707107f, -0.719340f, -0.731354f,                                 -0.743145f, -0.754710f, -0.766044f, -0.777146f,                                 -0.788011f, -0.798636f, -0.809017f, -0.819152f,                                 -0.829038f, -0.838671f, -0.848048f, -0.857167f,                                 -0.866025f, -0.874620f, -0.882948f, -0.891007f,                                 -0.898794f, -0.906308f, -0.913545f, -0.920505f,                                 -0.927184f, -0.933580f, -0.939693f, -0.945519f,                                 -0.951057f, -0.956305f, -0.961262f, -0.965926f,                                 -0.970296f, -0.974370f, -0.978148f, -0.981627f,                                 -0.984808f, -0.987688f, -0.990268f, -0.992546f,                                 -0.994522f, -0.996195f, -0.997564f, -0.998630f,                                 -0.999391f, -0.999848f, -1.000000f, -0.999848f,                                 -0.999391f, -0.998630f, -0.997564f, -0.996195f,                                 -0.994522f, -0.992546f, -0.990268f, -0.987688f,                                 -0.984808f, -0.981627f, -0.978148f, -0.974370f,                                 -0.970296f, -0.965926f, -0.961262f, -0.956305f,                                 -0.951057f, -0.945519f, -0.939693f, -0.933580f,                                 -0.927184f, -0.920505f, -0.913545f, -0.906308f,                                 -0.898794f, -0.891007f, -0.882948f, -0.874620f,                                 -0.866025f, -0.857167f, -0.848048f, -0.838671f,                                 -0.829038f, -0.819152f, -0.809017f, -0.798636f,                                 -0.788011f, -0.777146f, -0.766044f, -0.754710f,                                 -0.743145f, -0.731354f, -0.719340f, -0.707107f,                                 -0.694658f, -0.681998f, -0.669131f, -0.656059f,                                 -0.642788f, -0.629320f, -0.615661f, -0.601815f,                                 -0.587785f, -0.573576f, -0.559193f, -0.544639f,                                 -0.529919f, -0.515038f, -0.500000f, -0.484810f,                                 -0.469472f, -0.453990f, -0.438371f, -0.422618f,                                 -0.406737f, -0.390731f, -0.374607f, -0.358368f,                                 -0.342020f, -0.325568f, -0.309017f, -0.292372f,                                 -0.275637f, -0.258819f, -0.241922f, -0.224951f,                                 -0.207912f, -0.190809f, -0.173648f, -0.156434f,                                 -0.139173f, -0.121869f, -0.104528f, -0.087156f,                                 -0.069756f, -0.052336f, -0.034899f, -0.017452f};// The speed of the horizontal movement of the queue.static const float k_QueueHorizontalSpeed = 0.10f;// The speed of the vertical movement of the queue.static const float k_QueueVerticalSpeed = 0.25f;// The speed of the satellite rotation, in degress/ms.static const float k_RotationSpeed = 0.5f;////// \brief Constructor.////// \param gridPositionX The X position of the grid's top-left corner./// \param gridPositionY The Y position of the grid's top-left corner./// \param queuePositionX The X position of queue's top-left corner,///                       where the amoebas wait to fall./// \param queuePositionY The Y position of queue's top-left corner,///                       where the amoebas wait to fall./// \param waitingGhostPositionX The X position of the top-left corner///                              where the ghost amoebas wait to fall./// \param waitingGhostPositionY The Y position of the top-left corner///                              where the ghost amoebas wait to fall./// \param amoebaSize The size of a single amoeba. The amoebas must be///                   squared, so the width and the height are the same./// \param queueSide The side where the queue is located at./// \param score The initial grid's score./// \param layout The grid's layout.///Grid::Grid (uint16_t gridPositionX, uint16_t gridPositionY,            uint16_t queuePositionX, uint16_t queuePositionY,            uint16_t waitingGhostPositionX, uint16_t waitingGhostPositionY,            uint16_t amoebaSize, QueueSide queueSide, uint32_t score,            Layout layout):    m_ActiveAmoebas (0),    m_AmoebaSize (amoebaSize),    m_BlinkTime (0),    m_ChainLabels (0),    m_CurrentStepChain (0),    m_CurrentRotationDegrees (0.0f),    m_DegreesUntilRotationDone (0.0f),    m_DyingAmoebas (0),    m_DyingTime (0),    m_FallingPair (),    m_Filled (false),    m_FirstFallingPair (true),    m_FloatingAmoebas (0),    m_FloatingAmoebasVerticalOffset (0),    m_Generator (0),    m_Grid (k_GridHeight * k_GridWidth, static_cast<Amoeba *>(0)),    m_GridPositionX (gridPositionX),    m_GridPositionY (gridPositionY),    m_HasNewFallingPair (false),    m_InactiveAmoebas (0),    m_Layout (layout),    m_MaxFallingSpeed (false),    m_OpponentGhostAmoebas (0),    m_Queue (0),    m_QueuedAmoebas (0),    m_QueueIsMoving (false),    m_QueueSide (queueSide),    m_QueuePositionX (queuePositionX),    m_QueuePositionY (queuePositionY),    m_RemainingQueueHorizontalOffset (0),    m_RemainingQueueVerticalOffset (0),    m_RotationDirection (1.0f),    m_Score (score),    m_SilhouetteFrame (0),    m_SilhouetteFrameDirection (-1),    m_SilhouetteTime (0),    m_WaitingInitialAmoebas (true),    m_WaitingGhostAmoebas (0),    m_WaitingGhostAmoebasNumber (0),    m_WaitingGhostPositionX (waitingGhostPositionX),    m_WaitingGhostPositionY (waitingGhostPositionY){    // Load sounds.    m_DieSound.reset (Sound::fromFile (File::getSoundFilePath ("die.wav")));    // Create the waiting ghost amoebas.    // There's only 6 waiting amoebas, but the "neighbour" state    // of each ghost amoebas tells how many "real" ghosts will fall from    // this amoeba (max. 5 for each.)    for ( uint8_t currentAmoeba = 0 ; currentAmoeba < 6 ; ++currentAmoeba )    {        m_WaitingGhostAmoebas.push_back (new Amoeba (Amoeba::ColourGhost));        m_WaitingGhostAmoebas[currentAmoeba]->setState (Amoeba::StateTopRightBottomLeft);        if ( Grid::LayoutVertical == getLayout () )        {            m_WaitingGhostAmoebas[currentAmoeba]->setY (m_WaitingGhostPositionY);            m_WaitingGhostAmoebas[currentAmoeba]->setX (m_WaitingGhostPositionX +                                                        getAmoebaSize () *                                                        currentAmoeba);        }        else        {            if ( Grid::QueueSideLeft == getQueueSide () )            {                m_WaitingGhostAmoebas[currentAmoeba]->setX (m_WaitingGhostPositionX -                                                            getAmoebaSize ());                m_WaitingGhostAmoebas[currentAmoeba]->setY (m_WaitingGhostPositionY +                                                            getAmoebaSize () *                                                            currentAmoeba);            }            else            {                m_WaitingGhostAmoebas[currentAmoeba]->setX (m_WaitingGhostPositionX);                m_WaitingGhostAmoebas[currentAmoeba]->setY (m_WaitingGhostPositionY -                                                            getAmoebaSize () *                                                            (currentAmoeba + 1));            }        }    }}////// \brief Destructor.///Grid::~Grid (void){    std::for_each (m_ActiveAmoebas.begin (), m_ActiveAmoebas.end (),                   DeleteObject<Amoeba> ());    m_ActiveAmoebas.clear ();    std::for_each (m_ChainLabels.begin (), m_ChainLabels.end (),                   DeleteObject<ChainLabel> ());    m_ChainLabels.clear ();    std::for_each (m_InactiveAmoebas.begin (), m_InactiveAmoebas.end (),                   DeleteObject<Amoeba> ());    m_InactiveAmoebas.clear ();    std::for_each (m_QueuedAmoebas.begin (), m_QueuedAmoebas.end (),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?