分类: Python/Ruby
2021-08-20 17:19:13
def start_game():
# 播放音乐
pygame.mixer.music.play(-1)
# 定义存分数的全局变量
global score
score = 0
# 定义存放玩家键盘输入运动方向的变量,初始为向右
run_direction = "right"
# 定义贪吃蛇运动方向的变量,初始为玩家键入方向
run = run_direction
# 实例化贪吃蛇和食物对象
head = Snake(randint(0, 30) * 20, randint(0, 20) * 20)
# 实例化蛇身长度为2个单位
snake_body = [Snake(head.x, head.y + 20), Snake(head.x, head.y + 40)]
# 实例化食物列表,列表随着其中食物被吃掉应该不断缩短
food_list = [Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))]
for i in range(1,24):
food_list.append(Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255))))
# 实例化单个食物,方便循环内生成单个新食物
food = Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))
while True:
window.blit(background, (0,0))
# 监听玩家键盘输入的运动方向值,并根据输入转为up、down、right或left,方便程序中调用
# pygame.event.get()返回一个列表,存放本次game执行中程序遇到的一连串事件(按时间顺序依次存放)
for event in pygame.event.get():
# pygame.QUIT事件是指用户点击窗口右上角的"×"
if event.type == pygame.QUIT:
# 显示结果界面
show_end()
# 若事件类型是按下键盘,分↑ ↓ ← →四种情况讨论
elif event.type == pygame.KEYDOWN:
# 若事件类型是按下键盘↑
# key是键值,表示按下去的键值是什么
if event.key == ord('w'):
run_direction = "up"
# 若事件类型是按下键盘↓
if event.key == ord('s'):
run_direction = "down"
# 若事件类型是按下键盘←
if event.key == ord('a'):
run_direction = "left"
# 若事件类型是按下键盘→
if event.key == ord('d'):
run_direction = "right"
# 绘制初始化的25个食物图像(24+1=25)
# 随着该列表中的食物被吃掉,列表应该不断pop以清除已经被吃的事物
for item in food_list:
draw_food(item)
# 绘制被贪吃蛇吃掉后新增的食物图像
draw_food(food)
# 绘制蛇头图像
draw_snake(black, head)
# 绘制蛇身图像
for item in snake_body:
draw_snake(blue, item)
# 判断贪吃蛇原运动方向(run)与玩家键盘输入的运动方向(run_direction)是否违反正常运动情况
if run == "up" and not run_direction == "down":
run = run_direction
elif run == "down" and not run_direction == "up":
run = run_direction
elif run == "left" and not run_direction == "right":
run = run_direction
elif run == "right" and not run_direction == "left":
run = run_direction
# 插入蛇头位置到蛇身列表中
snake_body.insert(0, Snake(head.x, head.y))
# 根据玩家键入方向进行蛇头xy的更新
if run == "up":
head.y -= 20
elif run == "down":
head.y += 20
elif run == "left":
head.x -= 20
elif run == "right":
head.x += 20
# 判断是否死亡
die_flag = False
# 遍历存放贪吃蛇位姿的列表,从第1个开始,(第0个位蛇头)
for body in snake_body[1:]:
# 如果蛇头的xy和蛇身xy相等,则判定相撞,设置flag为ture
if head.x == body.x and head.y == body.y:
die_flag = True
# 若蛇头的xy在显示窗体外,或flag为true,则显示结束界面,并退出游戏
if die_flag == True or head.x < 0 or head.x > 960 or head.y < 0 or head.y > 600:
# 停止播放音乐
pygame.mixer.music.stop()
show_end()
# die_snake(head, snake_body)
# 判断蛇头和食物坐标,若相等,则加分,并生成新的食物
# 定义标志,表明是否找到和蛇头相等的事物
global flag
flag = 0
# 如果蛇头和食物重合
for item in food_list:
if head.x == item.x and head.y == item.y or head.x == food.x and head.y == food.y:
flag = 1
score += 1
# 弹出被吃掉的这个食物
food_list.pop(food_list.index(item))
# 再产生一个食物
food = new_food(head)
# 把新食物插入food_list,下一次循环中会更新绘制食物全体
food_list.append(food)
break
if flag == 0:
snake_body.pop()
font = pygame.font.SysFont("simHei", 25)
mode_title = font.render('正常模式', False, grey)
socre_title = font.render('得分: %s' % score, False, grey)
window.blit(mode_title, (50, 30))
window.blit(socre_title, (50, 65))
# 更新蛇头蛇身和食物的数据
pygame.display.update()
# 通过帧率设置贪吃蛇速度
clock.tick(8)