Cho em hỏi lỗi của em là sao ạ. giúp e với ạ. nó chạy được lúc rồi dừng lại báo lỗi

from random import choice
from turtle import *
from freegames import floor, vector
import turtle
#thiet lap khung hinh, ten tro choi tro chơi
wn = turtle.Screen()
wn.title("game vth")
wn.setup(width=600, height=600)


#tao hinh hien thi level
tim=turtle.Turtle()
tim.color('red')
tim.pensize(5)
tim.shape('turtle')
tim.penup()
tim.goto(0,195)
    
p = turtle.Turtle()
p.speed(0)
p.shape("square")
p.color("white")
p.penup()
p.hideturtle()
p.goto(0, 260)

pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(-50,180)
pen.write("Level", align="center", font=("Courier", 20, "normal"))

path = Turtle(visible=False) #duong di 
writer = Turtle(visible=False) #nguoi choi

state={'score':0} #điểm số
inn = turtle.Turtle()#khoi tao chu score
inn.speed(0)
inn.shape("square")
inn.color("white")
inn.penup()
inn.hideturtle()
inn.goto(140,160)
inn.write("Score", align="center", font=("Courier", 8, "normal"))

aim = vector(5, 0) #toa do mục tiêu
pacman = vector(-40, -80)
#tọa do người choi dieu khien pacman
ghosts = [
    [vector(-180, 160), vector(5, 0)],
    [vector(-180, -160), vector(0, 5)],
    [vector(100, 160), vector(0, -5)],
    [vector(100, -160), vector(-5, 0)],
]

#toa đô các con quái


tiles = [
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,
    0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
]
#tạo tường và đường đi tro chơi
def square(x, y):
    #Vẽ hinh vuong bang cach su dung duong dan tai (x,y)
    path.up()
    path.goto(x, y)
    path.down()
    path.begin_fill()#bắt đầu điền

    for count in range(4):
        path.forward(20)#phía trước
        path.left(90)

    path.end_fill()

def offset(point):
   #trả về điểm bù trong gạch
    x = (floor(point.x, 20) + 200) / 20
    y = (180 - floor(point.y, 20)) / 20
    index = int(x + y * 20)
    return index

def valid(point):
    #Trả về True nếu điểm hợp lệ trong ô xếp
    index = offset(point)

    if tiles[index] == 0:
        return False

    index = offset(point + 19)

    if tiles[index] == 0:
        return False

    return point.x % 20 == 0 or point.y % 20 == 0

def world():
    #Vẽ con đường
    bgcolor('black')
    path.color('blue')

    for index in range(len(tiles)):
        tile = tiles[index]

        if tile > 0:
            x = (index % 20) * 20 - 200
            y = 180 - (index // 20) * 20
            square(x, y)

            if tile == 1:
                path.up()
                path.goto(x + 10, y + 10)
                path.dot(2, 'white')

def move():
    #di chuyển pacman và ma
    writer.undo()
    writer.write(state['score'])
    bgcolor()
    a=100    
    s=state['score']
    clear()
    

        
    
    #tính điểm
    if valid(pacman + aim):
        pacman.move(aim)

    index = offset(pacman)

    if tiles[index] == 1:
        tiles[index] = 2
        
        state['score'] += 1
        s=state['score']
        
        x = (index % 20) * 20 - 200
        y = 180 - (index // 20) * 20
        square(x, y)
     #neu du diem chuyen sang level 2
    if int(s)>=10 and int(s)<100:
        a=5
        ti=turtle.Turtle()
        ti.color('yellow')
        ti.pensize(5)
        ti.shape('turtle')
        ti.penup()
        ti.goto(30,195)
            
        bgcolor('brown')
    # level 3
    if int(s)>=100 and int(s)<=160:
        a=1
        
        
        ti=turtle.Turtle()
        ti.color('white')
        ti.pensize(5)
        ti.shape('turtle')
        ti.penup()
        ti.goto(60,195)
            
        bgcolor('pink')
    
    if int(s)==160:
        win = turtle.Turtle()
        win.speed(0)
        win.shape("square")
        win.color("white")
        win.penup()
        win.hideturtle()
        win.goto(0,-195)
        win.write("WIN", align="center", font=("Courier", 20, "normal"))
        return
                 
    up()
    goto(pacman.x + 10, pacman.y + 10)
    dot(20, 'yellow')
    
    for point, course in ghosts:
        if valid(point + course):
            point.move(course)
        else:
            options = [
                vector(5, 0),
                vector(-5, 0),
                vector(0, 5),
                vector(0, -5),
            ]
            plan = choice(options)
            course.x = plan.x
            course.y = plan.y

        up()
        goto(point.x + 10, point.y + 10)
        dot(20, 'red')

    update()
   

    for point, course in ghosts:
        
        #va chạm
        
        if abs(pacman - point) < 20:
            w = turtle.Turtle()
            w.speed(0)
            w.shape("square")
            w.color("white")
            w.penup()
            w.hideturtle()
            w.goto(-50,-195)
            w.write("Game Over", align="center", font=("Courier", 20, "normal"))
            clear()
            return

    ontimer(move, a) #tang giam toc do vong lap
    update()
   
        
def change(x, y):
    #Thay đổi mục tiêu pacman nếu hợp lệ
    if valid(pacman + vector(x, y)):
        aim.x = x
        aim.y = y

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
writer.goto(160, 160)
writer.color('white')
writer.write(state['score'])


listen()
onkey(lambda: change(5, 0), 'Right')#di chuyen
onkey(lambda: change(-5, 0), 'Left')
onkey(lambda: change(0, 5), 'Up')
onkey(lambda: change(0, -5), 'Down')
world()  #gọi hàm def
move()
1 Like

Bạn nên copy tất cả source code của bạn theo hướng dẫn.


Và hình ảnh lỗi của bạn. Mọi người sẽ nhìn rõ ràng hơn.

dạ e đã gửi lên rồi ạ.

1 Like

Bạn nên kiểm tra version tkinter của bạn mình thử chạy trên máy mình không bị sao cả.

dạ vậy khi nó lên level có bị lỗi k a. một lúc sau nó mới bị ấy.

Của mình nó chỉ nháy hiển thị lên khung khoảng 3-5 giây rồi tự tắt nhưng không báo lỗi gì cả. Bạn tìm hiểu chỗ hiển thị khung hình lâu hơn và kiểm tra các thư viện.

dạ e cũng mới học nên chưa hiểu rõ lắm. nếu a sửa được sửa giúp e với ạ. vì cái hàm ontimer(move, a) e gán cho nó giá trị khi điểm đủ. thì nó bắt đầu bị vậy.

Bạn nên viết một chương trình đơn giản trước xem cách hiển thị mọi thứ như thế nào, sau mới đến tương tác với mouse. Cứ từ từ tìm hiểu kĩ thôi bạn.

dạ em cảm ơn ạ a ạ e sẽ tìm hiểu lại

a có thể giải thích e hàm code trong def offset(point) được k ạ e không hiểu cách tính.

1 Like

Hàm floor trong source code của bạn không phải là hàm floor trong math module mà hàm floor trong freegames module. Trong source của module đã có giải thích

def floor(value, size, offset=200):
    """Floor of `value` given `size` and `offset`.
    The floor function is best understood with a diagram of the number line::
         -200  -100    0    100   200
        <--|--x--|-----|--y--|--z--|-->
    The number line shown has offset 200 denoted by the left-hand tick mark at
    -200 and size 100 denoted by the tick marks at -100, 0, 100, and 200. The
    floor of a value is the left-hand tick mark of the range where it lies. So
    for the points show above: ``floor(x)`` is -200, ``floor(y)`` is 0, and
    ``floor(z)`` is 100.
    >>> floor(10, 100)
    0.0
    >>> floor(120, 100)
    100.0
    >>> floor(-10, 100)
    -100.0
    >>> floor(-150, 100)
    -200.0
    >>> floor(50, 167)
    -33.0
    """
    return float(((value + offset) // size) * size - offset)

Bạn nên lưu ý là offset họ luôn để mặc định là 200, dấu // là chia lấy phần nguyên. Từ đó bạn có thể tự tìm hiểu.Thân.

1 Like

dạ em cảm ơn a nhiều ạ <3