Python實現外星人去哪瞭小遊戲詳細代碼

1 為什麼找不見外星人

為什麼我們見不到外星人? 曾經在物理學上有一個著名人物叫費米,大傢知道費米是在物理學上發現中子轟擊的人,有一個著名的費米悖論,就是費米追問為什麼外星人還見不到? 費米的這個追問包含的意思是這樣的,地球上產生人類,從幾率上講,絕不可能人類獨在。 因為人類隻不過是一個自然界的造物,隻要自然條件達到這個狀態,生命就會進入這個狀態。大陽系隻是一個小小的星系,僅銀河系就有兩千到四千億顆恒星。 

2 關於宇宙

天文學傢今天發現大約有5%的恒星有行星。大傢算一下,拿兩千億算,5%的恒星有行星, 這是一個多大的數量級。然後我們假定在所有的行星中隻有1%是類地行星。我們再假定在類地行星中隻有1%有生命,有低等生命,比如單細胞。 我們再假定有生命的行星上隻有1%有高智生物,你就這樣一點一 點把它往下推 。你知道學界推出的結論是什麼?僅銀河系大約有一百萬顆行星上有類似於人這樣的高智生物。 我們說少一點,十萬,僅銀河系。請記住,銀河系隻不過是宇宙中數千億個星系中的一個星系。大傢想想,雖然高智生物的總質量在宇宙中極低,但它的分佈量何其之大。如此之多的高智生物,它為什麼沒有來到過地球?

3 宇宙物演進程

我再給大傢說一組數據。據天文物理學傢研究,一百三十七億年前,宇宙從奇點爆發,大約在爆發以後的十七億年到五十億年之間形成恒星。大傢註意,我說最遲是五十億年恒星發生,而恒星裡有5%有行星,要知道太陽系行星和恒星之間出現差距僅四十億年左右。 也就是說出現生命的可能性,在宇宙剛剛發生五十多億年以後就出現瞭。我這個話的意思是說,高智生物演化時間最長,可能可以長到比我們人類早幾十億年。大傢要知道太陽系才五十億年,也就是宇宙爆炸以後八十多億年以後太陽系才出現。 而五十億年的時候, 恒星系已經發生瞭。理論上比地球人早的高智生物二十多億年以前,三十多億年以前就出現瞭,而我們人類文明才不過短五千年,就是有思想,有文字符號,才不過短五千年。

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 外星人去哪瞭內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: