python
主页 > 脚本 > python >

Python实现外星人去哪了小游戏

2022-03-08 | 秩名 | 点击:

1 为什么找不见外星人

为什么我们见不到外星人? 曾经在物理学上有一个著名人物叫费米,大家知道费米是在物理学上发现中子轰击的人,有一个著名的费米悖论,就是费米追问为什么外星人还见不到? 费米的这个追问包含的意思是这样的,地球上产生人类,从几率上讲,绝不可能人类独在。 因为人类只不过是一个自然界的造物,只要自然条件达到这个状态,生命就会进入这个状态。大阳系只是一个小小的星系,仅银河系就有两千到四千亿颗恒星。 

2 关于宇宙

天文学家今天发现大约有5%的恒星有行星。大家算一下,拿两千亿算,5%的恒星有行星, 这是一个多大的数量级。然后我们假定在所有的行星中只有1%是类地行星。我们再假定在类地行星中只有1%有生命,有低等生命,比如单细胞。 我们再假定有生命的行星上只有1%有高智生物,你就这样一点一 点把它往下推 。你知道学界推出的结论是什么?仅银河系大约有一百万颗行星上有类似于人这样的高智生物。 我们说少一点,十万,仅银河系。请记住,银河系只不过是宇宙中数千亿个星系中的一个星系。大家想想,虽然高智生物的总质量在宇宙中极低,但它的分布量何其之大。如此之多的高智生物,它为什么没有来到过地球?

3 宇宙物演进程

我再给大家说一组数据。据天文物理学家研究,一百三十七亿年前,宇宙从奇点爆发,大约在爆发以后的十七亿年到五十亿年之间形成恒星。大家注意,我说最迟是五十亿年恒星发生,而恒星里有5%有行星,要知道太阳系行星和恒星之间出现差距仅四十亿年左右。 也就是说出现生命的可能性,在宇宙刚刚发生五十多亿年以后就出现了。我这个话的意思是说,高智生物演化时间最长,可能可以长到比我们人类早几十亿年。大家要知道太阳系才五十亿年,也就是宇宙爆炸以后八十多亿年以后太阳系才出现。 而五十亿年的时候, 恒星系已经发生了。理论上比地球人早的高智生物二十多亿年以前,三十多亿年以前就出现了,而我们人类文明才不过短五千年,就是有思想,有文字符号,才不过短五千年。

4 游戏外星人入侵展示

外星人入侵

5 Python代码实现

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

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

#====导入相关库=====

import os

import sys

import cfg

import random

import pygame

from modules import *

  

#==========开始游戏==========

def startGame(screen):

    clock = pygame.time.Clock()

    # 加载字体

    font = pygame.font.SysFont('arial', 18)

    if not os.path.isfile('score'):

        f = open('score', 'w')

        f.write('0')

        f.close()

    with open('score', 'r') as f:

        highest_score = int(f.read().strip())

    # 敌方

    enemies_group = pygame.sprite.Group()

    for i in range(55):

        if i < 11:

            enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)

        elif i < 33:

            enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)

        else:

            enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)

        enemy.rect.x = 85 + (i % 11) * 50

        enemy.rect.y = 120 + (i // 11) * 45

        enemies_group.add(enemy)

    boomed_enemies_group = pygame.sprite.Group()

    en_bullets_group = pygame.sprite.Group()

    ufo = ufoSprite(color=cfg.RED)

     

    #====================我方=================

    myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)

    my_bullets_group = pygame.sprite.Group()

    #==============用于控制敌方位置更新=========

    #===========移动一行===========

    enemy_move_count = 24

    enemy_move_interval = 24

    enemy_move_flag = False

    #==改变移动方向(改变方向的同时集体下降一次)===

    enemy_change_direction_count = 0

    enemy_change_direction_interval = 60

    enemy_need_down = False

    enemy_move_right = True

    enemy_need_move_row = 6

    enemy_max_row = 5

    #===用于控制敌方发射子弹===

    enemy_shot_interval = 100

    enemy_shot_count = 0

    enemy_shot_flag = False

    #===游戏进行中===

    running = True

    is_win = False

    #=============主循环==================

    while running:

        screen.fill(cfg.BLACK)

        for event in pygame.event.get():

            #===点右上角的X或者按Esc键退出游戏=====

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()

            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:

                    pygame.quit()

                    sys.exit()

            #===============射击===================

            if event.type == pygame.MOUSEBUTTONDOWN:

                my_bullet = myaircraft.shot()

                if my_bullet:

                    my_bullets_group.add(my_bullet)

        #====我方子弹与敌方/UFO碰撞检测=============

        for enemy in enemies_group:

            if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):

                boomed_enemies_group.add(enemy)

                enemies_group.remove(enemy)

                myaircraft.score += enemy.reward

        if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):

            ufo.is_dead = True

            myaircraft.score += ufo.reward

        #==========更新并画敌方============

        #============敌方子弹=============

        enemy_shot_count += 1

        if enemy_shot_count > enemy_shot_interval:

            enemy_shot_flag = True

            enemies_survive_list = [enemy.number for enemy in enemies_group]

            shot_number = random.choice(enemies_survive_list)

            enemy_shot_count = 0

        #==========敌方移动================

        enemy_move_count += 1

        if enemy_move_count > enemy_move_interval:

            enemy_move_count = 0

            enemy_move_flag = True

            enemy_need_move_row -= 1

            if enemy_need_move_row == 0:

                enemy_need_move_row = enemy_max_row

            enemy_change_direction_count += 1

            if enemy_change_direction_count > enemy_change_direction_interval:

                enemy_change_direction_count = 1

                enemy_move_right = not enemy_move_right

                enemy_need_down = True

                #==========每次下降提高移动和射击速度=======

                enemy_move_interval = max(15, enemy_move_interval-3)

                enemy_shot_interval = max(50, enemy_move_interval-10)

        #===========遍历更新====================

        for enemy in enemies_group:

            if enemy_shot_flag:

                if enemy.number == shot_number:

                    en_bullet = enemy.shot()

                    en_bullets_group.add(en_bullet)

            if enemy_move_flag:

                if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):

                    if enemy_move_right:

                        enemy.update('right', cfg.SCREENSIZE[1])

                    else:

                        enemy.update('left', cfg.SCREENSIZE[1])

            else:

                enemy.update(None, cfg.SCREENSIZE[1])

            if enemy_need_down:

                if enemy.update('down', cfg.SCREENSIZE[1]):

                    running = False

                    is_win = False

                enemy.change_count -= 1

            enemy.draw(screen)

        enemy_move_flag = False

        enemy_need_down = False

        enemy_shot_flag = False

        #================敌方爆炸特效===============

        for boomed_enemy in boomed_enemies_group:

            if boomed_enemy.boom(screen):

                boomed_enemies_group.remove(boomed_enemy)

                del boomed_enemy

        #============敌方子弹与我方飞船碰撞检测===========

        if not myaircraft.one_dead:

            if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):

                myaircraft.one_dead = True

        if myaircraft.one_dead:

            if myaircraft.boom(screen):

                myaircraft.resetBoom()

                myaircraft.num_life -= 1

                if myaircraft.num_life < 1:

                    running = False

                    is_win = False

        else:

            #===========更新飞船================

            myaircraft.update(cfg.SCREENSIZE[0])

            #============画飞船=============

            myaircraft.draw(screen)

        if (not ufo.has_boomed) and (ufo.is_dead):

            if ufo.boom(screen):

                ufo.has_boomed = True

        else:

            #=========更新UFO=========

            ufo.update(cfg.SCREENSIZE[0])

            #===画UFO===

            ufo.draw(screen)

        #===画我方飞船子弹===

        for bullet in my_bullets_group:

            if bullet.update():

                my_bullets_group.remove(bullet)

                del bullet

            else:

                bullet.draw(screen)

        #===画敌方子弹===

        for bullet in en_bullets_group:

            if bullet.update(cfg.SCREENSIZE[1]):

                en_bullets_group.remove(bullet)

                del bullet

            else:

                bullet.draw(screen)

        if myaircraft.score > highest_score:

            highest_score = myaircraft.score

        # --得分每增加2000我方飞船增加一条生命

        if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):

            myaircraft.old_score = myaircraft.score

            myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)

        # --敌人都死光了的话就胜利了

        if len(enemies_group) < 1:

            is_win = True

            running = False

        # --显示文字

        # ----当前得分

        showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)

        showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)

        # ----敌人数量

        showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)

        showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)

        # ----历史最高分

        showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)

        showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)

        # ----FPS

        showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)

        # --显示剩余生命值

        showLife(screen, myaircraft.num_life, cfg.GREEN)

        pygame.display.update()

        clock.tick(cfg.FPS)

    with open('score', 'w') as f:

        f.write(str(highest_score))

    return is_win

  

  

#=============主函数======================

def main():

    # 初始化

    pygame.init()

    pygame.display.set_caption('宇宙演化——为什么外星人来不了地球')

    screen = pygame.display.set_mode(cfg.SCREENSIZE)

    pygame.mixer.init()

    pygame.mixer.music.load(cfg.BGMPATH)

    pygame.mixer.music.set_volume(0.4)

    pygame.mixer.music.play(-1)

    while True:

        is_win = startGame(screen)

        endInterface(screen, cfg.BLACK, is_win)

  

  

#=============运行======================

  

if __name__ == '__main__':

    main()

原文链接:https://blog.csdn.net/weixin_46039719/article/details/123266134
相关文章
最新更新