一个用Python制作的双人小游戏,里面有颜色碰撞检测,图章碰撞检测(项目编号碰撞检测)等等,以下是完整源代码:
"""
随机赛车双人游戏
本程序操作红色和青色两架小车去接金币,
障碍为红色的圈形。碰到障碍物后,小车会自动回到起始坐标。
接到一个金币后会进行统计。
这是一个多线程示例程序,两架小车在独自的线程中运行。
本程序还演示了颜色碰撞和对tkinter的items进行碰撞。
本程序需要Python精灵模块支持,如果没有安装,请在以下网址下载批处理进行安装。
https://www.lixingqiu.com/pms.bat
相关命令说明:
1、颜色碰撞检测命令collidecolor
本命令只对造型为图片的角色起作用,它会检测所碰到的角色上面的颜色,
如果是相应的颜色,则返回真,否则返回假。
它可以有两个参数,第一个参数是颜色,需要为RGB三元组格式,如(255,0,0)表示的是红色。
第二个参数应该是一个序列,表示要检测的角色,如果第二个参数为空,则检测所有角色。
本使中的car1.collidecolor(red,cs)命令,检测的是cs列表中的角色,而red的值是(255,0,0)。
它的意思car1有没有碰到cs列表中角色上面的红色。
2、overlap_with,与...重叠命令。
本命令查找有无和角色最小矩形重叠的项目(包括线条,圆点,多边形,圆弧,图章,填充区域,其它角色)。
它的参数可以是列表/元组/集合、整数与角色或字符串,返回重叠的所有项目编号。
本方法返回所有与角色矩形重叠的项目集合。
典型应用为用一个角色盖一些图章,把这些图章的编号收集起来,然后可以用overlap_with去检测有没有碰到这些图章。
本例中的金币有一个是角色,其它的都是图章。
它们的项目编号都放在coins列表中。和海龟画图一样,求一个角色的项目编号用turtle属性的_item值。
本例coin的项目编号为coin.turtle._item。而所有的图章的项目编号,在盖图章的时候都会直接返回。
"""
__author__ = '李兴球'
__date__ = '2020/5/27'
__blog__ = 'www.lixingqiu.com'
from sprites import * # 从精灵模块导入所有命令
from random import random # 从随机模块导入random命令
from threading import Thread # 从线程模块导入Thread类
width,height = 960,720 # 定义宽高
screen = Screen() # 生成屏幕
screen.setup(width,height) # 设置屏幕宽高
screen.bgcolor('gray') # 设定背景色
screen.title('随机赛车双人游戏') # 设定标题
red = (255,0,0) # 代表红色
r = Sprite('res/red.png') # 障碍物的本体
cs = [] # cs列表存储所有障碍物
for _ in range(30):
r.gotorandom(-200,200,-200,200,180)
x = (10 + random())/50
y = r.clone()
y.shapesize(x,x)
cs.append(y)
screen.listen()
r.hide()
# 生成一些金币
coin = Sprite(shape='circle')
coin.color('yellow')
coins = [coin.turtle._item] # coins列表存储的都是些项目编号(整数)
for _ in range(50):
coin.gotorandom() # 在到达屏幕范围任一点
item = coin.stamp() # 盖图章
coins.append(item) # 添加到coins列表
def redcarfunc():
"""
本函数是线程1的目标函数,
它主要是生成一辆小车,然后可以用上下左右键进行控制,
并且碰到红色的障碍物,它会回到起始点,
碰到黄色的圆形,它会得1分,并且黄色圆形会消失。
"""
score_bug = Sprite(visible=False,pos=(-200,250))
score_bug.color('red')
car1 = Sprite('res/redcar.png',pos=(-50,0))
car1.left(90)
car1.score = 0 # 自定义属性
leftkey = Key("Left")
rightkey = Key("Right")
upkey = Key("Up")
downkey = Key("Down")
while True:
if leftkey.down():car1.left(5)
if rightkey.down():car1.right(5)
if upkey.down():car1.fd(5)
if downkey.down():car1.bk(5)
if car1.collidecolor(red,cs):car1.slide((0,-50))
items = car1.overlap_with(coins)
car1.score += len(items)
if items:
[coin.clearstamp(i) for i in items]
score_bug.clear()
score_bug.write(car1.score,font=("",32,"normal"))
screen.update()
thread1 = Thread(target=redcarfunc) # 创建线程1
thread1.start() # 启动线程1
def cyancarfunc():
"""
本函数是线程2的目标函数,
它主要是生成一辆小车,然后可以用awsd键进行控制,
并且碰到红色的障碍物,它会回到起始点,
碰到黄色的圆形,它会得1分,并且黄色圆形会消失。
"""
score_bug = Sprite(visible=False,pos=(200,250))
score_bug.color('cyan')
car1 = Sprite('res/cyancar.png',pos=(50,0))
car1.left(90)
car1.score = 0 # 自定义属性
leftkey = Key("a")
rightkey = Key("d")
upkey = Key("w")
downkey = Key("s")
while True:
if leftkey.down():car1.left(5)
if rightkey.down():car1.right(5)
if upkey.down():car1.fd(5)
if downkey.down():car1.bk(5)
if car1.collidecolor(red,cs):car1.slide((0,50))
items = car1.overlap_with(coins)
car1.score += len(items)
if items:
[coin.clearstamp(i) for i in items]
score_bug.clear()
score_bug.write(car1.score,font=("",32,"normal"))
screen.update()
thread2 = Thread(target=cyancarfunc) # 创建线程2
thread2.start() # 启动线程2
PlaySound('Dance Energetic.wav',SND_LOOP|SND_ASYNC)
screen.mainloop()
