Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed
Diff: Tetris/main.cpp
- Revision:
- 15:e9f3b72b7486
diff -r 958f66f7b0a8 -r e9f3b72b7486 Tetris/main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Tetris/main.cpp Wed Nov 30 22:12:41 2022 +0000
@@ -0,0 +1,492 @@
+#include "mbed.h"
+#include "Game.h"
+//#include "PinDetect.h"
+//#include "Speaker.h"
+//#include "TextLCD.h"
+//#include "Shiftbrite.h"
+//#include "SDFileSystem.h"
+#include "wave_player.h"
+#include "rtos.h"
+
+uLCD_4DGL uLCD(p28, p27, p29);
+//TextLCD textLCD(p26, p25, p24, p23, p22, p15);
+//Speaker mySpeaker(p21);
+//Shiftbrite myShiftbrite(p9, p10, p11, p12, p13);
+//SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+Serial pc(USBTX, USBRX);
+
+PinDetect LEFT_KEY(p16); // need to use NavSwitch for this
+PinDetect RIGHT_KEY(p19);
+PinDetect ROTATE_KEY(p17);
+PinDetect DOWN_KEY(p30);
+
+int SinglePiecePoints = 50;
+int LineClearPoints = 200;
+int key_input = 0;
+bool gameStarted = false;
+void input_left() // FIX
+{
+ if(!gameStarted)
+ { gameStarted=true;
+ return;
+ }
+ key_input = 1;
+ //mySpeaker.PlayNote(400.0,0.05,0.025);
+ //mySpeaker.PlayNote(500.0,0.05,0.025);
+}
+
+void input_right()
+{
+ if(!gameStarted)
+ { gameStarted=true;
+ return;
+ }
+ key_input = 2;
+ //mySpeaker.PlayNote(400.0,0.05,0.025);
+ //mySpeaker.PlayNote(500.0,0.05,0.025);
+}
+
+void input_rotate()
+{
+ if(!gameStarted)
+ { gameStarted=true;
+ return;
+ }
+ key_input = 3;
+ /*mySpeaker.PlayNote(600.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);*/
+}
+
+void input_down()
+{
+ if(!gameStarted)
+ { gameStarted=true;
+ return;
+ }
+ key_input=4;
+ /*mySpeaker.PlayNote(500.0,0.05,0.025);
+ mySpeaker.PlayNote(1500.0,0.05,0.025);
+ mySpeaker.PlayNote(500.0,0.05,0.025);
+ mySpeaker.PlayNote(1500.0,0.05,0.025);*/
+}
+
+void clear_board()
+{
+ uLCD.filled_rectangle(20,0,79,128,0);
+}
+
+void clear_next_piece()
+{
+ uLCD.filled_rectangle(92,20,122,50,0);
+}
+
+/*
+void UpdateGameStatus(int points,int lines)
+{
+ textLCD.locate(7,0);
+ textLCD.printf("%d",points);
+ textLCD.locate(13,1);
+ textLCD.printf("%d",lines);
+}*/
+
+/* ShiftBright Code
+void FlashLight(void const *args)
+{
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+
+ myShiftbrite.RGB(0,0,42);
+ myShiftbrite.RGB(0,0,42);
+ Thread::wait(100);
+
+
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,42,0);
+ Thread::wait(100);
+
+ myShiftbrite.RGB(0,0,42);
+ myShiftbrite.RGB(0,0,42);
+ Thread::wait(100);
+
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+}
+
+void GameOverLight(void const *args)
+{
+
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,200);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+}
+
+void GameStartLight(void const *args)
+{
+
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+
+ myShiftbrite.RGB(0,200,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,200,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,200,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,200,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,200,0);
+ Thread::wait(100);
+ myShiftbrite.RGB(0,0,0);
+ myShiftbrite.RGB(0,0,0);
+
+} */
+
+/* Speaker Code
+void PlayStartSound()
+{
+ mySpeaker.PlayNote(500.0,0.05,0.025);
+ mySpeaker.PlayNote(600.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(600.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(1300.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(1300.0,0.05,0.025);
+ mySpeaker.PlayNote(1400.0,0.05,0.025);
+}
+
+void PlayOverSound()
+{
+ mySpeaker.PlayNote(1400.0,0.05,0.025);
+ mySpeaker.PlayNote(1300.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(1300.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(600.0,0.05,0.025);
+ mySpeaker.PlayNote(1200.0,0.05,0.025);
+ mySpeaker.PlayNote(1100.0,0.05,0.025);
+ mySpeaker.PlayNote(1000.0,0.05,0.025);
+ mySpeaker.PlayNote(900.0,0.05,0.025);
+ mySpeaker.PlayNote(800.0,0.05,0.025);
+ mySpeaker.PlayNote(700.0,0.05,0.025);
+ mySpeaker.PlayNote(600.0,0.05,0.025);
+ mySpeaker.PlayNote(500.0,0.05,0.025);
+}
+
+void PlayClearSound()
+{
+ mySpeaker.PlayNote(900.0,0.2,0.025);
+ mySpeaker.PlayNote(1000.0,0.2,0.025);
+ mySpeaker.PlayNote(1100.0,0.2,0.025);
+ mySpeaker.PlayNote(1000.0,0.2,0.025);
+ mySpeaker.PlayNote(9000.0,0.2,0.025);
+} */
+
+int RandomGen(char range)
+{
+ pc.printf("%c",range);
+ while(!pc.readable()) wait(0.5);
+ char buffer[4];
+ pc.gets(buffer,4);
+ int i = buffer[0]-'0';
+ return i;
+}
+
+int main()
+{
+ //hardware setup // FIX
+ LEFT_KEY.mode(PullUp);
+ RIGHT_KEY.mode(PullUp);
+ ROTATE_KEY.mode(PullUp);
+ DOWN_KEY.mode(PullUp);
+
+ LEFT_KEY.attach_deasserted(&input_left);
+ RIGHT_KEY.attach_deasserted(&input_right);
+ ROTATE_KEY.attach_deasserted(&input_rotate);
+ DOWN_KEY.attach_deasserted(&input_down);
+
+ LEFT_KEY.setSampleFrequency();
+ RIGHT_KEY.setSampleFrequency();
+ ROTATE_KEY.setSampleFrequency();
+ DOWN_KEY.setSampleFrequency(); // FIX
+ uLCD.baudrate(3000000);
+
+ //myShiftbrite.RGB(0,0,0);
+ //myShiftbrite.RGB(0,0,0);
+
+ /* SD card used for Startup Image
+ sd.disk_initialize(); // ? might need to delete
+ uLCD.media_init();
+ uLCD.set_sector_address(0x001D, 0x7801);
+ uLCD.display_image(0,0);*/
+
+ /*textLCD.cls();
+ textLCD.locate(0,0);
+ textLCD.printf("Waiting for PC...");*/
+
+ pc.baud(9600);
+ pc.format(8,SerialBase::None,1);
+ pc.printf("0");
+ while(!pc.readable()) wait(0.5);
+ char buffer[4];
+ pc.gets(buffer,4);
+ /*
+ //wait for game start
+ textLCD.cls();
+ textLCD.locate(0,0);
+ textLCD.printf("TETRIS READY!!");
+ textLCD.locate(0,1);
+ textLCD.printf("PRESS ANY KEY...");
+ while(!gameStarted) wait(0.5);
+ PlayStartSound();
+ textLCD.cls();
+ textLCD.printf("Starting game now...");
+ wait(2);
+ textLCD.cls();
+ textLCD.locate(0,0);
+ textLCD.printf("Points");
+ textLCD.locate(0,1);
+ textLCD.printf("Cleared Line");*/
+
+ //Thread t1(GameStartLight);
+ //game classes init
+ bool isGameOver = false;
+ int mScreenHeight = 128;
+ Pieces mPieces;
+ Board mBoard (&mPieces, mScreenHeight);
+ int a = RandomGen('a');
+ int b = RandomGen('b');
+ int c = RandomGen('a');
+ int d = RandomGen('b');
+ Game mGame (&mBoard, &mPieces, mScreenHeight, &uLCD,a,b,c,d);
+
+
+ // ----- Main Loop -----
+ int prevX=0;
+ int prevY=0;
+ int prevPiece=-1;
+ int prevRot=0;
+ Timer timer;
+ timer.start();
+ key_input=0;
+ bool needErase = false;
+ uLCD.cls();
+ while (1)
+ {
+ if(isGameOver)
+ {
+ wait(1);
+ continue;
+ }
+ // ----- Draw ----
+ if(needErase)
+ {
+ mGame.ErasePiece(prevX,prevY,prevPiece,prevRot);
+ needErase=false;
+ }
+ mGame.DrawScene();
+
+ prevX=mGame.mPosX;
+ prevY=mGame.mPosY;
+ prevPiece=mGame.mPiece;
+ prevRot=mGame.mRotation;
+
+ // ----- Input -----
+ switch (key_input)
+ {
+ case (2): //right
+ {
+ if (mBoard.IsPossibleMovement (mGame.mPosX + 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
+ {mGame.mPosX++;needErase=true;}
+ break;
+ }
+
+ case (1): //left
+ {
+ if (mBoard.IsPossibleMovement (mGame.mPosX - 1, mGame.mPosY, mGame.mPiece, mGame.mRotation))
+ {mGame.mPosX--;needErase=true;}
+ break;
+ }
+
+ case (4)://down
+ {
+ // Check collision from up to down
+ while (mBoard.IsPossibleMovement(mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation)) { mGame.mPosY++; }
+ needErase=true;
+ mBoard.StorePiece (mGame.mPosX, mGame.mPosY - 1, mGame.mPiece, mGame.mRotation);
+ mGame.AddPoints(SinglePiecePoints);
+ int linesDeleted = mBoard.DeletePossibleLines ();
+ if(linesDeleted>0)
+ {
+ mGame.AddClearedLines(linesDeleted);
+ mGame.AddPoints(LineClearPoints*linesDeleted);
+ //Thread t1(FlashLight);
+ //PlayClearSound();
+ clear_board();
+ }
+ UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines());
+
+ if (mBoard.IsGameOver())
+ {
+ isGameOver=true;
+ uLCD.cls();
+
+ // FIX add Game Over mechanic
+
+ //uLCD.media_init();
+ //uLCD.set_sector_address(0x001D, 0x7842);
+ //uLCD.display_image(0,0);
+ //Thread t2(GameOverLight);
+ //PlayOverSound();
+
+ }
+
+ if(!isGameOver)
+ {
+ mGame.CreateNewPiece(RandomGen('a'),RandomGen('b'));
+ clear_next_piece();
+ }
+ break;
+ }
+
+ case (3)://rotate
+ {
+ if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY, mGame.mPiece, (mGame.mRotation + 1) % 4))
+ {mGame.mRotation = (mGame.mRotation + 1) % 4;needErase=true;}
+ break;
+ }
+
+ case (0):{break;}
+ }
+ key_input = 0;
+
+ // ----- Vertical movement -----
+
+ if(timer.read_ms()>WAIT_TIME)
+ {
+ needErase=true;
+ if(!isGameOver)
+ {
+ if (mBoard.IsPossibleMovement (mGame.mPosX, mGame.mPosY + 1, mGame.mPiece, mGame.mRotation))
+ {
+ mGame.mPosY++;
+ }
+ else
+ {
+ mBoard.StorePiece (mGame.mPosX, mGame.mPosY, mGame.mPiece, mGame.mRotation);
+ mGame.AddPoints(SinglePiecePoints);
+ int linesDeleted = mBoard.DeletePossibleLines ();
+ if(linesDeleted>0)
+ {
+ mGame.AddClearedLines(linesDeleted);
+ mGame.AddPoints(LineClearPoints*linesDeleted);
+ //Thread t1(FlashLight);
+ //PlayClearSound();
+ clear_board();
+ }
+ UpdateGameStatus(mGame.GetPoints(),mGame.GetClearedLines());
+
+ if (mBoard.IsGameOver())
+ {
+ isGameOver=true;
+ uLCD.cls();
+
+ // FIX add Game Over mechanic
+
+ //uLCD.media_init();
+ //uLCD.set_sector_address(0x001D, 0x7842);
+ //uLCD.display_image(0,0);
+ //Thread t2(GameOverLight);
+ //PlayOverSound();
+ }
+
+ if(!isGameOver)
+ {
+ mGame.CreateNewPiece(RandomGen('a'),RandomGen('b'));
+ clear_next_piece();
+ }
+ }
+ }
+ timer.reset();
+ }
+ wait(0.1);
+ }
+}