Python实现外星人入侵小游戏:从费米悖论到代码详解
本文结合费米悖论探讨外星生命存在的可能性,并详细讲解如何使用Python和Pygame库实现经典的“外星人入侵”小游戏。文章包含完整的游戏逻辑代码、资源加载方法及运行环境配置,适合Python初学者了解游戏开发流程。
1 为什么找不见外星人
为何我们至今未观测到外星文明?物理学界曾有一位著名学者费米,他因发现中子轰击效应而闻名。费米提出了一个著名的悖论:既然宇宙如此浩瀚,为何我们从未见过外星人?这一追问背后的逻辑是,从概率角度来看,人类不可能是宇宙中唯一的智慧生命。人类只是自然演化的产物,只要自然条件满足特定状态,生命便会产生。太阳系仅是银河系中微不足道的部分,而银河系内拥有2000亿至4000亿颗恒星。
2 关于宇宙
天文学家目前的观测数据显示,约5%的恒星拥有行星系统。以银河系2000亿颗恒星计算,拥有行星的恒星数量是一个巨大的数字。假设其中仅有1%是类地行星,再假设类地行星中仅有1%孕育了生命(如单细胞生物),最后假设拥有生命的行星中仅有1%演化出高智慧生物,经过层层推算,学界得出的结论是:仅银河系内就可能存在约100万颗拥有类似人类高智慧生物的行星。即便保守估计为10万颗,银河系也只是数千亿个星系中的一个。尽管高智慧生物的总质量在宇宙中占比极低,但其分布范围极其广泛。如此众多的潜在文明,为何从未造访地球?
3 宇宙物演进程
根据天体物理学研究,宇宙起源于137亿年前的奇点大爆炸。在爆炸后的17亿年至50亿年间,恒星开始形成。值得注意的是,最迟在50亿年前恒星已大量出现,其中5%拥有行星。太阳系与恒星形成的时间差仅为40亿年左右。这意味着,在宇宙诞生50多亿年后,生命出现的可能性就已经存在。换句话说,高智慧生物的演化时间可能比人类早几十亿年。太阳系形成于宇宙大爆炸后约80多亿年,而恒星系在50亿年前已存在。理论上,比地球人早20多亿至30多亿年出现的高智慧生物早已存在,而人类文明拥有思想和文字符号的历史不过短短五千年。
4 游戏外星人入侵展示
视频演示链接
外星人入侵
5 Python代码实现
#====导入相关库=====
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()至此,关于Python实现“外星人入侵”小游戏的详细代码介绍完毕。如需了解更多Python相关游戏开发内容,请查阅本站往期文章或继续浏览后续教程。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









