Python實現(xiàn)外星人去哪了小游戲詳細代碼
1 為什么找不見外星人
為什么我們見不到外星人? 曾經(jīng)在物理學上有一個著名人物叫費米,大家知道費米是在物理學上發(fā)現(xiàn)中子轟擊的人,有一個著名的費米悖論,就是費米追問為什么外星人還見不到? 費米的這個追問包含的意思是這樣的,地球上產(chǎn)生人類,從幾率上講,絕不可能人類獨在。 因為人類只不過是一個自然界的造物,只要自然條件達到這個狀態(tài),生命就會進入這個狀態(tài)。大陽系只是一個小小的星系,僅銀河系就有兩千到四千億顆恒星。
2 關(guān)于宇宙
天文學家今天發(fā)現(xiàn)大約有5%的恒星有行星。大家算一下,拿兩千億算,5%的恒星有行星, 這是一個多大的數(shù)量級。然后我們假定在所有的行星中只有1%是類地行星。我們再假定在類地行星中只有1%有生命,有低等生命,比如單細胞。 我們再假定有生命的行星上只有1%有高智生物,你就這樣一點一 點把它往下推 。你知道學界推出的結(jié)論是什么?僅銀河系大約有一百萬顆行星上有類似于人這樣的高智生物。 我們說少一點,十萬,僅銀河系。請記住,銀河系只不過是宇宙中數(shù)千億個星系中的一個星系。大家想想,雖然高智生物的總質(zhì)量在宇宙中極低,但它的分布量何其之大。如此之多的高智生物,它為什么沒有來到過地球?
3 宇宙物演進程
我再給大家說一組數(shù)據(jù)。據(jù)天文物理學家研究,一百三十七億年前,宇宙從奇點爆發(fā),大約在爆發(fā)以后的十七億年到五十億年之間形成恒星。大家注意,我說最遲是五十億年恒星發(fā)生,而恒星里有5%有行星,要知道太陽系行星和恒星之間出現(xiàn)差距僅四十億年左右。 也就是說出現(xiàn)生命的可能性,在宇宙剛剛發(fā)生五十多億年以后就出現(xiàn)了。我這個話的意思是說,高智生物演化時間最長,可能可以長到比我們?nèi)祟愒鐜资畠|年。大家要知道太陽系才五十億年,也就是宇宙爆炸以后八十多億年以后太陽系才出現(xiàn)。 而五十億年的時候, 恒星系已經(jīng)發(fā)生了。理論上比地球人早的高智生物二十多億年以前,三十多億年以前就出現(xiàn)了,而我們?nèi)祟愇拿鞑挪贿^短五千年,就是有思想,有文字符號,才不過短五千年。
4 游戲外星人入侵展示
外星人入侵
5 Python代碼實現(xiàn)
#====導入相關(guān)庫=====
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
#===用于控制敵方發(fā)射子彈===
enemy_shot_interval = 100
enemy_shot_count = 0
enemy_shot_flag = False
#===游戲進行中===
running = True
is_win = False
#=============主循環(huán)==================
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)
# ----敵人數(shù)量
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
#=============主函數(shù)======================
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()到此這篇關(guān)于Python實現(xiàn)外星人去哪了小游戲詳細代碼的文章就介紹到這了,更多相關(guān)Python 外星人去哪了內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python數(shù)據(jù)抓取3種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)抓取的3種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Python打包文件執(zhí)行報錯:ModuleNotFoundError: No module 
這篇文章給大家介紹了Python打包文件執(zhí)行報錯:ModuleNotFoundError: No module named ‘pymssql‘的解決方法,如果有遇到相同問題的朋友可以參考閱讀一下本文2023-10-10

