zoukankan      html  css  js  c++  java
  • python游戏练手--贪吃蛇

    啥也不说了,就是个小练习

    #!/usr/bin/env python
    # coding=utf-8
    import pygame
    import sys
    import random

    # 全局定义,screen的长和宽
    SCREEN_X = 600
    SCREEN_Y = 600


    # 蛇类
    # 点以25为单位
    class Snake(object): # 定义一个类--Snake,默认使用object类,如果你有更好的话,可以替换它
    # 初始化各种需要的属性 [开始时默认向右/身体块x5]
    def __init__(self): # 定义init方法,第一个参数永远都是self本身,在__init__方法内部,可以把各种属性绑定到self,因为self指向创建实例的本身。
    # 有了__init__方法,在创建实例的时候,就不能传入空的参数来,必须传入与__init__方法匹配的参数,但是self不需要穿
    # 举例,如果是def __init__(self,name,score):这种类型的话,那么self不需要,但是name和score必须要有的
    self.dirction = pygame.K_RIGHT
    self.body = []
    for x in range(5):
    self.addnode() # 调用addnode函数,增加身体,循环5次后,蛇身初始值为5个node

    # 增加贪吃蛇身体长度的函数,无论何时 都在前端增加蛇块
    def addnode(self):
    left, top = (0, 0) # 默认是0
    if self.body:
    left, top = (self.body[0].left, self.body[0].top)
    node = pygame.Rect(left, top, 25, 25) # 一个node节点的大小
    if self.dirction == pygame.K_LEFT:
    node.left -= 25
    elif self.dirction == pygame.K_RIGHT:
    node.left += 25
    elif self.dirction == pygame.K_UP:
    node.top -= 25
    elif self.dirction == pygame.K_DOWN:
    node.top += 25
    self.body.insert(0, node) # 插入节点

    # 删除最后一个块,pop默认从最后弹出元素
    def delnode(self):
    self.body.pop()

    # 死亡判断
    def isdead(self):
    # 撞墙,身体top部位不在SCREEN中的X或者Y值中(0,600),认为撞墙死亡
    if self.body[0].x not in range(SCREEN_X):
    return True
    if self.body[0].y not in range(SCREEN_Y):
    return True
    # 撞自己,头部和身体任意一部分碰撞。body[0]是第一个元素,body[1:]取的是从第二个元素开始,到完结
    if self.body[0] in self.body[1:]:
    return True
    return False

    # 移动!
    def move(self):
    self.addnode()
    self.delnode()

    # 改变方向 但是左右、上下不能被逆向改变
    def changedirection(self, curkey):
    LR = [pygame.K_LEFT, pygame.K_RIGHT]
    UD = [pygame.K_UP, pygame.K_DOWN]
    if curkey in LR + UD:
    if (curkey in LR) and (self.dirction in LR):
    return
    if (curkey in UD) and (self.dirction in UD):
    return
    self.dirction = curkey


    # 食物类
    # 方法: 放置/移除
    # 点以25为单位
    class Food:
    def __init__(self):
    self.rect = pygame.Rect(-25, 0, 25, 25)

    def remove(self):
    self.rect.x = -25

    def set(self):
    if self.rect.x == -25:
    allpos = []
    # 不靠墙太近 25 ~ SCREEN_X-25 之间
    for pos in range(25, SCREEN_X - 25, 25):
    allpos.append(pos)
    self.rect.left = random.choice(allpos)
    self.rect.top = random.choice(allpos)
    print(self.rect)


    def show_text(screen, pos, text, color, font_bold=False, font_size=60, font_italic=False):
    # 获取系统字体,并设置文字大小
    cur_font = pygame.font.SysFont("宋体", font_size)
    # 设置是否加粗属性
    cur_font.set_bold(font_bold)
    # 设置是否斜体属性
    cur_font.set_italic(font_italic)
    # 设置文字内容
    text_fmt = cur_font.render(text, 1, color)
    # 绘制文字
    screen.blit(text_fmt, pos)


    def main():
    pygame.init()
    screen_size = (SCREEN_X, SCREEN_Y)
    screen = pygame.display.set_mode(screen_size)
    pygame.display.set_caption('Snake')
    clock = pygame.time.Clock()
    scores = 0
    isdead = False

    # 蛇/食物
    snake = Snake()
    food = Food()

    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    sys.exit()
    if event.type == pygame.KEYDOWN:
    snake.changedirection(event.key)
    # 死后按space重新
    if event.key == pygame.K_SPACE and isdead:
    return main()

    screen.fill((255, 255, 255))

    # 画蛇身 / 每一步+1分
    if not isdead:
    scores += 1
    snake.move()
    for rect in snake.body:
    pygame.draw.rect(screen, (20, 220, 39), rect, 0)

    # 显示死亡文字
    isdead = snake.isdead()
    if isdead:
    show_text(screen, (100, 200), 'YOU DEAD!', (227, 29, 18), False, 100)
    show_text(screen, (150, 260), 'press space to try again...', (0, 0, 22), False, 30)

    # 食物处理 / 吃到+50分
    # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
    if food.rect == snake.body[0]:
    scores += 50
    food.remove()
    snake.addnode()

    # 食物投递
    food.set()
    pygame.draw.rect(screen, (136, 0, 21), food.rect, 0)

    # 显示分数文字
    show_text(screen, (50, 500), 'Scores: ' + str(scores), (223, 223, 223))

    pygame.display.update()
    clock.tick(10)


    if __name__ == '__main__':
    main()

     

    
    
  • 相关阅读:
    微信小程序scroll-viwe遇到的问题
    微信小程序缓存
    微信刷新数据不刷新页面的另一个方法
    微信小程序中无刷新修改
    Bayesian
    深度学习(七)object detection
    深度学习(十二)wide&deep model
    深度学习(十)训练时的调参技巧
    深度学习(九)过拟合和欠拟合
    深度学习(二)常见概念
  • 原文地址:https://www.cnblogs.com/fatyao/p/11143675.html
Copyright © 2011-2022 走看看