Python实现外星人去哪了小游戏详细代码
作者:是梦吧,是你吧! 发布时间:2023-08-07 13:42:44
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
猜你喜欢
- 佛爷去了公司的年夜饭,我有点无聊就在公司 Coding 点东西玩玩,于是就有了这玩意。请允许我很猥·琐得将这个游戏称之为“是男人坚持 100
- PHP lcfirst() 函数实例把 "Hello" 的首字符转换为小写。:<?php echo lcfirst
- 使用xlwt读取txt文件内容,并且写入到excel中,代码如下,已经加了注释。代码简单,具体代码如下:# coding=utf-8'
- 1、远程登录到linux上,使用到的模块paramiko#远程登陆操作系统def ssh(sys_ip,username,password,
- 是在CSDN论坛看到的一个问题,平常我也没有注意,或者说没有这样用吧。看代码 <body id="ww
- 1.导言现今的公司需要易访问的和可用性好的商业数据,以便他们可以在全球市场中获得一席之地。与易访问数据的这个需求相呼应的,关系数据库和分析数
- 通过使用zabbix 日志监控 我发现一个问题 例如oracle的日志有报错的情况 ,通常不会去手动清理 这样的话当第二次有日志写进来的时候
- 本文实例为大家分享了js实现黑白div块画空心图形的具体代码,供大家参考,具体内容如下<!DOCTYPE html><ht
- 现在有一个xml,格式如下: <date> <item> <id> 1 </id> <
- 以下是我做美工的两年生活中一条条总结出来的经验,每一点都是我常用的,虽然不是什么大学问,但我觉得要互相学习才能提高,所以现在拿出来和大家一起
- 之前没有注意过div的background-image这个属性,只是设置它的url,今天遇到一个问题特此做一下记录。 <div id=
- 在计算机信息技术中,少有象类似 XML 那样的技术,她让人们产生范围很大的联想,而这些联想及其应用又可能相距甚远。她也更多引起人们对 XML
- 由于工作需要,这两天在看GOOGLE MAP 的 API,需要在公司的网站上使用地图。今天把看过之后的一点使用方法,跟大家一起分享:演示地址
- 以下的文章主要是介绍SQL Server数据转换服务的4妙用之执行一些自动化的操作。在SQL Server数据库的实际操作管理中,数据库管理
- 当成功安装了PHP,MYSQL后,我们一般要安装phpMyAdmin来管理你的mysql。本文介绍了phpMyAdmin 2.10.2的配置
- 为网页设置防火墙的主要目的是根据网页内容对不同来访者提供不同的服务,利用Java Script或VB Script,我们很容易做到这一点。但
- 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解。那么我们来分析下两位大神 次碳酸钴 和
- 如何选择速度最快的站点? <html><head><meta http-equiv=&qu
- 经常有网友会问,SQL Server占用了太多的内存,而且还会不断的增长;或者说已经设置了使用内存,可它没有用到那么多,这是怎么一回事儿呢?
- 什么是浮动?浮动是 css 的定位属性。我们可以看一下印刷设计来了解它的起源和作用。印刷布局中,文本可以按照需要围绕图片。一般把这种方式称为