Skip to content

Commit 01eea30

Browse files
authored
Merge pull request larymak#373 from sahilrw/dino-game
add the dino game
2 parents 9354d09 + 8d193d4 commit 01eea30

File tree

12 files changed

+343
-0
lines changed

12 files changed

+343
-0
lines changed

GAMES/dino-game/README.md

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Dino Game
2+
3+
## Description
4+
5+
Dino Game is a simple yet addictive game built using Python and Pygame library. It's inspired by the classic Chrome Dinosaur game, where the player controls a dinosaur that must jump over obstacles to survive. The game features a dinosaur character, cactus obstacles, and a score system. I have created a simple clone of the game. Feel free to look through the code and run it.
6+
7+
## Features
8+
9+
- Control a dinosaur character to jump over obstacles.
10+
- Dodge incoming cactus obstacles to survive.
11+
- Track and display the player's score as they progress through the game.
12+
- Simple controls: Press the spacebar to make the dinosaur jump.
13+
- Press Enter to restart the game after a game over.
14+
15+
## Installation
16+
17+
1. Ensure you have Python installed on your system. You can download it from [python.org](https://www.python.org/).
18+
2. Clone this repository to your local machine:
19+
20+
```
21+
git clone https://github.com/sahilrw/dino
22+
```
23+
24+
3. Navigate to the project directory:
25+
26+
```
27+
cd dino-game
28+
```
29+
30+
4. Install the required dependencies using pip:
31+
32+
```
33+
pip install pygame
34+
```
35+
36+
## Usage
37+
38+
1. Run the game by executing the following command:
39+
40+
```
41+
python dino.py
42+
```
43+
44+
2. Use the spacebar to make the dinosaur jump over obstacles.
45+
3. Avoid colliding with cactus obstacles to keep the game going.
46+
4. Your score will increase as you progress. Try to beat your high score!
47+
5. If the dinosaur collides with an obstacle, the game will end. Press Enter to restart and play again.
48+
49+
## Screenshots
50+
51+
![Dino Game Screenshot](screenshot.png)
52+
![Dino Game Screenshot](gameover.png)
53+
54+
## Credits
55+
56+
- This game was created by Sahil Wankhade.

GAMES/dino-game/assets/images/bg.png

8.58 KB
Loading
2.3 KB
Loading
642 Bytes
Loading
626 Bytes
Loading
635 Bytes
Loading

GAMES/dino-game/assets/sounds/die.wav

50.8 KB
Binary file not shown.
24.8 KB
Binary file not shown.
99.3 KB
Binary file not shown.

GAMES/dino-game/dino.py

+287
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
import os
2+
import sys
3+
import math
4+
import random
5+
import pygame
6+
7+
WIDTH = 623
8+
HEIGHT = 150
9+
10+
pygame.init()
11+
pygame.mixer.init()
12+
pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512)
13+
screen = pygame.display.set_mode((WIDTH, HEIGHT))
14+
pygame.display.set_caption("Dino Game")
15+
16+
17+
class BG:
18+
def __init__(self, x):
19+
self.width = WIDTH
20+
self.height = HEIGHT
21+
self.x = x
22+
self.y = 0
23+
self.set_texture()
24+
self.show()
25+
26+
def update(self, dx):
27+
self.x += dx
28+
if self.x <= -WIDTH:
29+
self.x = WIDTH
30+
31+
def show(self):
32+
screen.blit(self.texture, (self.x, self.y))
33+
34+
def set_texture(self):
35+
path = os.path.join("assets/images/bg.png")
36+
self.texture = pygame.image.load(path)
37+
self.texture = pygame.transform.scale(self.texture, (self.width, self.height))
38+
39+
40+
class Dino:
41+
def __init__(self):
42+
self.width = 44
43+
self.height = 44
44+
self.x = 10
45+
self.y = 80
46+
self.texture_num = 0
47+
self.dy = 2.6
48+
self.gravity = 1.2
49+
self.onground = True
50+
self.jumping = False
51+
self.jump_stop = 10
52+
self.falling = False
53+
self.fall_stop = self.y
54+
self.set_texture()
55+
self.set_sound()
56+
self.show()
57+
58+
def update(self, loops):
59+
# dino jump
60+
if self.jumping:
61+
self.y -= self.dy
62+
if self.y <= self.jump_stop:
63+
self.fall()
64+
65+
# dino onground after jump
66+
elif self.falling:
67+
self.y += self.gravity * self.dy
68+
if self.y >= self.fall_stop:
69+
self.stop()
70+
71+
# dino moving(running)
72+
elif self.onground and loops % 4 == 0:
73+
self.texture_num = (self.texture_num + 1) % 3
74+
self.set_texture()
75+
76+
def show(self):
77+
screen.blit(self.texture, (self.x, self.y))
78+
79+
def set_texture(self):
80+
path = os.path.join(f"assets/images/dino{self.texture_num}.png")
81+
self.texture = pygame.image.load(path)
82+
self.texture = pygame.transform.scale(self.texture, (self.width, self.height))
83+
84+
def set_sound(self):
85+
path = os.path.join("assets/sounds/jump.wav")
86+
self.sound = pygame.mixer.Sound(path)
87+
88+
def jump(self):
89+
self.sound.play()
90+
self.jumping = True
91+
self.onground = False
92+
93+
def fall(self):
94+
self.jumping = False
95+
self.falling = True
96+
97+
def stop(self):
98+
self.falling = False
99+
self.onground = True
100+
101+
102+
class Cactus:
103+
def __init__(self, x):
104+
self.width = 34
105+
self.height = 44
106+
self.x = x
107+
self.y = 80
108+
self.set_texture()
109+
self.show()
110+
111+
def update(self, dx):
112+
self.x += dx
113+
114+
def show(self):
115+
screen.blit(self.texture, (self.x, self.y))
116+
117+
def set_texture(self):
118+
path = os.path.join("assets/images/cactus.png")
119+
self.texture = pygame.image.load(path)
120+
self.texture = pygame.transform.scale(self.texture, (self.width, self.height))
121+
122+
123+
class Collision:
124+
def between(self, obj1, obj2):
125+
distance = math.sqrt((obj1.x - obj2.x) ** 2 + (obj1.y - obj2.y) ** 2)
126+
return distance < 35
127+
128+
129+
class Score:
130+
def __init__(self, hs):
131+
self.hs = hs
132+
self.act = 0
133+
self.font = pygame.font.SysFont("monospace", 20)
134+
self.color = (0, 0, 0)
135+
self.set_sound()
136+
self.show()
137+
138+
def update(self, loops):
139+
self.act = loops // 10
140+
self.check_hs()
141+
self.check_sound()
142+
143+
def show(self):
144+
self.lbl = self.font.render(f"HI {self.hs} {self.act}", 1, self.color)
145+
lbl_width = self.lbl.get_rect().width
146+
screen.blit(self.lbl, (WIDTH - lbl_width - 10, 10))
147+
148+
def set_sound(self):
149+
path = os.path.join("assets/sounds/point.wav")
150+
self.sound = pygame.mixer.Sound(path)
151+
152+
def check_hs(self):
153+
if self.act >= self.hs:
154+
self.hs = self.act
155+
156+
def check_sound(self):
157+
if self.act % 100 == 0 and self.act != 0:
158+
self.sound.play()
159+
160+
161+
class Game:
162+
def __init__(self, hs=0):
163+
self.bg = [BG(x=0), BG(x=WIDTH)]
164+
self.dino = Dino()
165+
self.obstacles = []
166+
self.collision = Collision()
167+
self.score = Score(hs)
168+
self.speed = 3
169+
self.playing = False
170+
self.set_sound()
171+
self.set_labels()
172+
self.spawn_cactus()
173+
174+
def set_labels(self):
175+
big_font = pygame.font.SysFont("monospace", 26, bold=True)
176+
small_font = pygame.font.SysFont("monospace", 20)
177+
self.big_lbl = big_font.render(f"G A M E O V E R", 1, (0, 0, 0))
178+
self.small_lbl = small_font.render(f"Press Enter to Restart", 1, (0, 0, 0))
179+
180+
def set_sound(self):
181+
path = os.path.join("assets/sounds/die.wav")
182+
self.sound = pygame.mixer.Sound(path)
183+
184+
def start(self):
185+
self.playing = True
186+
187+
def over(self):
188+
self.sound.play()
189+
screen.blit(
190+
self.big_lbl, (WIDTH // 2 - self.big_lbl.get_width() // 2, HEIGHT // 4)
191+
)
192+
screen.blit(
193+
self.small_lbl,
194+
(WIDTH // 2 - self.small_lbl.get_width() // 2, HEIGHT // 2),
195+
)
196+
self.playing = False
197+
198+
def tospawn(self, loops):
199+
return loops % 100 == 0
200+
201+
def spawn_cactus(self):
202+
# list with cactus
203+
if len(self.obstacles) > 0:
204+
prev_cactus = self.obstacles[-1]
205+
# 44 pixels is width of dino
206+
# 84 pixels is random value for dino to jump between two cactus without dying
207+
x = random.randint(
208+
prev_cactus.x + self.dino.width + 130,
209+
WIDTH + prev_cactus.x + self.dino.width + 100,
210+
)
211+
else:
212+
x = random.randint(WIDTH + 100, 1000)
213+
214+
# create new cactus
215+
cactus = Cactus(x)
216+
self.obstacles.append(cactus)
217+
218+
def restart(self):
219+
self.__init__(hs=self.score.hs)
220+
221+
222+
def main():
223+
# Objects
224+
game = Game()
225+
dino = game.dino
226+
227+
clock = pygame.time.Clock()
228+
loops = 0
229+
over = False
230+
231+
while True:
232+
if game.playing:
233+
loops += 1
234+
235+
# Code to display Background
236+
for bg in game.bg:
237+
bg.update(-game.speed)
238+
bg.show()
239+
240+
# Code to display Dino
241+
dino.update(loops)
242+
dino.show()
243+
244+
# Code to display Cactus
245+
if game.tospawn(loops):
246+
game.spawn_cactus()
247+
248+
for cactus in game.obstacles:
249+
cactus.update(-game.speed)
250+
cactus.show()
251+
252+
# logic for collisions
253+
if game.collision.between(dino, cactus):
254+
over = True
255+
256+
if over:
257+
game.over()
258+
259+
# score
260+
game.score.update(loops)
261+
game.score.show()
262+
263+
for event in pygame.event.get():
264+
# end the game on clicking quit button
265+
if event.type == pygame.QUIT:
266+
pygame.quit()
267+
sys.exit()
268+
if event.type == pygame.KEYDOWN:
269+
if event.key == pygame.K_SPACE:
270+
if not over:
271+
if dino.onground:
272+
dino.jump()
273+
274+
if not game.playing:
275+
game.start()
276+
277+
if event.key == pygame.K_RETURN:
278+
game.restart()
279+
dino = game.dino
280+
loops = 0
281+
over = False
282+
283+
clock.tick(120)
284+
pygame.display.update()
285+
286+
287+
main()

GAMES/dino-game/gameover.png

22.2 KB
Loading

GAMES/dino-game/screenshot.png

12.4 KB
Loading

0 commit comments

Comments
 (0)