39条Python语句实现数字华容道

原以为用Python编写“数字华容道”游戏可能需要很多代码,完成后发现只用了39条语句,可见Python的强大。

编程的思路如下,使用9个tkinter库的Button按钮,按3行3列排列,每个按钮的标题是1到8和空白中的一个,初始标题所显示的数字和空白随机排列。当一个按钮被单击后,调用事件函数,该函数有两个参数,该按钮的所在位置的行列号。在函数中首先判断该按钮(行号为x,列号为y)是否和标题为空白的按钮(行号为x0,列号为y0)相邻,相邻条件是(x-x0)绝对值+(y-y0)绝对值=1,如相邻则两个按钮的标题交换,就像标题不为空白的按钮移到标题为空白的按钮位置。然后检查所有按钮标题是否第1行为1、2、3,第2行为4、5、6,第3行为7、8、空白排列。检查方法是按第1、2、3行顺序,每行从左到右所有按钮标题和列表list['12345678 ']每一项值逐一比较。下边是所有代码。应再加一重玩按钮,单击该按钮实现标题所显示的数字和空白随机重新排列。改成4行4列或5行5列的数字华容道也是不困难的。

import random
from tkinter import Tk,Button,Label
def btnClick(x,y):       #所有按钮的事件函数,有两个参数,被点击按钮所在位置行列号
    global row_of_space  #说明变量是全局变量,即变量在主程序中定义的,必加否则报错
    global col_of_space  #在函数内为变量赋值,默认是局部变量,这两个变量是空白按钮的行列号
    if abs(x-row_of_space)+abs(y-col_of_space)==1:  #判断被单击按钮是否和空白按钮相邻
        buttons[row_of_space,col_of_space]['text']=buttons[x,y]['text']
        buttons[x,y]['text']=' '  #如相邻,被点击按钮和空白按钮交换标题
        row_of_space=x            #现在被点击按钮标题变为空白,行列被保存
        col_of_space=y
        n=0   #按第1、2、3行顺序,每行从左到右所有按钮标题和列表numbers每一项值逐一比较
        for row in range(3):
            for col in range(3):
                if buttons[row,col]['text']!=numbers[n]:  #有1项不等,表示排列不正确退出
                    return
                n+=1
        label['text']='你赢了' #到这里,说明排列正确,玩家赢了,修改Label标题
root = Tk()  #初始化窗口
root.title('数字华容道') #窗口标题
root.geometry("300x250+200+20") #窗口宽300,高=300,窗口左上点离屏幕左边界200,离屏幕上边界距离20。
root.resizable(width=False,height=False) #设置窗口是否可变,宽不可变,高不可变,默认为True
label=Label(root,text='单击数字移动方块',fg='red',font=("Arial",15))
label.place(x=20,y=10,width=250,height=40)
row_of_space=0  #保存标题空白按钮的行号
col_of_space=0  #保存标题空白按钮的行号
buttons={}      #字典
numbers=list('12345678 ')   #列表,所有按钮标题可显示的数字1到8和空白
random.shuffle(numbers)     #使列表数字和空白随机排列
for row in range(3): #row=行,0,1,2
    for col in range(3): #col=列,0,1,2,参见博文:python3.8的tkinter按钮事件函数实现多个参数
        button=Button(root,command=lambda x=row,y=col:btnClick(x,y),fg='red',font=("Arial",35))
        buttons[row,col]=button
        button['text']=numbers.pop()    #将列表numbers最后一项作为按钮标题并将列表最后1项删除
        button.place(x=60+col*60,y=60+row*60,width=50,height=50)
        if button['text']==' ':         #记住空白按钮所在位置的行列号
            row_of_space=row
            col_of_space=col
numbers=list('12345678 ')
root.mainloop() #进入循环,运行窗口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python基础之while循环语句的使用

    一.前言 前面我们学习了if分支判断和for循环语句,在这次推送中我们将继续了解循环大家庭的成员们.大家可以通过上面的流程图来了解while的作用,它就像是一个门控开关,和if相似,当条件成立时执行规定操作. 下面是一个简单案例大家可用来加深理解 二.break语句 if-break的意思是如果满足了某一个条件,就提前结束循环 在下面的小案例中我们实现了反复询问,就像是你在登录自己电脑时,页面反复请求获取密码,直到你输入正确密码,循环结束 三.continue语句 continue–"继续&qu

  • Python基础教程之循环语句(for、while和嵌套循环)

    循环可以用来重复执行某条语句,直到某个条件得到满足或遍历所有元素. 1 for循环 是for循环,可以把集合数据类型list.tuple.dict.set的元素遍历出来. (1)对list进行循环 city_list = ['广州','深圳','东莞','佛山'] city_list = ['广州','深圳','东莞','佛山'] for city in city_list: print("当前地市为:{0}".format(city)) 当前地市为:广州 当前地市为:深圳 当前地市为

  • 浅析Python 条件控制语句

    Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: 代码执行过程: if 语句 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 如果 "condition_1" 为 True 将执行 "stateme

  • python基础详解之if循环语句

    前言 还记得这个九九乘法表吗,这次课后相信你可以用代码给你的小弟弟妹妹们变出这份"葵花宝典". 循环 如果要把循环翻译成机器语言,那他对应的可以是 for-in- ,循环就像是一个可爱的搬砖人,简单的一条语句帮我们解决了很多的重复劳动. 上面的语句实现了计算15,25,35,45,55的功能,i就像是一个彩票,不过他有自己的性格,这是个热爱平等的彩票,他会依次访问[ ]里的值,当他访问1时i就为1,此时将会执行print(15),接下来访问2时i就为2,继续执行乘法工作,直到[]里每一

  • Python基础学习之条件控制语句小结

    一.条件控制语句的补充 在循环里面,我们可以通过关键字来手动终止循环,而不是把整个程序停了来终止. 三种语句:break return continue都可以使循环停止 不过return一般都是用到函数里面的,都是使用break 而continue 不是用来终止循环的,具体作用看下面代码示例 二.break 看汉语也有个大概思想:打破 它的作用是打破循环,使循环碰到它后终止 break的作用是打破结构体,使程序退出当前代码块 下面看这个例子,我们要实现的功能是循环获取用户从键盘输入的数据,直到输

  • Python使用sql语句对mysql数据库多条件模糊查询的思路详解

    def find_worldByName(c_name,continent): print(c_name) print(continent) sql = " SELECT * FROM world WHERE 1=1 " if(c_name!=None): sql=sql+"AND ( c_name LIKE '%"+c_name+"%' )" if(continent!=None): sql=sql+" AND ( continent

  • Python基础之条件控制操作示例【if语句】

    本文实例讲述了Python基础之条件控制操作.分享给大家供大家参考,具体如下: if 语句 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句,如果 "condition_1&

  • python自动生成sql语句的脚本

    描述: 工作中在数据库中创建表时,当字段很多时,比较麻烦,开发一个工具,可在excel中写好字段英文名和中文名,然后通过py生成脚本或直接在库中生成表 脚本: import tkinter from tkinter import * import tkinter.messagebox from tkinter import scrolledtext import xlrd import pymysql import os #从excel中获取字段项,组合建表语句 def get_create_s

  • 解决python mysql insert语句的问题

    1.python 数据插入问题 par=[] for a in params: if type(a) == list: par.append('"str(a)"') else: par.append(a) for b in par: print() cursor.execute(sql,tuple(par)) 解决 注意python中的 extend,append 的区别,在数据添加数据库中的时候,如果列表中列表一定将列表转为 str 类型, params 中的 append 添加记录

  • 在python代码中加入环境变量的语句操作

    以GraphViz为例: 下载安装好的路径名字为C:/Program Files (x86)/Graphviz2.38 import os os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/' #注意修改你的路径 os.environ['path']返回的是所有环境变量的所在的位置,我们这里是为了添加,所以再重新造一个. os.pathsep返回的是分隔符";" 补

随机推荐