阅读 149

Pygame实战之实现扎气球游戏

这篇文章主要为大家介绍了利用Python中的Pygame模块实现的一个扎气球游戏,文中的示例代码讲解详细,对我们了解Pygame模块有一定的帮助,感兴趣的可以学习一下

目录
  • 导语

  • 正文

    • 一、准备中

    • 二、代码演示

    • 三、效果展示

导语

前几天,有人私信小编:

说陪女朋友在小广场上面逛街玩儿扎气球:结果一个都没扎破,扎心了老铁。

女朋友都要离家出走了~让我给想想办法:小编只想给你一个表情。

哈哈哈,开玩笑的~于是,为了满足需求,小编做了一个重大决定:熬夜给他做了一款扎气球的小

游戏,可以拿去哄哄女朋友啦~

这游戏做完之后木子已经替大家玩儿过了,这个很棒,不信的话你自己试试?

正文

本文的扎气球小游戏原型就是路边的扎气球的游戏撒,基于Pygame做的!

就准备好射的箭、不同颜色的气球、一张背景图片、然后爆炸的特效就可。哦~对了音乐还是要准备,游戏的话有音乐背景才更有趣哦~

一、准备中

1)素材资料

首先是准备好需要的素材、图片、背景音乐:

2)运行环境

环境安装 本文用到的运行环境:Python3.7、Pycharm社区版2020、Pygame游戏模块部分自带

模块直 接导入不需要安装。

模块安装:


1
pip install -i https://pypi.douban.com/simple/ +模块名

二、代码演示

这款小游戏总的有6个.py文件组成的,代码比较都啦,这里就只放一点点哈!

主程序运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
from game import *
  
def main() :
    intro = True
    game = Game()
    game.loadMusic()
    game.readHighScore()
    pygame.mixer.music.play(loops=-1)
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                intro = False
        game.screen.fill(SKY_BLUE)
        game.screen.blit(game.background, game.background_rect)
        game.draw.Button(200, 2*game.HEIGHT/3, "PLAY", BRIGHT_GREEN, GREEN, game.gameloop, 150, 100)
        game.draw.Button(game.WIDTH/2 - 75, 2*game.HEIGHT/3, "PLAY TIMED", BRIGHT_RED, RED, game.time_restricted, 150, 100)
        game.draw.Button(game.WIDTH-350, 2*game.HEIGHT/3, "QUIT", BRIGHT_GREEN, GREEN, quit, 150, 100)
        game.draw.draw_text("__ArcuS__", game.WIDTH/2, game.HEIGHT/3, 200, BLUE)
        game.draw.draw_text("HIGH SCORE:%d" % (game.highscore), game.WIDTH-400, 50, 30, BLACK)
        pygame.display.flip()
        game.clock.tick(FPS)
  
main()
定义的一些常量:桌面背景、音乐等等。
  
FPS = 60
GRAVITY = 0.15
PI = 3.142
  
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (200, 0, 0)
BRIGHT_RED = (255, 0, 0)
GREEN = (0, 200, 0)
BRIGHT_GREEN = (0, 255, 0)
SKY_BLUE = (0, 255, 255)
BLUE = (0, 0, 255)
GREEN_YELLOW=(181,255,98)
BROWN=(204,102,0)
DARK_BROWN=(204,76,0)
  
HIGHSCORE_FILE="highscore.txt"
ARROW_IMAGE = "assets/arrow_1.png"
BACKGROUND_IMAGE = "assets/background.png"
  
EXPLOSION_SOUND = "assets/boom.wav"
CLICK_SOUND = "assets/select.wav"
MUSIC_FILE = "assets/tgfcoder-FrozenJam-SeamlessLoop.ogg"
VOLUME = 0.2
  
ARROW_SIZE = (16, 150)
BALOON_SIZE = (100, 100)
HIT_RADIUS = 15
MISSES = 15
GAME_TIME = 60
定义游戏精灵类等:
  
import pygame
import math
import random
from os import path
from constants import *
  
#游戏精灵类
class Arrow(pygame.sprite.Sprite):
    def __init__(self,game):
        pygame.sprite.Sprite.__init__(self)
        self.WIDTH = game.WIDTH
        self.HEIGHT = game.HEIGHT
        self.image_orig = pygame.transform.scale(game.arrow_img, ARROW_SIZE)
        self.image_orig.set_colorkey(BLACK)
        self.image = self.image_orig
        self.rect = self.image.get_rect()
        self.rect.centerx = self.WIDTH/2
        self.rect.bottom = self.HEIGHT-100
        self.rot = 0
        self.speedx = 0
        self.speedy = 0
        self.range = 0
        self.max_height = 0
        self.release_angle = 0
        self.set_vel = False
        self.Released = False
        self.releasex = self.rect.centerx
        self.releasey = self.rect.bottom
        self.cy = self.rect.centery
        self.game = game
  
    def update(self):
        if self.Released:
            self.speedy -= GRAVITY
            self.rect.bottom -= self.speedy
            self.rect.centerx += self.speedx
            self.rot = (-math.atan2(self.speedx, self.speedy)*180/3.14) % 360
            new_image = pygame.transform.rotate(self.image_orig, self.rot)
  
            old_center = self.rect.center
            self.image = new_image
            self.rect = self.image.get_rect()
            self.rect.center = old_center
            # print "moving"
            if self.rect.bottom < 0 or self.rect.left > self.WIDTH + 10 or self.rect.right < -10:
                self.kill()
             
        else:
            mouse = pygame.mouse.get_pos()
            click = pygame.mouse.get_pressed()
            if mouse[1] > self.rect.centery and click[0] == 1:
                self.set_vel = True
                dist = math.sqrt(
                    math.pow(self.rect.centerx-mouse[0], 2)+math.pow(self.rect.bottom-mouse[1], 2))
                # print dist
  
                self.rect.centerx = mouse[0]
                self.rect.centery = mouse[1]
                # print(2*GRAVITY*(self.rect.centery-mouse[1]))
                self.speedy = math.sqrt(2*GRAVITY*(-self.cy+mouse[1]))*4
                self.speedx = self.speedy * \
                    (mouse[0]-self.releasex)/(self.cy-mouse[1])
                self.rot = (-math.atan2(self.speedx, self.speedy)
                            * 180/3.14*0.5) % 360
                new_image = pygame.transform.rotate(self.image_orig, self.rot)
                old_center = self.rect.center
                self.image = new_image
                self.rect = self.image.get_rect()
                self.rect.center = old_center
  
                # print "setting velocity"
  
            else:
                if self.set_vel:
                    self.Released = True
                    self.game.last_arrow_time = pygame.time.get_ticks()
                    self.max_height = (self.rect.bottom-mouse[1])
                    self.range = (mouse[0]-self.rect.centerx)*2
                    # print "releasing"
                # math.sqrt(math.pow(mouse[0]-self.rect.centerx,2)+math.pow(mouse[1]-self.rect.centery,2)) < 200:
                else:
                    if (mouse[0]-self.rect.centerx) != 0:
                        theta = math.atan(
                            (mouse[1]-self.rect.bottom)/(self.rect.centerx-mouse[0]))
                    else:
                        theta = PI
                    move = theta-self.rot
                    self.rot = math.degrees(theta)
                    new_image = pygame.transform.rotate(
                        self.image_orig, self.rot)
                    old_center = self.rect.center
                    self.image = new_image
                    self.rect = self.image.get_rect()
                    self.rect.center = old_center
                    # print "rotating"
                    # print self.rot
                    # print theta
  
  
class Baloon(pygame.sprite.Sprite):
    def __init__(self,game):
        pygame.sprite.Sprite.__init__(self)
        self.WIDTH = game.WIDTH
        self.HEIGHT = game.HEIGHT
        bcolor = random.choice(game.baloon_color)
        temp = "assets/balloon_{}.png".format(bcolor)
        self.image_orig = pygame.image.load(
            path.join(path.dirname(__file__), temp))
        if bcolor == "blue":
            self.image_orig.set_colorkey(BLUE)
        elif bcolor == "black":
            self.image_orig.set_colorkey(BLACK)
        elif bcolor == "green":
            self.image_orig.set_colorkey(BRIGHT_GREEN)
        elif bcolor == "red":
            self.image_orig.set_colorkey(BRIGHT_RED)
  
        self.image_orig = pygame.transform.scale(self.image_orig, BALOON_SIZE)
        self.image = self.image_orig.copy()
        self.rect = self.image.get_rect()
        self.radius = HIT_RADIUS
  
        temp = random.randrange(self.WIDTH - self.rect.width)
        while (-150 < temp-self.WIDTH/2 < 150):
            temp = random.randrange(self.WIDTH - self.rect.width)
        self.rect.x = temp
        self.rect.y = random.randrange(self.HEIGHT+100, self.HEIGHT+150)
        self.speedy = random.randrange(-4, -1)
        self.speedx = random.randrange(-3, 3)
        self.game = game
        self.last_update = pygame.time.get_ticks()
        # print "baloon"
  
    def update(self):
        self.rect.y += self.speedy
        if self.rect.top < -20 or self.rect.left < -25 or self.rect.right > self.WIDTH + 20:
            self.kill()
            self.game.misses += 1

三、效果展示

游戏规则的话:箭会出现在游戏界面底部中间位置,拉动它:即是鼠标左键拉动方向可自己调整,

直接向下拉动然后放箭射中气球即可。射中的越多积累的分数越高哦!

1)截图展示效果——

游戏开始界面如下:

游戏开始界面如下:

扎中气球效果如下:

游戏结束总成绩13分:

2)视频展示效果——


到此这篇关于Pygame实战之实现扎气球游戏的文章就介绍到这了

原文链接:https://blog.csdn.net/weixin_55822277/article/details/122086118


文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐