【汇智学堂】-python小游戏(贪吃蛇游戏之七-控制蛇的头部方向)

4.7控制蛇的头部方向
我们在上一节中创建的蛇,当方向发生改变时,我们发现,它的头部很别扭。我们看到,有时是它的头在转向,有时是它的尾在转向。在这一节中,我们使它都从头部转向。下面是我们要做的事情。
1、修改“长”蛇向上、向下、向左及向右运动的动画。
2、体会不同状态时,参数的运用。

实现代码如下:

class Snake:
    
    def __init__(self):        
        
        self.y=0
             
    def draw(self,g):
        if(g.x==0 and g.y==0):
            a=8
       
        elif g.x==1 and g.y==0:
            print("已进入右侧")
            a=g.body[0][0]+1              
            g.body.insert(0,(a,g.body[0][1]))
            del g.body[3]
            
        elif g.x==-1 and g.y==0:
            print("已进入左侧")
            a=g.body[0][0]-1              
            g.body.insert(0,(a,g.body[0][1]))
            del g.body[3]
            
        elif g.x==0 and g.y==-1:
            print("已进入上侧")
            a=g.body[0][1]-1              
            g.body.insert(0,(g.body[0][0],a))
            del g.body[3]

        elif g.x==0 and g.y==1:
            print("已进入下侧")
            a=g.body[0][1]+1              
            g.body.insert(0,(g.body[0][0],a))
            del g.body[3]

        print(g.x)
        print(g.y)

        #tkinter.messagebox.showinfo(len(self.body))            
        
        for i in g.body:

             print(i)
             x1=i[0]*20+g.x*20
             y1=i[1]*20+g.y*20        
             g.canvas.create_rectangle(x1,y1,x1+20,y1+20,fill='green')  

我们注意到,在蛇转向不同方向时,我们处理数组时,输入的参数是不同的。右侧:g.body.insert(0,(a,g.body[0][1]));上侧:g.body.insert(0,(g.body[0][0],a))

将代码整合起来,整合后完整代码如下:

from tkinter import*
import random
import time
import tkinter.messagebox #messagebox

'''三个方框向四个方向行动时,调整蛇头的方向'''
class Game:
    def __init__(self):
        
        self.tk=Tk()
        self.canvas=Canvas(self.tk,width=600,height=600)
        self.canvas.pack()

        #横坐标增量
        self.x=0
        self.y=0

        self.body = [(8, 11), (8, 12), (8, 13)]

        self.canvas.bind_all('',self.turn_left)
        self.canvas.bind_all('',self.turn_right)
        self.canvas.bind_all('',self.turn_up)
        self.canvas.bind_all('',self.turn_down)
       
    def turn_left(self,evt):
        self.x=-1
        self.y=0
       
    def turn_right(self,evt):
        self.x=1
        self.y=0
        
    def turn_up(self,evt):
        self.x=0
        self.y=-1   
        
    def turn_down(self,evt):
        self.x=0
        self.y=1             

class Snake:
    
    def __init__(self):        
        
        self.y=0
             
    def draw(self,g):
        if(g.x==0 and g.y==0):
            a=8
       
        elif g.x==1 and g.y==0:
            print("已进入右侧")
            a=g.body[0][0]+1              
            g.body.insert(0,(a,g.body[0][1]))
            del g.body[3]
            
        elif g.x==-1 and g.y==0:
            print("已进入左侧")
            a=g.body[0][0]-1              
            g.body.insert(0,(a,g.body[0][1]))
            del g.body[3]
            
        elif g.x==0 and g.y==-1:
            print("已进入上侧")
            a=g.body[0][1]-1              
            g.body.insert(0,(g.body[0][0],a))
            del g.body[3]

        elif g.x==0 and g.y==1:
            print("已进入下侧")
            a=g.body[0][1]+1              
            g.body.insert(0,(g.body[0][0],a))
            del g.body[3]

        print(g.x)
        print(g.y)

        #tkinter.messagebox.showinfo(len(self.body))            
        
        for i in g.body:

             print(i)
             x1=i[0]*20+g.x*20
             y1=i[1]*20+g.y*20        
             g.canvas.create_rectangle(x1,y1,x1+20,y1+20,fill='green')    
               
class Food:
    def __init__(self):

        self.a=random.randint(1,29)
        self.b=random.randint(1,29)

        self.x11rec=self.a*20
        self.y12rec=self.b*20
        self.x21rec=self.a*20+20
        self.y22rec=self.b*20+20     
        
    def drawfood(self,g):
        g.canvas.create_rectangle(self.x11rec,self.y12rec,self.x21rec,self.y22rec,fill='red')    
 
g=Game()
f=Food()
s=Snake()
while 1:
    g.canvas.delete("all") #clear canvas    
    s.draw(g)
    f.drawfood(g)   
  
    g.tk.update_idletasks()
    g.tk.update()
    v=0.3
    time.sleep(v)

运行这段代码,在画布上,我们看到蛇随着我们的按键方向(上、下、左、右)向不同的方向运动时,蛇的头部,一直在运动的前方。见下图4-12、4-13、4-14。
【汇智学堂】-python小游戏(贪吃蛇游戏之七-控制蛇的头部方向)_第1张图片
图4-12
【汇智学堂】-python小游戏(贪吃蛇游戏之七-控制蛇的头部方向)_第2张图片
图4-13
【汇智学堂】-python小游戏(贪吃蛇游戏之七-控制蛇的头部方向)_第3张图片
图4-14

你可能感兴趣的:(python小游戏)