/* OneLoneCoder.com - Code-It-Yourself! Flappy Bird "You asked for it... wait, no one did, ever..." - @Javidx9 Disclaimer ~~~~~~~~~~ I don't care what you use this for. It's intended to be educational, and perhaps to the oddly minded - a little bit of fun. Please hack this, change it and use it in any way you see fit. BUT, you acknowledge that I am not responsible for anything bad that happens as a result of your actions. However, if good stuff happens, I would appreciate a shout out, or at least give the blog some publicity for me. Cheers! Background ~~~~~~~~~~ Look it's Flappy Bird, OK? Press Space Bar to Flap. Get a high score. Author ~~~~~~ Twitter: @javidx9 Blog: www.onelonecoder.com Video: ~~~~~~ https://youtu.be/b6A4XHkTjs8 Last Updated: 05/11/2017 */ #include #include using namespace std; #include "olcConsoleGameEngine.h" class OneLoneCoder_FlappyBird : public olcConsoleGameEngine { public: OneLoneCoder_FlappyBird() { m_sAppName = L"Flappy Bird"; } private: float fBirdPosition = 0.0f; float fBirdVelocity = 0.0f; float fBirdAcceleration = 0.0f; float fGravity = 100.0f; float fLevelPosition = 0.0f; float fSectionWidth; list listSection; bool bHasCollided = false; bool bResetGame = false; int nAttemptCount = 0; int nFlapCount = 0; int nMaxFlapCount = 0; protected: // Called by olcConsoleGameEngine virtual bool OnUserCreate() { listSection = { 0, 0, 0, 0 }; bResetGame = true; fSectionWidth = (float)ScreenWidth() / (float)(listSection.size() - 1); return true; } // Called by olcConsoleGameEngine virtual bool OnUserUpdate(float fElapsedTime) { if (bResetGame) { bHasCollided = false; bResetGame = false; listSection = { 0, 0, 0, 0 }; fBirdAcceleration = 0.0f; fBirdVelocity = 0.0f; fBirdPosition = ScreenHeight() / 2.0f; nFlapCount = 0; nAttemptCount++; } // Game if (bHasCollided) { // Do nothing until user releases space if (m_keys[VK_SPACE].bReleased) bResetGame = true; } else { if (m_keys[VK_SPACE].bPressed && fBirdVelocity >= fGravity / 10.0f) { fBirdAcceleration = 0.0f; fBirdVelocity = -fGravity / 4.0f; nFlapCount++; if (nFlapCount > nMaxFlapCount) nMaxFlapCount = nFlapCount; } else fBirdAcceleration += fGravity * fElapsedTime; if (fBirdAcceleration >= fGravity) fBirdAcceleration = fGravity; fBirdVelocity += fBirdAcceleration * fElapsedTime; fBirdPosition += fBirdVelocity * fElapsedTime; fLevelPosition += 14.0f * fElapsedTime; if (fLevelPosition > fSectionWidth) { fLevelPosition -= fSectionWidth; listSection.pop_front(); int i = rand() % (ScreenHeight() - 20); if (i <= 10) i = 0; listSection.push_back(i); } // Display Fill(0, 0, ScreenWidth(), ScreenHeight(), L' '); // Draw Sections int nSection = 0; for (auto s : listSection) { if (s != 0) { Fill(nSection * fSectionWidth + 10 - fLevelPosition, ScreenHeight() - s, nSection * fSectionWidth + 15 - fLevelPosition, ScreenHeight(), PIXEL_SOLID, FG_GREEN); Fill(nSection * fSectionWidth + 10 - fLevelPosition, 0, nSection * fSectionWidth + 15 - fLevelPosition, ScreenHeight() - s - 15, PIXEL_SOLID, FG_GREEN); } nSection++; } int nBirdX = (int)(ScreenWidth() / 3.0f); // Collision Detection bHasCollided = fBirdPosition < 2 || fBirdPosition > ScreenHeight() - 2 || m_bufScreen[(int)(fBirdPosition + 0) * ScreenWidth() + nBirdX].Char.UnicodeChar != L' ' || m_bufScreen[(int)(fBirdPosition + 1) * ScreenWidth() + nBirdX].Char.UnicodeChar != L' ' || m_bufScreen[(int)(fBirdPosition + 0) * ScreenWidth() + nBirdX + 6].Char.UnicodeChar != L' ' || m_bufScreen[(int)(fBirdPosition + 1) * ScreenWidth() + nBirdX + 6].Char.UnicodeChar != L' '; // Draw Bird if (fBirdVelocity > 0) { DrawString(nBirdX, fBirdPosition + 0, L"\\\\\\"); DrawString(nBirdX, fBirdPosition + 1, L"<\\\\\\=Q"); } else { DrawString(nBirdX, fBirdPosition + 0, L"