网络编程
位置:首页>> 网络编程>> Python编程>> Python实现外星人去哪了小游戏详细代码

Python实现外星人去哪了小游戏详细代码

作者:是梦吧,是你吧!  发布时间:2023-08-07 13:42:44 

标签: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()

来源:https://blog.csdn.net/weixin_46039719/article/details/123266134

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com