Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 01eea30

Browse files
authored
Merge pull request #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

Lines changed: 56 additions & 0 deletions
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[フレーム]

‎GAMES/dino-game/assets/images/dino0.png

642 Bytes
Loading[フレーム]

‎GAMES/dino-game/assets/images/dino1.png

626 Bytes
Loading[フレーム]

‎GAMES/dino-game/assets/images/dino2.png

635 Bytes
Loading[フレーム]

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

50.8 KB
Binary file not shown.

‎GAMES/dino-game/assets/sounds/jump.wav

24.8 KB
Binary file not shown.

‎GAMES/dino-game/assets/sounds/point.wav

99.3 KB
Binary file not shown.

‎GAMES/dino-game/dino.py

Lines changed: 287 additions & 0 deletions
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()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /