鱼C论坛

 找回密码
 立即注册
查看: 1781|回复: 0

关于 turtle,screen.clickon() 之后没有反应

[复制链接]
发表于 2022-4-20 19:22:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import turtle
import random 

SQUARE_LENGTH = 60
OUTLINE = 5 # the width of the broad
INTERVAL_LENGTH = 10 # the length between two squares
ALL_COLOR = ['red', 'yellow', 'blue', 'purple', 'green']
g_all_square = [] # store the color of every square
g_all_center = []
g_ifclick = True
g_current_square = [] #append all to this list, final choice is g_current_square[-1]
g_all_frame_pen = [] # in this llist, 0,1,2,3,4 are frame of color set, after this all chosen square in board


def init_screen():
    global screen 
    screen = turtle.Screen()
    screen.setup(800, 800, 0, 0)
    #screen.tracer(0)
    #screen.tracer(0)
    # set screen refersh to manual mode
    draw_board()
    draw_color_set()
    
    

def draw_filled_square(p_start_x, p_start_y, p_lenth, p_fill_color):
    #turtle.delay(None)
    pen = turtle.Turtle()
    #pen.speed(0)
    #pen.hideturtle()
    pen.penup()
    pen.setx(p_start_x)  # set the start point's x coordinate, start point in the left bottom
    pen.sety(p_start_y)  # set the start point's x coordinate
    pen.pendown()
    pen.shape('square')
    streth_wid = (p_lenth/2) / 10
    pen.shapesize(streth_wid,streth_wid, 0)
    #pen.pen(p_fill_color, p_fill_color)
    pen.color(p_fill_color)
    #pen.pencolor(p_fill_color)
    #pen.fillcolor(p_fill_color)
    #pen.begin_fill()
    #for i in range(4):
    #    pen.forward(p_lenth)
    #    pen.left(90)
    #pen.end_fill()

def draw_frame(p_start_x, p_start_y, p_lenth):
    pen = turtle.Turtle()
    #pen.speed(5)
    pen.penup()
    pen.setx(p_start_x)  # set the start point's x coordinate, start point in the left bottom
    pen.sety(p_start_y)  # set the start point's x coordinate
    pen.pendown()
    pen.pensize(5)
    for i in range(4):
        pen.forward(p_lenth + 5)
        pen.left(90)
    g_all_frame_pen.append(pen)
    #pen.down()  

def draw_board():
    #turtle.tracer(False)
    # first start point is (0,0)
    x0 = -140 
    y0 = -140
    # use colums and lines to define the start point of each quare
    for column in range(5):  #5 columns in totle 
        # adjust the y coordinate of start point
        y = y0 + column*(SQUARE_LENGTH + INTERVAL_LENGTH) 
        line_square_color = [] # to store the color of square in this line
        line_center = []
        for row in range(5):  #5 rows in totle 
            # adjust the x coordinate of start point
            # each time add square_length + interval length
            x = x0 + row*(SQUARE_LENGTH + INTERVAL_LENGTH) 
            color = choose_color() # choose_color() return the name of color(string)
            line_square_color.append(color)
            line_center.append([x,y])
            draw_filled_square(x, y, SQUARE_LENGTH, color) 
        g_all_square.append(line_square_color)    
    
# randomly choose the color of square in board           
def choose_color():
    color_index = random.randint(0,4) # list has index 0,1,2,3,4
    color = ALL_COLOR[color_index]
    return color
      
def draw_color_set():
    # set the initial point(left bottom of the square)
    x0 = -170
    y0 = -215
    # only 1 column with 5 rows
    for line in range(5):
        # adjust the x coordinate of start point
        # each time add square_length + interval length
        x = x0 + line*(SQUARE_LENGTH + + INTERVAL_LENGTH)
        color = ALL_COLOR[line] # the color index is the same as the line
        draw_filled_square(x, y0, SQUARE_LENGTH, color)
        draw_frame(x-30-2.5, y0-30-2.5, SQUARE_LENGTH)

# show the starting screen
def start_game():
    turtle.tracer(False)
    init_screen()
    turtle.update()
    #turtle.exitonclick()

def get_position(x,y):
    click_position = [x,y]
    return click_position
    
#return a list containing the click position
#def select_tile():
    #turtle.listen()
    #mouse = turtle.Turtle()
    #click_position = screen.onclick(get_position)
    #return click_position

#check whether the point in the color square is the border
# if it is border, not change
def check_point_color_square(p_clicked_point):
    global g_ifclick
    # reset the original point to (-170, 170) to make the caculation easier
    x = p_clicked_point[0]+ 170
    y = p_clicked_point[1] + 170
    
    # view (square_length + interval_length) as a period(T)
    # x = T*row + row_remain
    # row stands for the number of entire square in the left of x
    # then solve the equation, we get next two lines
    row = x // (SQUARE_LENGTH + INTERVAL_LENGTH) # // get the round number
    row_remain = x-row*(SQUARE_LENGTH + INTERVAL_LENGTH)
    # the same as x    
    column = y // (SQUARE_LENGTH + INTERVAL_LENGTH)
    column_remain = y-column*(SQUARE_LENGTH + INTERVAL_LENGTH)
    
    #check whether the user click in the square or the border
    if row_remain > SQUARE_LENGTH or column_remain > SQUARE_LENGTH: #the user click the white space
        g_ifclick = True # need to click again, will not change

    else: #click inside the square
        g_current_square.append([row,column])
        center = g_all_center[column][row]
        # undo last black frame
        if len(g_all_frame_pen) > 5:
            last_pen = g_all_frame_pen[-1]
            last_pen.undo()
        draw_frame(center[0], center[1], SQUARE_LENGTH)
        #pass 

# get the color of square in board
def get_color(p_coordinate):
    row = p_coordinate[0]
    column = p_coordinate[1]
    color = g_all_square[column, row]
    return color

# if click the color set, change g_ifclick = False, get out of while
# other situation, g_ifclick = True, remain in while
def check_point(p_clicked_point):
    global g_ifclick 
    x = p_clicked_point[0]
    y = p_clicked_point[1]
    if -245 <= y <= -185 and -200 <= x <= 140: # the area of color_set
        if -140 <= x <= -130 or \
            -70 <= x <= -60 or \
            0 <= x <= 10 or \
            70 <= x <= 80:
            g_ifclick = True #clicked the broad
            
        else: #click the square in the color_set
            if len(g_current_square) != 0:   
                g_ifclick = False # no more click, begin flipping
            else: # havent chosen the square in the board to flipping
                g_ifclick = True
        
    elif -170 <= x <= 170 and -170 <= y <= 170: # clicked the color square
        check_point_color_square()
        
    else: # in white space
        g_ifclick = True
    


    
#def click_empty_space():
    #click = True
    #return click

# check if the color is the same, if same, then change
def if_change_color(p_row, p_column, p_final_color):
    if_change = False
    inital_color = g_all_square[p_column][p_row]
    if inital_color == p_final_color:
        if_change = True
    else:
        if_change = False
    
    return if_change
   
    
def x_to_row(p_x):
    # reset the original point (0,0) to (-170, 170) to make the caculation easier
    x = p_x + 170
    # view (square_length + interval_length) as a period(T)
    # x = T*row + row_remain
    # row stands for the number of entire square in the left of x
    # then solve the equation, we get next two lines
    row = x // (SQUARE_LENGTH + INTERVAL_LENGTH) # // get the round number
    return row  
    
def y_to_column(p_y):
    # reset the original point (0,0) to (-170, 170) to make the caculation easier
    y = p_y + 170
    # the same as x
    column = y // (SQUARE_LENGTH + INTERVAL_LENGTH) # // get the round number
    return column 

#def row_to_x(p_row):
    # can be viewed as arithmetic progression
    # x0 = -140; d = square_length + interval_length = 60 + 10 = 70
    # x = x0 + d*(n-1); n stands for row
    # x = 70n - 210
    x = 70*p_row - 210
    return x 

def get_final_color(p_coordinate):
    x = p_coordinate[1] #all y makes no different in square
    x = x + 200 # change the original point(0,0) t0 (-200, -245) to make calculation easier
    row = x // (SQUARE_LENGTH + INTERVAL_LENGTH) # // get the round number
    final_color = ALL_COLOR[row]
    return final_color

def flipping(p_row, p_column, p_final_color):
    #check whether the color is same
    #if same, then flipping
    if_change = if_change_color(p_row, p_column, p_final_color)
    
    if if_change == True:
        center_coordinate = g_all_center[p_column][p_row]
        center_x = center_coordinate[0]
        center_y = center_coordinate[1]
        draw_filled_square(center_x, center_y, SQUARE_LENGTH, p_final_color)
        
        flipping(p_row-1, p_column, p_final_color) # flip the left square
        flipping(p_row+1, p_column, p_final_color) # flip the right square
        flipping(p_row, p_column-1, p_final_color) # flip the below square
        flipping(p_row, p_column+1, p_final_color) # flip the upper square
        
    else: #color is different, do not change
        pass
        

#start_game()
#print(g_all_square)
#clicked_point = screen.onclick(get_position)
screen = turtle.Screen()
screen.setup(800, 800, 0, 0)
turtle.tracer(False)
draw_board()
draw_color_set()
turtle.update()
clicked_point = screen.onclick(get_position)

if clicked_point != None:
    check_point(clicked_point)
if g_ifclick == False: 
    chosen_square = g_current_square[-1] #the last chosen square in board
    clicked_row = x_to_row(chosen_square[0])
    clicked_column = y_to_column(chosen_square[1])
    final_color = get_final_color(clicked_point) # the clicked point must in the color set to make g_ifclick = False
    flipping(clicked_row, clicked_column, final_color)

turtle.mainloop()

关于 turtle,screen.clickon() 之后没有反应
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表