今日Python练手小游戏——打飞机
2018-09-05 07:57:17来源:博客园 阅读 ()
打飞机文字版
思路:
1:主飞机从底层y = 1生成,左右移动 ,每次左右x轴随机移动n个位置,并且移送过的地方每一个位置都会生成一个子弹,并发射。如果此位置Y轴正好有小飞机,则击落一架且一次只能击落,加一分。(击落多架除非下一次随机位置还在原地)
2:小飞机到底层时消失,即y = 0时候消失。(这个条件暂时没用)
3:小飞机从顶层y = 10水平位置生成,x位置随机,每次随机生成三个
4:主飞机本身长度y=1。当主飞机和小飞机下一个坐标都为(x,1)时,碰撞。游戏结束。
之前版本运行完成会发现如下一个bug:小飞机生成因为是随机的,所以可能随机生成n个,其中有 n=<1个飞机位置会重复,所以会出现以下现象 :
只发射了6个炮弹,却在水平方向打掉了十多个飞机,这是因为生成飞机重复了,甚至有三四个飞机随机生成在一个y = 10的水平位置上。
问题的BUG已经完善,加一个小飞机刷出条件不重叠。
代码如下:
importrandom
asr
import sys
legal_x = [
0,
10]
legal_y = [
0,
25]
class Big:
def __init__(self):
"""在y=1随机生成炮台位置"""
self.x = r.randint(
0,
10)
self.y =
1
def move(self):
self.Interval = []
"""随机移动左右方向并移动到新的位置(x,1)"""
self.step = r.randint(
0,legal_x[
1])
self.direction = r.randint(-
1,
1)
#方向,-1为左,0不移动,1为右
new_x = self.x + self.direction * self.step
mew_y = self.y
"""判断是否越界"""
if
new_x > legal_x[
1]:
pos_x = legal_x[
1] - (new_x - legal_x[
1])
pos_y = mew_y
elif
new_x < legal_x[
0]:
pos_x = legal_x[
0] - new_x
pos_y = mew_y
else
:
pos_x = new_x
pos_y = mew_y
"""炮台移动前后对应坐标"""
if
self.x > pos_x:
for
i
inrange(pos_x,self.x +
1):
self.Interval.append(i)
print(
"炮台从坐标x=%d移动到x=%d,沿途轰了%d炮"%(self.x,pos_x,self.x +
1-pos_x ))
print(
">>>轰出%d个炮的位置是x ="% (self.x +
1-pos_x),end =
"")
print(self.Interval)
elif
self.x < pos_x:
for
i
inrange(self.x,pos_x +
1):
self.Interval.append(i)
print(
"炮台从坐标x=%d移动到x=%d,沿途轰了%d炮"%(self.x,pos_x,pos_x +
1-self.x ))
print(
">>>轰出%d个炮的位置是x ="% (pos_x +
1-self.x),end =
"")
print(self.Interval)
else
:
self.Interval.append(pos_x)
print(
">>>炮台原地轰了一炮")
print(
">>>轰炮的坐标是x = %s"% str(self.Interval))
"""初始化炮台到移动的目标"""
self.x = pos_x
self.y = pos_y
return
(pos_x,pos_y)
class Small:
def __init__(self):
"""在y=25随机生成小飞机位置"""
self.x = r.randint(
0,legal_x[
1])
self.y = legal_y[
1]
def move(self):
"""固定移动,每次向下一步"""
new_x = self.x
mew_y = self.y -
1
"""判断是否越界"""
if
mew_y <= legal_y[
0]:
self.x = r.randint(
0,legal_x[
1])
self.y = legal_y[
1]
else
:
self.x = new_x
self.y = mew_y
return
(new_x , mew_y)
class Boom:
"""核武器"""
def __init__(self):
self.x = r.randint(
0,legal_x[
1])
self.y =
1
def DAFEIJI(n):
Scorer =
0
list_s = []
big_air = Big()
"""激光炮台出场"""
i = r.randint(
9,
10)
while
n:
list_pos = []
boom = Boom()
"""核武器生成"""
for
numbers
inrange(
1,i +
1):
small_air = Small()
#小飞机出场数量位置随机,设置不重叠
if
small_air.x
notin
list_pos:
list_pos.append(small_air.x)
list_s.append(small_air)
else
:
continue
pos = big_air.move()
n = n -
1
if
pos != (boom.x ,boom.y):
for
each
inlist_s[:]:
pos_small = each.move()
if
pos == pos_small:
print(
">>>>>>>很不幸! 您的炮台撞小飞机了....GG!!")
#这个几率.....
print(
"本次打飞机的分数是:%d"% Scorer)
sys.exit(
0)
elif
pos_small[
0]
in(big_air.Interval):
"""一条直线打的,其实是激光炮"""
print(
"一架小飞机被打掉..")
Scorer +=
1
list_s.remove(each)
else
:
print(
"炮台加载了核武器...======================清屏!=======================..")
Scorer += len(list_s)
list_s.clear()
print(
"本次打飞机的分数是:%d"% Scorer)
#==============================主程序==================================
DAFEIJI(
5)
初始界面y值越大,游戏结束几率越小。
想了解更多Python知识或者想与更多的朋友一起学习交流,可以加群705673780,群文件内更多免费资料可供学习哦~
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:巧用python“int”函数
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash