#游戏开发入门,练习使用pygame,小游戏毛毛虫吃豆子,游戏比较简单,大家可以自己再发挥
import pygame #导入游戏模块,需要安装
import random #导入随机数模块
from pygame.locals import * #导入常用属性及事件,比如按键
from sys import exit #系统模块的退出事件
# 初始化pygame,为使用硬件做准备
pygame.init()
# 创建一个窗口,分辨率(640, 480)
screen = pygame.display.set_mode((640, 480), 0, 32)
# 游戏的时间控制
clock=pygame.time.Clock()
# 设置窗口标题及文字字体
pygame.display.set_caption('hello 毛毛虫(F2 抛撒食物)!')
ft = pygame.font.SysFont('stsong', 40) # 设置字体,宋体,字体名字很难找,通过pygame.font.get_fonts()打印出来找的
#ft = pygame.font.SysFont('simHei', 40) # 设置字体,黑体
#ft = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 40) # 根据字体文件设置文字字体,宋体
# 用到的颜色
bg_sky=(135,206,235) #天空颜色
bg_grand=(102,205,0) #草地颜色
mmc_h=(255,99,71) #毛毛虫头
mmc_b=(240,128,128) #毛毛虫身
mmc_t=(240,128,128) #毛毛虫尾
food_c=(240,240,0) #食物颜色
bang_c=(139,123,139) #土障颜色
sun_c=(255,64,64) #太阳颜色
txt_c=(200,20,20) #文字颜色
# 绘制毛毛虫,简单了,就画几个圆圈
mmc=[[32,28],[33,28],[34,28],[35,28],[36,28]] #初始毛毛虫的坐标
def draw_mmc():
#画身体
for x,y in mmc[1:len(mmc)-1]:
pygame.draw.circle(screen,mmc_b,(x*10,y*10),5,0)
#画尾部
x,y=mmc[len(mmc)-1]
pygame.draw.circle(screen,mmc_t,(x*10,y*10),3,0)
#画头,最后画,免得回头时身体遮住了
x,y=mmc[0]
pygame.draw.circle(screen,mmc_h,(x*10,y*10),6,0)
#绘制食物
food=[]
def put_food():
for i in range(10):
x=random.randint(1,63)
y=random.randint(30,47)
pos=[x,y]
if pos not in food+mmc+bang:food.append(pos)
def draw_food():
for x,y in food:
pygame.draw.circle(screen,food_c,(x*10,y*10),3,0)
#绘制障碍物
bang=[]
def put_bang():
for i in range(500):
x=random.randint(1,63)
y=random.randint(30,47)
pos=[x,y]
if pos not in food+mmc+bang:bang.append(pos)
def draw_bang():
for x,y in bang:
pygame.draw.rect(screen,bang_c,[x*10-5,y*10-5,10,10],0)
# 按键控制
def k_down(k):
tmp=mmc[0].copy()
if k[K_UP]:
if mmc[0][1]==1:return
mmc[0][1]-=1 #头向上一格
elif k[K_DOWN]:
if mmc[0][1]==47:return
mmc[0][1]+=1 #头向下一格
elif k[K_LEFT]:
if mmc[0][0]==1:return
mmc[0][0]-=1 #头向左一格
elif k[K_RIGHT]:
if mmc[0][0]==63:return
mmc[0][0]+=1 #头向右一格
elif k[K_F2]:
put_food() #撒食物
return
else:return
#身体跟随
for i in range(1,len(mmc)):
tmp2=mmc[i].copy()
mmc[i]=tmp
tmp=tmp2
if mmc[0] in food:
food.remove(mmc[0]) #吃到食物,消除食物,身体增长
mmc.append(tmp)
# 游戏主循环
Goon=True
put_food() #生成食物坐标
put_bang() #生成土墙坐标
while Goon:
#把这个游戏调成多少帧,想跑的快就搞大点
clock.tick(10)
#处理消息事件
for event in pygame.event.get():
if event.type == QUIT: #窗口右上角叉叉
#接收到退出
Goon=False
#检查按键
keys_pressed = pygame.key.get_pressed() #这个返回键盘列表,按了的键就是True
k_down(keys_pressed) #处理按键
#填充背景
screen.fill(bg_sky,(0,0,640,280)) #蓝天
pygame.draw.circle(screen,sun_c,(100,120),10,0) #太阳
screen.fill(bg_grand,(0,280,640,480)) #草地
#绘制食物
draw_food()
#绘制土墙
draw_bang()
#绘制毛毛虫
draw_mmc()
st_msg='go,go,go,加油干!'
#吃完了
if len(food)==0:
st_msg='吃光了,你好棒,F2加餐!'
#撞墙了
if mmc[0] in bang:
st_msg='吃到土了,再接再厉!'
sf = ft.render(st_msg,1,txt_c) # 根据字体加颜色构建显示内容位块
screen.blit(sf,(140,30)) # 把显示位块传送到显存里
#刷新画面,两个方法都可以
#pygame.display.update()
pygame.display.flip() #把显存刷新到屏幕
pygame.quit() #游戏结束,释放pygame,关闭窗口