[Python] 纯文本查看 复制代码
import pygame, sys, math, random
pygame.init()
W,H=900,520
screen=pygame.display.set_mode((W,H))
clock=pygame.time.Clock()
# --------------------------
# 自动生成素材(全部是画出来的)
# --------------------------
def make_brick():
s=pygame.Surface((50,50),pygame.SRCALPHA)
s.fill((160,110,60))
pygame.draw.rect(s,(200,150,90),(0,0,50,50),5)
return s
def make_coin():
s=pygame.Surface((30,30),pygame.SRCALPHA)
pygame.draw.circle(s,(255,230,0),(15,15),13)
return s
def make_goomba():
s=pygame.Surface((40,40),pygame.SRCALPHA)
pygame.draw.ellipse(s,(150,75,0),(0,10,40,30))
pygame.draw.circle(s,(0,0,0),(12,22),5)
pygame.draw.circle(s,(0,0,0),(28,22),5)
return s
def make_koopa():
s=pygame.Surface((40,40),pygame.SRCALPHA)
pygame.draw.rect(s,(0,200,0),(5,15,30,20))
pygame.draw.circle(s,(0,150,0),(20,15),15)
return s
def make_shell():
s=pygame.Surface((40,30),pygame.SRCALPHA)
pygame.draw.ellipse(s,(0,150,0),(0,0,40,30))
return s
def make_player():
s=pygame.Surface((40,40),pygame.SRCALPHA)
pygame.draw.rect(s,(255,50,50),(10,5,20,30))
pygame.draw.rect(s,(255,200,0),(15,0,10,10))
return s
def bg(col):
s=pygame.Surface((900,520))
s.fill(col)
return s
brick_img=make_brick()
coin_img=make_coin()
goomba_img=make_goomba()
koopa_img=make_koopa()
shell_img=make_shell()
player_img=make_player()
bg1=bg((150,200,255))
bg2=bg((120,170,240))
bg3=bg((90,140,220))
# --------------------------
# 地图(写在代码里)
# --------------------------
T=50
tilemap=[
"...............................................................",
"...............................................................",
".....................C....................C.....................",
"......................................#######..................",
".....................###........................................",
"......C.........................................................",
"..............###.....................M.........................",
"####.........................K.................................G",
"################################################################"
]
tiles=[]
coins=[]
goombas=[]
koopas=[]
goal=None
for y,row in enumerate(tilemap):
for x,ch in enumerate(row):
wx,wy=x*T,y*T
if ch=="#": tiles.append(pygame.Rect(wx,wy,T,T))
elif ch=="C": coins.append(pygame.Rect(wx+10,wy+10,30,30))
elif ch=="M": goombas.append([pygame.Rect(wx,wy,40,40),1])
elif ch=="K": koopas.append([pygame.Rect(wx,wy,40,40),"walk",1])
elif ch=="G": goal=pygame.Rect(wx,wy,50,80)
# --------------------------
# 玩家
# --------------------------
player=pygame.Rect(100,200,40,40)
vx=0
vy=0
gravity=0.6
life=3
inv=0
camx=0
particles=[]
def add_particles(x,y):
for i in range(10):
particles.append([x,y,random.randint(3,6),random.uniform(-2,2)])
# --------------------------
# 主循环
# --------------------------
running=True
while running:
for e in pygame.event.get():
if e.type==pygame.QUIT:
sys.exit()
keys=pygame.key.get_pressed()
if inv>0: inv-=1
vx=0
if keys[pygame.K_LEFT]: vx=-5
if keys[pygame.K_RIGHT]: vx=5
on_ground=False
# 水平
player.x+=vx
for t in tiles:
if player.colliderect(t):
if vx>0: player.right=t.left
else: player.left=t.right
# 垂直
vy+=gravity
player.y+=vy
for t in tiles:
if player.colliderect(t):
if vy>0:
player.bottom=t.top
vy=0
on_ground=True
else:
player.top=t.bottom
vy=0
if keys[pygame.K_SPACE] and on_ground:
vy=-12
# Goomba
for g in goombas[:]:
r,spd=g
r.x+=spd
if any(r.colliderect(t) for t in tiles):
r.x-=spd
g[1]*=-1
if player.colliderect(r):
if vy>0:
goombas.remove(g)
vy=-8
add_particles(r.centerx,r.centery)
else:
if inv==0:
life-=1
inv=50
# Koopa
for k in koopas[:]:
r,state,spd=k
if state=="walk":
r.x+=spd
if any(r.colliderect(t) for t in tiles):
r.x-=spd
k[2]*=-1
if player.colliderect(r):
if vy>0:
k[1]="shell"
vy=-8
else:
if inv==0:
life-=1
inv=50
else:
r.x+=spd*6
if any(r.colliderect(t) for t in tiles):
r.x-=spd*6
k[2]*=-1
if player.colliderect(r):
vy=-8
# 金币
for c in coins[:]:
if player.colliderect(c):
coins.remove(c)
# 顶砖
hit=[]
for t in tiles:
if player.colliderect(t) and vy<0:
hit.append(t)
for t in hit:
tiles.remove(t)
add_particles(t.centerx,t.centery)
# 摄像机
camx=player.centerx-W//2
if camx<0: camx=0
# 背景
screen.blit(bg1,(-camx*0.2,0))
screen.blit(bg2,(-camx*0.5,0))
screen.blit(bg3,(-camx*0.8,0))
# 地图
for t in tiles:
screen.blit(brick_img,(t.x-camx,t.y))
for c in coins:
screen.blit(coin_img,(c.x-camx,c.y))
for r,spd in goombas:
screen.blit(goomba_img,(r.x-camx,r.y))
for r,state,spd in koopas:
screen.blit(shell_img if state=="shell" else koopa_img,(r.x-camx,r.y))
pygame.draw.rect(screen,(180,0,255),(goal.x-camx,goal.y,50,80))
screen.blit(player_img,(player.x-camx,player.y))
# 粒子
for p in particles[:]:
p[1]+=1
p[0]+=p[3]
p[2]-=0.2
if p[2]<=0: particles.remove(p)
else: pygame.draw.circle(screen,(255,255,255),(int(p[0]-camx),int(p[1])),3)
# HP
for i in range(life):
pygame.draw.rect(screen,(255,0,0),(10+i*25,10,20,20))
pygame.display.flip()
clock.tick(60)