猫史档案馆


【Python作品分享】疯狂贪吃蛇

用户:小工兵小工兵查看:3 回复:4 评论:3 创建时间:2020-07-21T18:10:37


【作品展示】

center_image

 

【作品介绍】

2D版贪吃蛇

游戏规则:吃掉方块

操作控制: ↑

← ↓ →

 

【作品源代码】


from tkinter import *
import threading
import queue
import time
import random


class GUI(Tk):

    def __init__(self, queue):
        Tk.__init__(self)
        self.queue = queue
        self.is_game_over = False
        self.canvas = Canvas(self, width=495, height=305, bg='#000000')
        self.canvas.pack()
        self.snake = self.canvas.create_line((0,0),(0,0), fill='#FFFF00', width=10)
        self.food = self.canvas.create_rectangle(0,0,0,0, fill='#00FF00', outline='#00FF00')
        self.point_score = self.canvas.create_text(455, 15, fill='white', text='score:0')
        self.queue_handler()

    def restart(self):
        self.destroy()
        main()

    def queue_handler(self):
        try:
            while True:
                task = self.queue.get(block=False)
                if task.get('game_over'):
                    self.game_over()
                elif task.get('move'):
                    points = [x for point in task['move'] for x in point]
                    self.canvas.coords(self.snake, *points)  
                elif task.get('food'):
                    self.canvas.coords(self.food, *task['food'])
                elif task.get('points_score'):
                    self.canvas.itemconfigure(self.point_score,
                                              text='score:{}'.format(task['points_score']))
                    self.queue.task_done()
        except queue.Empty:
            if not self.is_game_over:
                self.canvas.after(100, self.queue_handler)

    def game_over(self):
        self.is_game_over = True
        self.canvas.create_text(220, 150, fill='white',text='Game Over!')
        quitbtn = Button(self, text='Quit', command=self.destroy)
        retbtn = Button(self, text='Resume', command=self.restart)
        self.canvas.create_window(230, 180, anchor=W, window=quitbtn)
        self.canvas.create_window(200, 180, anchor=E, window=retbtn)


class Food():
    '''class Food use to make food'''

    def __init__(self, queue):
        self.queue = queue
        self.make_food()

    def make_food(self):
        x = random.randrange(5, 480, 10)
        y = random.randrange(5, 295, 10)
        self.position = x,y
        self.exppos = x-5,y-5,x+5,y+5
        self.queue.put({'food':self.exppos})

class Snake(threading.Thread):
    '''class Snake use to create snake and response action'''

    def __init__(self, gui, queue):
        threading.Thread.__init__(self)
        self.gui = gui
        self.queue = queue
        self.daemon = True
        self.points_score = 0
        self.snake_points = [(495,55),(485,55),(475,55),(465,55),(455,55)]
        self.food = Food(queue)
        self.direction = 'Left'
        self.start()

    def run(self):
        if self.gui.is_game_over:
            self._delete()
        while not self.gui.is_game_over:
            self.queue.put({'move':self.snake_points})
            time.sleep(0.2)
            self.move()

    def key_pressed(self,e):
        self.direction = e.keysym

    def move(self):
        new_snake_point = self.calculate_new_coordinates()
        if self.food.position == new_snake_point:
            add_snake_point = self.calculate_new_coordinates()
            self.snake_points.append(add_snake_point)
            self.points_score += 1
            self.queue.put({'points_score':self.points_score})
            self.food.make_food()
        else:
            self.snake_points.pop(0)
            self.check_game_over(new_snake_point)
            self.snake_points.append(new_snake_point)

    def calculate_new_coordinates(self):
        last_x,last_y = self.snake_points[-1]
        if self.direction == 'Up':
            new_snake_point = last_x,last_y-10
        elif self.direction == 'Down':
            new_snake_point = last_x,last_y+10
        elif self.direction == 'Left':
            new_snake_point = last_x-10,last_y
        elif self.direction == 'Right':
            new_snake_point = last_x+10,last_y
        return new_snake_point

    def check_game_over(self, snake_point):
        x,y = snake_point[0],snake_point[1]
        if not -5 < x < 505 or not -5 < y < 315 or snake_point in self.snake_points:
            self.queue.put({'game_over':True})


def main():
    q = queue.Queue()
    gui = GUI(q)
    gui.title("我的贪吃蛇")
    snake = Snake(gui, q)
    gui.bind('', snake.key_pressed)
    gui.bind('', snake.key_pressed)
    gui.bind('', snake.key_pressed)
    gui.bind('', snake.key_pressed)
    gui.mainloop()


if __name__ == '__main__':
    main()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
我需要复制粘贴我需要复制粘贴

emotion_编程猫_加油

点赞0


评论


我需要复制粘贴我需要复制粘贴

importpygame,sys#导入模块 frompygame.localsimport* fromrandomimport*#随机模块 pygame.init()#初始化 screen=pygame.display.set_mode((400,400))#设置窗口 x,y=200,200#贪吃蛇的坐标 up=1#判断哪个方向可以移动 down=0 left=0 right=0 l=1#每个蛇头和蛇身的编号 d=5#蛇头和蛇身的长度 t=0#坐标限制 l=0#贪吃蛇长度限制 whileTrue:#制造死循环 foreventinpygame.event.get(): ifevent.type==pygame.QUIT:#是否按到关闭按钮 pygame.quit() sys.exit() 喵55,255,255))#将背景设为白色 ift==0: x1,y1=randrange(100,200),randrange(100,200)#随机坐标 t+=1 pygame.draw.rect(screen,[0,0,255],[x1,y1,30,30],0)#画食物 ifx>x1andx<x1+30andy>y1andy<y1+30:#判断是否可以吃到食物 ifl==1: d+=1 l=0 t=0 l+1 pressed_keys=pygame.key.get_pressed()#监测键盘按键 ifup==1:#移动贪吃蛇 y-=5 forainrange(d): pygame.draw.rect(screen,[255,193,193],[x,y+30*l,30,30],0) l+=1 l=1 ifdown==1: y+=5 forainrange(d): pygame.draw.rect(screen,[255,193,193],[x,y-30*l,30,30],0) l+=1 l=1 ifleft==1: x-=5 forainrange(d): pygame.draw.rect(screen,[255,193,193],[x+30*l,y,30,30],0) l+=1 l=1 ifright==1: x+=5 forainrange(d): pygame.draw.rect(screen,[255,193,193],[x+-30*l,y,30,30],0) l+=1 l=1 ifpressed_keys[K_LEFT]:#设置方向,一次只能移动一个方向 left=1 up=0 right=0 down=0 ifpressed_keys[K_RIGHT]: left=0 up=0 right=1 down=0 ifpressed_keys[K_UP]: up=1 left=0 right=0 down=0 ifpressed_keys[K_DOWN]: up=0 left=0 right=0 down=1 pygame.time.delay(100)#暂停100毫秒 pygame.display.flip()#刷新

点赞1


评论


要吃天鹅肉的蛤蟆要吃天鹅肉的蛤蟆

你这个代码貌似有问题emotion_编程猫_溜了溜了

点赞0


评论


一只宁宁一只宁宁

emotion_编程猫_厉害了

点赞0


评论