Doodle Jump Plus

A Python and Accelerometer Based Game on Raspberry-Pi 4 Rong Xu (rx25), Yingjia Zhang (yz2723) ECE 5725 | Dec 12, 2021 | Thursday Lab

Project Introduction

We are going to design and implement a game similar to Doodle Jump. It is based on Pygame and Accelerometer. There are an endless series of platforms. The goal is to keep the jumping alien from falling. Our final game box acts as an embedded device with a user interface based on the RPi 4. The integrated circuit including the Pi and accelerometer which carry out computation based on the users’ behavior and respond accordingly in real time.

Project Objective

  • Implement platforms systems which have random positions each time.
  • Mimic the real jump track and the garvity effect.
  • Realize the no-boundary effect: when the alien reaches the edge, it comes back from another edge.
  • Design different platforms functions. e.g. springs so that alien can jump much further, broken so that it will cause failure.
  • Use batteries to be the power of Raspberry Pi to make a wireless gamebox.

Design and Testing


Hardware

Adafruit LIS3DH Triple-Axis Accelerometer is used to control the x direction of the player. We wired it with the Raspberry Pi using I2C interface.

We connected Pi 3.3V power to sensor Vin, Pi GND to sensor GND, Pi SCL to sensor SCL, Pi SDA to sensor SDA, and Pi GPIO6 to sensor INT for interrupt service. Any general GPIO pin without other functions can be chosen to connect to INT.

Fig 1: Wiring

To use the libraries, we installed the dependencies and Adafruit CircuitPython LIS3DH library on the board. Note that we need to run "sudo pip3" to install bus device dependencies system-wide. Otherwise there would be an error message that the bus device is not found.

Fig 2: Accelerometer Testing Results

Software

1 Platform Generation

Four categories of platforms are generated randomly. The green ones are basic, the blue ones are moving platforms, the red ones will break if jumped on. Additionally, springs are randomly appended to green platforms to give the player a speed boost. The information of each platform are stored in a python list. Four integers are used to determine the x and y coordinates, the category and the state of the platform. The last parameter is only for the blue and red platforms to decide the moving direction and which image to display.

The x positions are totally random within display range. A variable is used to keep track of the difficulty level, and the y coordinates are random integers within a range near the difficulty level. As the player moves up, the distances along y axis becomes larger.

2 Position Update

We keep the player jumping by giving it an initial velocity along y axis. If it collides with a basic or moving platform, the velocity is reset to the initial one. If the player steps on a spring, it gets a larger initial speed. To mimic a gravity effect, the velocity is updated by adding gravity each time, and the position is updated by adding the velocity. The x coordinate is updated using the same logic, except that we get the acceleration from the sensor. Note that the velocity is set to be zero if we detect the direction has changed. This enables the player to move in the desired direction immediately, instead of waiting for the deceleration.

If the highest position of the player reaches two-thirds of the screen, it's time to move the whole system up. The is realized by subtracting an integer when displaying the images. We only need to increase this number when update is required.

3 Improvements

After testing our game several times, we found it's very likey to fail before the player gets a chance to jump on any platform. Because the user needs some time to react at the very beginning. A protection mechanism is developed to solve this problem. A flag is set in the initialization to enable the player to safely jump on the bottom edge. Once it collides to a platform, the flag is cleared and the game functions normally.

What's more, when the player reaches the right or left edge, it comes back from another side, which is helpful when the distance along x axis is too large.

To deliver a better game experience, we use a battery pack to charge the Raspberry-Pi and modified the bash script to have the game run automaticly.

4 Interface Design

There are two buttons on the main menu. Hitting "Play" enters game mode. Hitting "Score" enters a scoreboard that shows the top three scores. This is implemented using a list and sorting it each time. If the user breaks the record when a game ends, the screen shows "New High Score!" as a reminder. Otherwise, it displays "Game Over". We also create a jumping animation on the menu. The properties of the player needs to be reset after each game to prevent the menu animation and the game interfering with each other.

Final Deliverable

Photo Slideshow

Current Image: Main Menu

Conclusion

We recreated a fully functional Doodle Jump based on pygame, accelerometer and Raspberry-Pi 4. It has mature platform and score caculating systems. Moreover, a protection mechanism was developed for more user-friendly experience. We met all our goals we set at the beginning.

Future Work

  • Create a multiplayer mode for a second player to play.
  • Implement game sound effects.
  • Design another selection menu for users to choose different characters.

Bill of Materials

Part Cost
Bread Board Had beforehand
Accelerometer 3.55 dollars
Raspberry Pi 4 Lab component
Electrical Wires Lab component

References

[1] the Raspberry Pi wired with I2C
[2] Adafruit CircuitPython LIS3DH library
[3] Menu Image
[4] Game Images

Code

Please refer to the Code Appendix part on the web page.

Member Contributions

Yingjia
  • Soldered the accelerometer and wired it to the Pi.
  • Implemented and tested game functions.
  • Designed the user interface.
  • Implemented the auto-run of the game and assembled the battery pack.
Rong
  • Assist with the game implementation and test.
  • Design the user interface.
  • Write and design the overall web page and report.

Acknowledgements

We are very grateful to Professor Joe Skovira and all TAs for their great support! Thank you for all!