如何用Python软件来玩游戏用什么语音软件

教你用python实现游戏图像识别,让计算机全自动替你玩转“跳一跳”!【优就业】
昨天,我的老师用Excel完成了一个跳一跳的辅助工具,没错,就是那个制表格的家伙噢,不过呢,还是需要一部分手动的,需要人工找出画面上的起跳点和落脚点,告诉了Excel之后,Excel才能控制小人跳跃。(相关阅读推荐:)
今天,我们来尝试下,能不能用python完全自动化的解决这个问题呢?(完整代码下载方法及需要的修改说明在本文末尾)
二、实际效果
上述流程图中,读取屏幕、计算距离、跳跃,都是稳定的技术手段,相信看看后面简单的介绍你肯定能搞定。
识别小人位置和着落点的算法才是难点,也是实现全自动跳跃的关键环节,并且如果游戏内容发生变化,识别算法还需要跟进做适应性修改。好吧,先看下本代码的实际识别效果
更多原创文章,IT资料,请加群领取精美礼包!群问题答案:很强势(很重要!)
为了调试图片识别算法,我把手机屏幕读入计算机后,取了一个不重复的时间戳放在文件名中,这样每一步的截图都能顺序保留下来。其后执行图像分析识别时,再将识别过程标记在图片上,最后保存识别的结果。这么处理之后,如果算法有问题就很容易发现问题并加以调试了。
三、实现技术
1、实现对手机的控制,基于ADB
命令行实现。这是一个官方的android手机工具包,很小,下载后也无需安装,直接运行命令行就能完成截屏、传文件、点击等任务。
3、实现图片内容的识别
引入PIL(Python Imaging
Library),它能提供基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等,
可以用其中的Image.open
加载图片文件,getpixel读取指定点的颜色,putpixel修改指定点的颜色,save用于保存修改后的图片,show调用Windows照片查看器来显示图片,方便调试。
四、主要算法
1、【从手机读取当前游戏屏幕】
os.system("adb shell screencap -p
手机上的文件名")os.system("adb pull 手机上的文件名 本地磁盘的文件名")
2、【识别出画面中小人位置和目的地中心点位置+计算出两点之间的距离点数】
专门用了一个distance函数,该函数输入的参数是(图片文件名,识别结果文件名),输出就是距离点数
其中图片文件名就是前一步骤的“本地磁盘的文件名”。识别的过程中,在原图片上做辅助线绘图,并把识别的效果保存在新文件中,这样如果有识别错误的场景,就可以对比识别前后的图片,进而调整distance的算法了。
distance函数的具体内容较长,简单讲下思路,具体实现请直接看源码。(完整代码全部免费奉送,请关注后私信发送“180117代码”字样,系统会自动回复本文测试代码以及ADB驱动软件的下载地址)
distance函数算法:拿到图片后,首先找小人,以脚部颜色为特征,搜索到后取均值。然后以屏幕上方空白处颜色为种子,逐行搜索到最顶部物件的顶点,由于屏幕背景色为渐变色,搜索时逐行替换新的背景色,避免偏差较大。找到物件顶点后,以其为出发点向下逐行判断物件宽度,找到最宽的一行,该行物件宽度中点即为目的地。
3、【需要按压屏幕的时间=距离X经验系数】
按压时间 = int(距离 * 系数)
4、【按照指定的时间模拟按压屏幕】
os.system("adb shell input swipe
10 20 15 {:d} {:d}".format(random.randint(20, 80), int(距离 *
五、关于成绩的有效性
写这个代码主要乐趣在完成控制任务本身,而不在于分数能不能保留。所以没做太多掩饰。即便如此,实测现在的代码自动跳跃也是能产生有效成绩的,如果你的成绩无效,请注意检查下:1、分数太高超出人力极限的分数肯定不保留。2、正常分数幅度内的,系统也可分析你的操作是否规律来判断是不是外挂,譬如始终差不多的频率跳一下,每次都能命中中心点,每次模拟滑动都触摸同一个位置,那么也很容易分析出你是机器人操作。
所以,如果你分数丢失的话,请自行调整代码,加随机数让点击屏幕的位置不同,不要每次都命中中心,两次跳跃之间要加一点随机延时。
(我喜欢在成绩分数比较特殊的地方退出,实测,555、666分系统都接受了,且朋友圈互相可见)
六、实验代码下载
下载的代码执行时请注意修改这两处
完整代码请加入中公教育IT技术交流群:,验证问题请发送“很强势!”
用简单的视频教程,让初学者玩转python,
office办公软件教程,论文简历书写技巧?通通免费给!戳领取!更有PS,Axure教程等你来领哦!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在玩中学习,体验Python的强大,带你在游戏中学习Python
我的图书馆
在玩中学习,体验Python的强大,带你在游戏中学习Python
利用python写“猜数字”,“猜词语”,“谁是卧底”这三个游戏,从而快速掌握python编程的入门知识,包括python语法/列表/元组/字典/流程控制/库函数等等。环境参数linux平台,python 3.4。需要在linux中把python 3.4编译一下,这样编写python程序时保存为.py格式的文件并添加执行权限再终端运行即可(原理跟shell脚本相同),非常方便。ps:贴出来的python程序代码在windows中也兼容,只不过运行方式不是命令行,而是要通过python软件。设计实现猜数字很多人在聚餐时都玩过猜数字游戏,由某人随机出一个指定范围内的数,然后其他人一个一个猜,猜的过程中区间不断缩小,直到猜中为止。这里的猜数字游戏就是用程序来代替那个出数字的人,程序算法设计为:1.输入数字区间---&2.系统产生区间内的随机数---&3.玩家输入自己猜的数字---&4.比较玩家猜的与答案的高低并提示---&5.未猜中则回到3,猜中则提示猜次数代码很少,如下所示:第一行是要让linux系统知道这是python3程序,random是产生随机数的库函数,要注意的是python对格式要求很严格,因为它不用通过{}而是通过缩进量判断流程。通过这个可以掌握基本的语法和编写规则了,下面再试试有点难度的,用到词组和循环控制等知识。猜词语电视节目中的”你来比划我来猜“大家应该都看过,而且很多人也玩过,规则就是一个人看词语比划相应动作和说一些提示,另一个人看不到词语要通过比划的动作猜出来,猜的过程中主持人判断是否符合规则。某一组玩家猜词语的算法设计为:1.开始计时---&2.猜词语---&3.答对则正确数加1并回到2,要跳过或犯规了则直接回到2,超时了直接跳到3---&3.循环10次后或时间结束后统计答对的题数有num组玩家就进行以上流程的num次循环,当然也要准备x组词语,因为每组玩家猜的词语是不同的。代码量不大,如下所示:其实词语可以做成从独立的文件中读入的方式,这样方便更新和管理,下面就介绍一种用“字典”的方式来获得“谁是卧底”的卧底词。谁是卧底谁是卧底也是深受很多人喜欢的游戏,起码要三人以上才能玩,大致分为几个阶段:1.分配平民词语和卧底词语---&2.玩家依次发言---&3.根据发言投票认为谁是卧底---&4.得到票数最多的玩家出局---&5.出局玩家刚好是卧底则平民胜利,如果出局玩家是平民则被冤死并继续第2步,当剩下的平民只有1个时卧底胜利。特殊情况是,出现两名或以上的玩家票数相同,则相同票数的玩家重新发言,然后全体针对这几个玩家投票。程序设计思想:输入玩家数num,玩家编号为0~num-1,然后定义三个含有num个元素的列表:词语列表,计算玩家票数的列表,死亡玩家的列表。列表下标从0~num-1,随机产生该区间的数x,代表x号玩家是卧底,然后分配卧底词和平民词。注意,提示几号玩家是卧底或冤死的时候,要将打印信息时候的下标加1,比如下标数0代表的其实是1号玩家。在生活中,没多少人会习惯说自己是“第0个人”这种说法吧,除了程序员- -;在每轮游戏中,依次进行发言,投票,票数最多的玩家出局(出现相同票数则重新发言),出局玩家归入死亡玩家列表。然后开始下一轮。那么,如果有num位玩家,则最多有多少轮游戏结束?因为进行到只有2位玩家游戏就结束了,所以答案是num-2轮!也就是说上述流程要循环num-2次。编程思想定了就可以敲代码了,程序代码如下:有一行代码是from spyword import spyword这里spyword是我自己定义的卧底词字典,运行时把这个文件放在python的工作目录下,就可以让python程序调用该字典了。要查看python工作目录,你需要运行python后输入&&& import os&&& os.getcwd()当然你也可以更改python工作目录。总结python是一门简洁高效,通俗易懂的高阶动态编程语言;很多人也称之为“胶水语言”,在接到大项目时往往用python写好主体框架,然后在一些特定模块再用java/js/C++之类的语言实现特定需求。掌握python并不难,通过这篇博客讲到的三个小游戏,希望您能发现python的乐趣,快速找到python编程的窍门。
喜欢该文的人也喜欢求助编写Python程序来自动玩2048游戏【python吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:187,895贴子:
求助编写Python程序来自动玩2048游戏收藏
最近用Python编了个2048游戏,4x4的方格当做4x4的矩阵(matrix),矩阵是用list的形式表示的如0 2 4 82 4 8 00 0 0 00 0 0 0就是 [[0,2,4,8],[2,4,8,0],[0,0,0,0],[0,0,0,0]]有一些函数已经给出:向左移(*a*)是merge_left(mat) 会return (new_mat, m, total_score)其中mat是原矩阵,new_mat是新得到的矩阵,m是True或者False(取决于可不可以这样移), total_score是新增加的分数类似的向右移(*d*):merge_right(mat)向下移(*s*):merge_down(mat)向上移(*w*):merge_up(mat)都会return一个新矩阵,True/ False, 新增的分数好,问题来了我想写个程序能自动得到2048,尽量让最大数呆在左下方比如def AI(mat):
if merge_down(mat)[1]:
return *s*
elif merge_left(mat)[1]:
return *a*
elif merge_right(mat)[1]:
return *d*
return *w*很显然这样无法得到2048,有哪位高人可以指点一下
python_总监级名师全程面授,项目实战案例式教学,企业需求无缝对接,助你无忧就业!python,0基础21周快速实现高薪就业,0元试听两周.名额有限,欲报从速.点击抢座
这是要写AI啊,算法感觉有点烦懒得看~~
登录百度帐号每天更新文章,分享编程那点事.
Python竟然可以开发如此炫酷的游戏
由于微信限制,本文中的链接无法打开,请点击阅读原文!有小伙伴在知乎提问:Python能开发游戏吗?如果能的话有哪些开源项目?看到这个题目,我突然想到大概在一年前我曾经尝试研究过用Python开发一些小游戏,实际上Python中本是有一些对应的官方或者非官方的游戏开发库。下面小甲就给大家展示展示Python到底能开发怎样的游戏。1. Github上面有个项目Free Python Games,里面集合了不少的Python开发的小游戏,能玩,也适合新手用来练练手,另外 PyGame 这个网站里面里面集合了很多Python开发的小游戏。2. Python版本的 Flapy Bird 简化版,但是感觉更加难玩了。当然你也可以尝试用Python开发原版的 Flapy Bird,涵盖了颜色图像等:Flappy Block - 1.03. 小时候经常在手机上玩的一个游戏,也是一款经典的街机游戏,这款游戏进化之后其实就是一个打乒乓的小游戏,这里同样有一个进化版本,图形设计的更加好看:Ping Pong4. 以前初高中在学校很无聊的时候跟同桌或者前后桌玩的游戏,你还记得么5. 同样一款小时候在小霸王上玩的游戏:Junk Jungle6. 除此之外,一款比较有名基于Pyhton的战争的游戏:Home - TaleWorlds Entertainment7. 一款看起来非常有趣的3D游戏:Galcon8. 据说是能与Pyhton搭上边最有名的一款游戏,但好像他的客户端是用的C++,我试了一下很炸裂:EVE Online - One community. Countless journeys.9. 当然还是有很多你想不到的,这里有一个Python Game长长的列表,欢迎品尝:PythonGames - Python Wiki是不是发现Python开发的游戏还是有点意思的?有空还可以在Github上面看看他们的源码,来学习学习自己也做一个。点击阅读原文可以访问文中的一些GIthub链接。近期热文知乎:路人甲为程序员提供优质内容
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!天赋是绕不过去的大山,机遇与努力也缺一不可
手把手教你用python写游戏
最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,项目来自《Python编程从入门到实践》(本文将原项目中的部分错误进行修改完善,PS:强烈推荐这本书,真的很赞),来感受下其中的有趣之处。本次开发的游戏叫做alien invasion。
安装pygame并创建能左右移动的飞船
安装pygame
本人电脑是windows 10、python3.6,pygame下载地址:
请自行下载对应python版本的pygame
运行以下命令
$ pip install wheel
$ pip install pygame-1.9.3-cp36-cp36m-win_amd64.whl
创建Pygame窗口及响应用户输入
新建一个文件夹alien_invasion,并在文件夹中新建alien_invasion.py文件,输入如下代码。
import sys
import pygame
def run_game():
pygame.init()
screen = pygame.display.set_mode((1200,800))
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(bg_color)
pygame.display.flip()
run_game()
运行上述代码,我们可以得到一个灰色界面的窗口:
$ python alien_invasion.py
创建设置类
为了在写游戏的过程中能便捷地创建一些新功能,下面额外编写一个settings模块,其中包含一个Settings类,用于将所有设置存储在一个地方。这样在以后项目增大时修改游戏的外观就更加容易。
我们首先将alien_invasion.py中的显示屏大小及显示屏颜色进行修改。
首先在alien_invasion文件夹下新建python文件settings.py,并向其中添加如下代码:
class Settings(object):
"""docstring for Settings"""
def __init__(self):
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
然后再alien_invasion.py中导入Settings类,并使用相关设置,修改如下:
import sys
import pygame
from settings import Settings
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(ai_settings.bg_color)
pygame.display.flip()
run_game()
添加飞船图像
接下来,我们需要将飞船加入游戏中。为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame()方法blit()绘制它。
在游戏中几乎可以使用各种类型的图像文件,但是使用位图(.bmp)文件最为简单,这是因为Pygame默认加载位图。虽然其他类型的图像也能加载,但是需要安装额外的库。我们推荐去免费的图片素材网站上去找图像:。我们在主项目文件夹(alien_invasion)中新建一个文件夹叫images,将如下bmp图片放入其中。
接下来,我们创建飞船类ship.py:
import pygame
class Ship():
def __init__(self,screen):
self.screen = screen
self.image = pygame.image.load('image/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
self.screen.blit(self.image,self.rect)
最后我们在屏幕上绘制飞船,即在alien_invasion.py文件中调用blitme方法:
import sys
import pygame
from settings import Settings
from ship import Settings
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
ship = Ship(screen)
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
run_game()
重构:模块game_functions
在大型项目中,经常需要在添加新代码前重构既有代码。重构的目的是为了简化代码的结构,使其更加容易扩展。我们将实现一个game_functions模块,它将存储大量让游戏Alien invasion运行的函数。通过创建模块game_functions,可避免alien_invasion.py太长,使其逻辑更容易理解。
函数check_events()
首先我们将管理事件的代码移到一个名为check_events()的函数中,目的是为了隔离事件循环
import sys
import pygame
def check_events():
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
然后我们修改alien_invasion.py代码,导入game_functions模块,并将事件循环替换成对函数check_events()的调用:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
ship = Ship(screen)
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
gf.check_events()
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
run_game()
将更新屏幕的代码移到一个名为update_screen()函数中,并将这个函数放在模块game_functions中:
def update_screen(ai_settings,screen,ship):
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
其中alien_invasion修改如下:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
ship = Ship(screen)
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()
从上面一套流程走下来,我们发现:在实际的开发过程中,我们一开始将代码编写得尽可能的简单,并在项目越来越复杂时进行重构。接下来我们开始处理游戏的动态方面。
这里我们要实现的就是使玩家通过左右箭头键来控制飞船的左移与右移。
因为在pygame中,每次按键都被注册为KEYDOWN事件,在check_events()中,我们通过event.type检测到KEYDOWN事件后还需进一步判断是哪个按键。代码如下:
def check_events(ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.rect.centerx +=1
允许不断移动
玩家按住右箭头不动时,我们希望飞船能不断地移动,知道玩家松开为止。这里我们通过KETUO事件来判断。因此我们设置一个标志位moving_right来实现持续移动。原理如下:
飞船不动时,标志moving_right将为false。玩家按下右箭头时,我们将这个标志设置为T玩家松开时,我们将标志重新设置成False。
这个移动属性是飞船属性的一种,我们用ship类来控制,因此我们给这个类增加一个属性名称叫,moving_right以及一个update()方法来检测标志moving_right的状态。
self.moving_right = False
def update(self):
if self.moving_right:
self.rect.centerx +=1
game_functions
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.type == pygame.KEYUP:
if event.key = pygame.K_RIGHT:
ship.moving_right = False
最后在alien_invasion中调用update()方法
while True:
gf.check_events(ship)
ship.update()
前面我们实现了向右移动,接下来实现向左移动,逻辑类似,代码就不贴了。
调整飞船的速度
当前,每次执行while循环时,飞船最多移动一个像素,我们可以在Settings中添加ship_speed_factor,用于控制飞船的速度。我们将根据这个属性决定飞船每次循环时最多移动多少距离。
Settings:
class Settings(object):
"""docstring for Settings"""
def __init__(self):
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
self.ship_speed_factor = 1.5
class Ship():
def __init__(self,ai_settings,screen):
self.screen = screen
self.ai_settings = ai_settings
限制飞船的活动范围
如果玩家按住箭头的时间过长,飞船就会消失,那么如何使飞船抵达屏幕边缘时停止移动?这里我们只需要修改Ship类中的update方法,增加一个逻辑判断。
这里我们主要讲check_events()函数进行重构,将其中部分代码分成两部分,一部分处理KEYDOWN事件,一部分处理KEYUP事件。
game_functions:
def check_keydown_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ship)
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
接下来添加射击功能,使玩家按空格键时发射子弹,子弹将在屏幕中向上穿行,抵达屏幕后消失。
添加子弹设置
在Settings类中增加一些子弹的属性,这里我们创建一个宽3像素,高15像素的深灰色子弹。子弹的速度比飞船稍低。
创建Bullet类
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
"""A class to manage bullets fired from the ship."""
def __init__(self, ai_settings, screen, ship):
"""Create a bullet object, at the ship's current position."""
super().__init__()
self.screen = screen
self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,
ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
"""Move the bullet up the screen."""
self.y -= self.speed_factor
self.rect.y = self.y
def draw_bullet(self):
"""Draw the bullet to the screen."""
pygame.draw.rect(self.screen, self.color, self.rect)
将子弹存储到group中
前面定义了Bullet类和必要的设置后,就可以编写代码了,在玩家每次按空格键时都会发射一发子弹。首先,我们在alien_invasion中创建一个group,用于存储所有的有效子弹。
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
ship = Ship(ai_settings,screen)
bullets = Group()
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
gf.check_events(ai_settings, screen, ship,bullets)
ship.update()
bullets.update()
gf.update_screen(ai_settings, screen, ship,bullets)
这里我们修改check_keydown_events()函数,来监听玩家按下空格键的事件。这里还需要修改update_screen()函数,确保屏幕每次更新时,都能重绘每一个子弹。
我们来看下效果:
删除消失的子弹
在alien_invasion中删除消失的子弹。
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
ship = Ship(ai_settings,screen)
bullets = Group()
pygame.display.set_caption("Alien Invasion")
bg_color = (230,230,230)
while True:
gf.check_events(ai_settings, screen, ship,bullets)
ship.update()
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom &=0:
bullets.remove(bullet)
gf.update_screen(ai_settings, screen,ship,bullets)
run_game()
限制子弹数量
为了鼓励玩家有目标的射击,我们规定屏幕上只能同时存在3颗子弹,我们只需要在每次创建子弹前检查未消失的子弹数目是否小于3即可。
为了使alien_invasion中代码更加简单,我们将检查子弹管理的代码,移到game_functions模块中:
def update_bullets(bullets):
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom&=0:
bullets.remove(bullet)
创建fire_bullet()函数
这里我们将发射子弹的代码移到一个独立的函数中:
def fire_bullet(ai_settings,screen,ship,bullets):
if len(bullets) & ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
添加外星人,并检测碰撞
在我们完成新的任务之前,我们先给游戏添加一个结束游戏的快捷键Q:
创建第一个外星人
这里和创建飞船的方法一样
class Alien(Sprite):
"""A class to represent a single alien in the fleet."""
def __init__(self, ai_settings, screen):
"""Initialize the alien, and set its starting position."""
super().__init__()
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
def blitme(self):
"""Draw the alien at its current location."""
self.screen.blit(self.image, self.rect)
创建一群外星人
这里我们首先确定一行能容纳多少个外星人以及要绘制几行。这里改动代码较多,直接看效果:
移动外星人
前面我们创建的是静态的外星人,现在我们需要让外星人动起来。这里我们在Settings类中设置外星人移动的速度,然后通过Alien类中的update的方法来实现移动
射杀外星人
要想射杀外星人,就必须先检测两个编组成员之间是否发生碰撞,在游戏中,碰撞就是游戏元素重叠在一起。这里我们使用sprite.groupcollide()来检测两个编组的成员之间的碰撞。
子弹击中外星人时,需要立马知道,并同时使被碰撞的外星人立即消失,因此我们需要在更新子弹的位置后立即检测碰撞。
这里我们还需要知道何时该结束游戏,有以下几种情况:
飞船全部被摧毁
外星人到达屏幕底部
实际效果:
最后我们将给游戏添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏。我们还将实现一个计分系统,能够在玩家等级提高时加快节奏。
添加Play按钮
这里可以先将游戏初始化为非活动状态,当我们点击了按钮,就开始游戏。由于Pygame中没有内置的创建按钮的方法。因此我们可以通过创建一个Button类来创建一个自带标签的实心矩形。我们通过检测鼠标发生点击后的坐标是否与我们绘制的按钮发生碰撞与否来判断是否发生了点击事件。
为了使玩家将敌人消灭干净后能够提高游戏难度,增加趣味性,这里我们可以在Settings类中进行修改,增加静态初始值,和动态初始值。
记分、等级、剩余飞船
打包成exe可执行文件
上面游戏开发完了,那么你需要将其转成文exe的可执行文件。我们采用pyinstaller,安装步骤参考:
github地址:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 禁止玩游戏的软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信