基于Python/Tkinter的拼图单机小游戏

2023-11-15

这是很早之前写的拼图游戏,基于Py/Tk,今天翻出来,然后重新整理,并且发布出来,供大家参考学习,自己看CSDN里有很多了类似的游戏代码,虽然代码逻辑上大同小异,但每个开发者都有自己独特的开发个性和习惯,这并无优劣,而且都可以从代码中都可以一窥究竟。下午整理代码的时候才发现之前写Code的时候,居然一句注释也没有加,搞得自己又重新梳理了一遍Code逻辑,才将注释全部添加上,不添加注释实在不是个好的习惯。虽然拼图小游戏虽然只有几百行的代码,但是对于了解Tkinter的模块以及熟悉Py编程却是既有好处,废话少说,直接上代码吧

主界面
主界面

4*3模式

3*3模式

游戏图片选择弹窗

配置文件包

1.类初始化

import random
import os
import Pmw
import time
from Tkinter import *
from PIL import Image,ImageTk

class image_crop():
    #拼图游戏
    def __init__(self):
        self.now_path=os.getcwd()
        self.num_page=0

2.设置--图片设置界面--游戏图片的选择

    def image_set(self):
       #设置界面关于拼图游戏中--游戏图片的选择
        path1=[]
        path_flod=self.now_path+"\image_\\"
        for i in(os.listdir(path_flod)):
            path1.append(path_flod+i)
        main_frame1=self.root.grid_slaves(row=1,column=0)
        main_frame1[0].grid_remove()
        self.imageset_toplevel=Frame(self.root)
        self.imageset_toplevel.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
        frame_titleimage=Frame(self.imageset_toplevel)
        frame_titleimage.pack(side=TOP)
        label_tag=Label(frame_titleimage,text=u"图片名称:",width=10,font=('Verdana bold',10))
        label_tag.grid(row=0,column=0,sticky='ws')
        self.image_name=StringVar()
        label_name=Label(frame_titleimage,textvariable=self.image_name,width=20,font=('Verdana bold',10))
        label_name.grid(row=0,column=1)
        self.image_name.set(' ')
        but=Button(frame_titleimage,text=u"确定",width=10,font=('Verdana bold',9),command=sure_comd)
        but.grid(row=0,column=2)
        self.widgets_group=Pmw.ScrolledFrame(self.imageset_toplevel,usehullsize=1,frame_relief="flat",hull_width=500,
                                             hull_height=400,
                                             scrollmargin=0)
        self.widgets_group.pack(side=TOP,fill=BOTH,expand=1)
        frame_page=Frame(self.imageset_toplevel)
        frame_page.pack(side=TOP)
        up_page=Button(frame_page,text=u"上一页",width=10,font=('Verdana bold',9),command=test_up)
        up_page.pack(side=LEFT)
        self.ent=StringVar()
        entry_page=Entry(frame_page,width=10,font=('Verdana bold',10),textvariable=self.ent,state='readonly')
        entry_page.pack(side=LEFT)
        self.ent.set(u"第1页")
        down_page=Button(frame_page,text=u"下一页",width=10,font=('Verdana bold',9),command=test_down)
        down_page.pack(side=LEFT)
        
        for i in range(3):
            for j in range(3):
                #生成图片标签Label
                
        img_labelq=Label(self.widgets_group.interior(),borderwidth=2,relief='groove')
                img_labelq.grid(row=i,column=j)
        #加载图片
        image_1(path1[0])
        image_2(path1[1])
        image_3(path1[2])
        image_4(path1[3])
        image_5(path1[4])
        image_6(path1[5])
        image_7(path1[6])
        image_8(path1[7])
        image_9(path1[8])
        #注意:这里需要注意一下,图片文件至少需要大于9张,如果不是,系统报错,因为时间关系这块没有修改

3.设置---图片设置界面--鼠标选中图片后的操作

        def comd_show(event,fr_,path_img):
            #左键-选中图片后--加载图片名称
            fr_.configure(relief='solid')
            self.root.update()
            time.sleep(0.2)
            fr_.configure(relief='groove')
            image_path=os.path.basename(path_img)
            self.image_name.set(image_path.decode("cp936"))
        def doublue_comd(event,path_img):
            #右键-选中图片后--弹窗显示选中图片大图
            imageshow_toplevel=Toplevel()
            imageshow_toplevel.geometry('+400+140')
            imageshow_toplevel.overrideredirect(0)
            image_show=Image.open(path_img)
            if image_show.size[1]>image_show.size[0]:
                self.size_img_2=image_show.resize((350, 450))
            elif image_show.size[1]<image_show.size[0]:
                self.size_img_2=image_show.resize((450, 350))
            self.showimage=ImageTk.PhotoImage(self.size_img_2)
                       img_label_show=Label(imageshow_toplevel,borderwidth=2,relief='groove',image=self.showimage)
            img_label_show.grid(row=0,column=0)

4.设置---图片设置界面--所有图片包中图片显示模块

注:这部分代码虽然有些重复,有优化的地方,但逻辑上完备的,这里先将代码贴出来,如果读者有兴趣,可以将此部分优化

         def image_1(path_image):
            #图片选择器---加载第一张图片
            image_set_1=Image.open(path_image)
            if image_set_1.size[1]>image_set_1.size[0]:
                self.size_img_1=image_set_1.resize((128, 170))
            elif image_set_1.size[1]<image_set_1.size[0]:
                self.size_img_1=image_set_1.resize((170, 128))
            self.setimage_label_1=ImageTk.PhotoImage(self.size_img_1)
            qws1=self.widgets_group.interior().grid_slaves(row=0,column=0)
            qws1[0].configure(image=self.setimage_label_1,relief='groove')
            qws1[0].bind("<Button-1>",lambda e,fr_=qws1[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws1[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_2(path_image):
            #图片选择器---加载第二张图片
            image_set_2=Image.open(path_image)
            if image_set_2.size[1]>image_set_2.size[0]:
                self.size_img_2=image_set_2.resize((128, 170))
            elif image_set_2.size[1]<image_set_2.size[0]:
                self.size_img_2=image_set_2.resize((170, 128))
            self.setimage_2=ImageTk.PhotoImage(self.size_img_2)
            qws2=self.widgets_group.interior().grid_slaves(row=0,column=1)
            qws2[0].configure(image=self.setimage_2,relief='groove')
            qws2[0].bind("<Button-1>",lambda e,fr_=qws2[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws2[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_3(path_image):
            #图片选择器---加载第二张图片
            image_set_3=Image.open(path_image)
            if image_set_3.size[1]>image_set_3.size[0]:
                self.size_img_3=image_set_3.resize((128, 170))
            elif image_set_3.size[1]<image_set_3.size[0]:
                self.size_img_3=image_set_3.resize((170, 128))
            self.setimage_label_3=ImageTk.PhotoImage(self.size_img_3)
            qws3=self.widgets_group.interior().grid_slaves(row=0,column=2)
            qws3[0].configure(image=self.setimage_label_3,relief='groove')
            qws3[0].bind("<Button-1>",lambda e,fr_=qws3[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws3[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_4(path_image):
            image_set_4=Image.open(path_image)
            if image_set_4.size[1]>image_set_4.size[0]:
                self.size_img_4=image_set_4.resize((128, 170))
            elif image_set_4.size[1]<image_set_4.size[0]:
                self.size_img_4=image_set_4.resize((170, 128))
            self.setimage_label_4=ImageTk.PhotoImage(self.size_img_4)
            qws4=self.widgets_group.interior().grid_slaves(row=1,column=0)
            qws4[0].configure(image=self.setimage_label_4,relief='groove')
            qws4[0].bind("<Button-1>",lambda e,fr_=qws4[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws4[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_5(path_image):
            image_set_5=Image.open(path_image)
            if image_set_5.size[1]>image_set_5.size[0]:
                self.size_img_5=image_set_5.resize((128, 170))
            elif image_set_5.size[1]<image_set_5.size[0]:
                self.size_img_5=image_set_5.resize((170, 128))
            self.setimage_label_5=ImageTk.PhotoImage(self.size_img_5)
            qws5=self.widgets_group.interior().grid_slaves(row=1,column=1)
            qws5[0].configure(image=self.setimage_label_5,relief='groove')
            qws5[0].bind("<Button-1>",lambda e,fr_=qws5[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws5[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_6(path_image):
            image_set_6=Image.open(path_image)
            if image_set_6.size[1]>image_set_6.size[0]:
                self.size_img_6=image_set_6.resize((128, 170))
            elif image_set_6.size[1]<image_set_6.size[0]:
                self.size_img_6=image_set_6.resize((170, 128))
            self.setimage_label_6=ImageTk.PhotoImage(self.size_img_6)
            qws6=self.widgets_group.interior().grid_slaves(row=1,column=2)
            qws6[0].configure(image=self.setimage_label_6,relief='groove')
            qws6[0].bind("<Button-1>",lambda e,fr_=qws6[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws6[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_7(path_image):
            image_set_7=Image.open(path_image)
            if image_set_7.size[1]>image_set_7.size[0]:
                self.size_img_7=image_set_7.resize((128, 170))
            elif image_set_7.size[1]<image_set_7.size[0]:
                self.size_img_7=image_set_7.resize((170, 128))
            self.setimage_label_7=ImageTk.PhotoImage(self.size_img_7)
            qws7=self.widgets_group.interior().grid_slaves(row=2,column=0)
            qws7[0].configure(image=self.setimage_label_7,relief='groove')
            qws7[0].bind("<Button-1>",lambda e,fr_=qws7[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws7[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_8(path_image):
            image_set_8=Image.open(path_image)
            if image_set_8.size[1]>image_set_8.size[0]:
                self.size_img_8=image_set_8.resize((128, 170))
            elif image_set_8.size[1]<image_set_8.size[0]:
                self.size_img_8=image_set_8.resize((170, 128)) 
            self.setimage_label_8=ImageTk.PhotoImage(self.size_img_8)
            qws8=self.widgets_group.interior().grid_slaves(row=2,column=1)
            qws8[0].configure(image=self.setimage_label_8,relief='groove')
            qws8[0].bind("<Button-1>",lambda e,fr_=qws8[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws8[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_9(path_image):
            image_set_9=Image.open(path_image)
            if image_set_9.size[1]>image_set_9.size[0]:
                self.size_img_9=image_set_9.resize((128, 170))
            elif image_set_9.size[1]<image_set_9.size[0]:
                self.size_img_9=image_set_9.resize((170, 128))
            self.setimage_label_9=ImageTk.PhotoImage(self.size_img_9)
            qws9=self.widgets_group.interior().grid_slaves(row=2,column=2)
            qws9[0].configure(image=self.setimage_label_9,relief='groove')
            qws9[0].bind("<Button-1>",lambda e,fr_=qws9[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws9[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))

5.设置---图片设置界面--下一页--图片显示

        def test_down():
            #下一页--图片缩略图实现
            self.num_page+=1
            chu=len(path1)/9
            if self.num_page<=chu:
                #加载图片
                self.ent.set(u"第"+str(self.num_page+1)+u"页")
                image_1(self.now_path+"\\no_show.png")
                image_2(self.now_path+"\\no_show.png")
                image_3(self.now_path+"\\no_show.png")
                image_4(self.now_path+"\\no_show.png")
                image_5(self.now_path+"\\no_show.png")
                image_6(self.now_path+"\\no_show.png")
                image_7(self.now_path+"\\no_show.png")
                image_8(self.now_path+"\\no_show.png")
                image_9(self.now_path+"\\no_show.png")
                if self.num_page<chu:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                    image_6(path1[self.num_page*9+5])
                    image_7(path1[self.num_page*9+6])
                    image_8(path1[self.num_page*9+7])
                    image_9(path1[self.num_page*9+8])
                elif self.num_page==chu and len(path1)%9==1:
                    image_1(path1[self.num_page*9+0])
                elif self.num_page==chu and len(path1)%9==2:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                elif self.num_page==chu and len(path1)%9==3:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                elif self.num_page==chu and len(path1)%9==4:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                elif self.num_page==chu and len(path1)%9==5:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                elif self.num_page==chu and len(path1)%9==6:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                    image_6(path1[self.num_page*9+5])
                elif self.num_page==chu and len(path1)%9==7:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                    image_6(path1[self.num_page*9+5])
                    image_7(path1[self.num_page*9+6])
                elif self.num_page==chu and len(path1)%9==8:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                    image_6(path1[self.num_page*9+5])
                    image_7(path1[self.num_page*9+6])
                    image_8(path1[self.num_page*9+7])

6.设置---图片设置界面--上一页--图片显示

        def test_up():
            #上一页---图片显示
            self.num_page-=1
            chu=len(path1)/9
            if self.num_page<=chu and self.num_page>=0:
                self.ent.set(u"第"+str(self.num_page+1)+u"页")
                if self.num_page<chu:
                    image_1(path1[self.num_page*9+0])
                    image_2(path1[self.num_page*9+1])
                    image_3(path1[self.num_page*9+2])
                    image_4(path1[self.num_page*9+3])
                    image_5(path1[self.num_page*9+4])
                    image_6(path1[self.num_page*9+5])
                    image_7(path1[self.num_page*9+6])
                    image_8(path1[self.num_page*9+7])
                    image_9(path1[self.num_page*9+8])

7.设置---图片设置界面--选中图片后--点击确定

        def sure_comd():
            #选中图片--点击确定--操作函数
            self.image_name.get()
            if self.image_name.get()!=' ':
                image_sh_path=path_flod+self.image_name.get()
                self.num_page=0
                #启动游戏
                self.start(image_sh_path)

8.游戏主界面

    def st_(self):
        #主界面
        self.root=Tk()
        self.root.title(u"拼图")
        self.root.geometry('+400+150')
        self.root.maxsize(850,590)
        self.root.minsize(640,450)
        self.root.iconbitmap(self.now_path+'\\1.ico')
        self.menuBar=Pmw.MenuBar(self.root,hull_relief=RAISED,hull_borderwidth=1)
        self.menuBar.grid(row=0,column=0,columnspan=4,rowspan=1,sticky=NSEW)
        self.menuBar.addmenu(u'选项',' Option',font=('Verdana bold',10))
        self.menuBar.addmenuitem(u'选项','command',label=u"刷新",font=('Verdana bold',10),
                                 activebackground='blue',command=shuaxin)
        self.menuBar.addmenuitem(u'选项','command',label=u"关闭",font=('Verdana bold',10),
                                 activebackground='blue',command=close_)
        self.menuBar.addmenu(u'设置',' Option',font=('Verdana bold',10))
        self.menuBar.addmenu(u'帮助',' Option',font=('Verdana bold',10))
        self.menuBar.addmenuitem(u'帮助','command',label=u"关于",font=('Verdana bold',10),
                                 activebackground='blue',command=help_)
        self.menuBar.addmenuitem(u'设置','command',label=u"图片设置",font=('Verdana bold',10),
                                 activebackground='blue',command=self.image_set)
        self.menuBar.addcascademenu(u'设置', u'模式设置',
                'Set some other preferences',tearoff = 0,font=('Verdana bold',10))
        for size in (' 3*3 ',' 4*3 '):
            self.menuBar.addmenuitem(u'模式设置', 'command', 'Set size to ' + size,
                    label = size,font=('Verdana bold',8))
        self.frame1=Frame(self.root,relief='groove',borderwidth=2,width=500,heigh=50)
        self.frame1.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
        self.frame2=Frame(self.root)
        self.frame2.grid(row=1,column=3,rowspan=3,sticky=NSEW)
        self.img_label=Label(self.frame2,borderwidth=2,relief='groove',width=26,heigh=18)
        self.img_label.grid(row=0,column=0)
        frame2_2=Frame(self.frame2)
        frame2_2.grid(row=1,column=0,pady=60)
        self.win_tishi=StringVar() 
        label_win=Label(frame2_2,textvariable=self.win_tishi,font=('Verdana bold',10))
        label_win.pack(side=TOP)
        self.win_tishi.set(" ")
        but2=Button(frame2_2,text=u"退出",font=('Verdana bold',10),width=10,command=close_)
        but2.pack(side=TOP,padx=20,pady=10)
        self.root.mainloop()

9.游戏执行主逻辑---4*3模式

注:因为代码注释比较详细,所以直接将整个函数代码块贴出来

    def four_three_mod(self):
        #4*3模式
        test_arr=[1,2,3,4,5,6,7,8,9,10,11]
        new_array=[]
        tag_chongfu=False
        for i in range(len(test_arr)):
            #获取一个打乱后的次序数组
            rand_int=random.randint(0,10-i)
            new_array.append(test_arr[rand_int])
            del test_arr[rand_int]
        print(new_array)
        self.list=[[99,99,99,99,99,99],
                   [99,0,new_array[0],new_array[1],new_array[2],99],
                   [99,new_array[3],new_array[4],new_array[5],new_array[6],99],
                   [99,new_array[7],new_array[8],new_array[9],new_array[10],99],
                   [99,99,99,99,99,99]]
        #将打乱的一维次序数组映射到图盘二维数组
        #注意这里是套用数组5*5模板
        list_biaozhun=[[99,99,99,99,99,99],
                       [99,0,1,2,3,99],
                       [99,4,5,6,7,99],
                       [99,8,9,10,11,99],
                       [99,99,99,99,99,99]]
        #正确图像的原始二维数组
        main_frame=self.root.grid_slaves(row=1,column=0)
        main_frame[0].grid_remove()
        #清空图盘
        suoluetu_fr=self.frame2.grid_slaves(row=0,column=0)
        suoluetu_fr[0].grid_remove()
        #清空参照图片区
        self.frame1=Frame(self.root,relief='groove',borderwidth=2,bg='white')
        self.frame1.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
        #生成新的图盘表格
        self.img_label=Label(self.frame2,borderwidth=2,relief='groove')
        self.img_label.grid(row=0,column=0)
        #生成新的参照图片区
        def commd1(event,tag):
            #绑定4*3点击函数
            for i in range(len(self.list)):
                for j in range(len(self.list[i])):
                    #遍历与图盘对应的数组
                    if self.list[i][j]==tag:
                        list_canshu=[i,j]
                        #获取当前点击图盘位置的截图次序值
                        break
            for i in range(len(self.list)):
                for j in range(len(self.list[i])):
                    #遍历与图盘对应的数组
                    if self.list[i][j]==0:
                        list_kong_canshu=[i,j]
                        #获取当前图盘位置为空的截图次序值
                        break
            x_1=list_canshu[0]
            #获取当前点击图盘位置的截图次序值的X轴坐标
            y_1=list_canshu[1]
            #获取当前点击图盘位置的截图次序值的Y轴坐标
            x_0=list_kong_canshu[0]
            #获取当前图盘位置为空的截图次序值的X轴坐标
            y_0=list_kong_canshu[1]
            #获取当前图盘位置为空的截图次序值的Y轴坐标
            if x_1+1==x_0 or x_1-1==x_0 or y_1+1==y_0 or y_1-1==y_0:
                #对空值的位置与点击图片的位置进行一个判断(即相邻判断-上-下-左-右)
                shuzu=[x_0,y_0]
                qws=self.frame1.grid_slaves(row=x_1-1,column=y_1-1)
                #获取点击位置上所在布局的Label
                qws[0].grid(row=shuzu[0]-1,column=shuzu[1]-1)
                #将获取点击位置上所在布局的Label移动到空位置的布局上
                for i in range(len(self.list)):
                    for j in range(len(self.list[i])):
                        #遍历与图盘对应的数组
                        if self.list[i][j]==0:
                            #获取当前点击图盘位置的截图次序值
                            self.list[i][j]=tag
                        elif self.list[i][j]==tag:
                            #获取当前图盘位置为空的截图次序值
                            self.list[i][j]=0
                        else:
                            pass
                if self.list==list_biaozhun:
                    #如果当前与图片对应的数组与原图的数组次序一致,则判断游戏结束
                    self.win_tishi.set("游戏结束")
        out=self.image_public.resize((240, 180))
        self.imtag_label=ImageTk.PhotoImage(out)
        self.img_label.configure(image=self.imtag_label)
        
        self.public_image_s=self.image_public.resize((600, 450))
        #重新更改图盘尺寸
        size_x=self.public_image_s.size[0]
        size_y=self.public_image_s.size[1]
        x_average=size_x/4
        y_average=size_y/3
        
        self.lab_public1=Label(self.frame1,borderwidth=1)
        self.lab_public1.grid(row=0,column=1)
        self.lab_public1.bind("<Double-Button-1>",lambda e,tag=new_array[0]: commd1(e,tag))
        #双击操作绑定事件
        self.lab_public2=Label(self.frame1,borderwidth=0.5)
        self.lab_public2.grid(row=0,column=2)
        self.lab_public2.bind("<Double-Button-1>",lambda e,tag=new_array[1]: commd1(e,tag))
        #同上
        self.lab_public3=Label(self.frame1,borderwidth=0.5)
        self.lab_public3.grid(row=0,column=3)
        self.lab_public3.bind("<Double-Button-1>",lambda e,tag=new_array[2]: commd1(e,tag))
        
        self.lab_public4=Label(self.frame1,borderwidth=0.5)
        self.lab_public4.grid(row=1,column=0)
        self.lab_public4.bind("<Double-Button-1>",lambda e,tag=new_array[3]: commd1(e,tag))

        self.lab_public5=Label(self.frame1,borderwidth=0.5)
        self.lab_public5.grid(row=1,column=1)
        self.lab_public5.bind("<Double-Button-1>",lambda e,tag=new_array[4]: commd1(e,tag))

        self.lab_public6=Label(self.frame1,borderwidth=0.5)
        self.lab_public6.grid(row=1,column=2)
        self.lab_public6.bind("<Double-Button-1>",lambda e,tag=new_array[5]: commd1(e,tag))

        self.lab_public7=Label(self.frame1,borderwidth=0.5)
        self.lab_public7.grid(row=1,column=3)
        self.lab_public7.bind("<Double-Button-1>",lambda e,tag=new_array[6]: commd1(e,tag))

        self.lab_public8=Label(self.frame1,borderwidth=0.5)
        self.lab_public8.grid(row=2,column=0)
        self.lab_public8.bind("<Double-Button-1>",lambda e,tag=new_array[7]: commd1(e,tag))

        self.lab_public9=Label(self.frame1,borderwidth=0.5)
        self.lab_public9.grid(row=2,column=1)
        self.lab_public9.bind("<Double-Button-1>",lambda e,tag=new_array[8]: commd1(e,tag))
        self.lab_public10=Label(self.frame1,borderwidth=0.5)
        self.lab_public10.grid(row=2,column=2)
        self.lab_public10.bind("<Double-Button-1>",lambda e,tag=new_array[9]: commd1(e,tag))
        self.lab_public11=Label(self.frame1,borderwidth=0.5)
        self.lab_public11.grid(row=2,column=3)
        self.lab_public11.bind("<Double-Button-1>",lambda e,tag=new_array[10]: commd1(e,tag))
        
        region1=(x_average,0,x_average+x_average,y_average)
        cropImg1=self.public_image_s.crop(region1)
        #对原来的图片进行按照区域进行截图
        self.im_public1=ImageTk.PhotoImage(cropImg1)
        qws=self.frame1.grid_slaves(row=new_array[0]/4,column=new_array[0]%4)
        #将第一个截图显示在frame1
        qws[0].configure(image=self.im_public1)

        region2=(x_average+x_average,0,x_average+x_average+x_average,y_average)
        cropImg2=self.public_image_s.crop(region2)
        self.im_public2=ImageTk.PhotoImage(cropImg2)
        qws=self.frame1.grid_slaves(row=new_array[1]/4,column=new_array[1]%4)
        qws[0].configure(image=self.im_public2)
        #将第二个截图显示在frame2
        
        region3=(x_average*3,0,x_average*4,y_average)
        cropImg3=self.public_image_s.crop(region3)
        self.im_public3=ImageTk.PhotoImage(cropImg3)
        qws=self.frame1.grid_slaves(row=new_array[2]/4,column=new_array[2]%4)
        qws[0].configure(image=self.im_public3)
        #同上

        region4=(0,y_average,x_average,y_average*2)
        cropImg4=self.public_image_s.crop(region4)
        self.im_public4=ImageTk.PhotoImage(cropImg4)
        qws=self.frame1.grid_slaves(row=new_array[3]/4,column=new_array[3]%4)
        qws[0].configure(image=self.im_public4)
        #同上

        region5=(x_average,y_average,x_average*2,y_average*2)
        cropImg5=self.public_image_s.crop(region5)
        self.im_public5=ImageTk.PhotoImage(cropImg5)
        qws=self.frame1.grid_slaves(row=new_array[4]/4,column=new_array[4]%4)
        qws[0].configure(image=self.im_public5)
        #同上

        region6=(x_average*2,y_average,x_average*3,y_average*2)
        cropImg6=self.public_image_s.crop(region6)
        self.im_public6=ImageTk.PhotoImage(cropImg6)
        qws=self.frame1.grid_slaves(row=new_array[5]/4,column=new_array[5]%4)
        qws[0].configure(image=self.im_public6)
        #同上

        region7=(x_average*3,y_average,x_average*4,y_average*2)
        cropImg7=self.public_image_s.crop(region7)
        self.im_public7=ImageTk.PhotoImage(cropImg7)
        qws=self.frame1.grid_slaves(row=new_array[6]/4,column=new_array[6]%4)
        qws[0].configure(image=self.im_public7)
        #同上

        region8=(0,y_average*2,x_average,y_average*3)
        cropImg8=self.public_image_s.crop(region8)
        self.im_public8=ImageTk.PhotoImage(cropImg8)
        qws=self.frame1.grid_slaves(row=new_array[7]/4,column=new_array[7]%4)
        qws[0].configure(image=self.im_public8)
        #同上

        region9=(x_average,y_average*2,x_average*2,y_average*3)
        cropImg9=self.public_image_s.crop(region9)
        self.im_public9=ImageTk.PhotoImage(cropImg9)
        qws=self.frame1.grid_slaves(row=new_array[8]/4,column=new_array[8]%4)
        qws[0].configure(image=self.im_public9)
        #同上

        region10=(x_average*2,y_average*2,x_average*3,y_average*3)
        cropImg10=self.public_image_s.crop(region10)
        self.im_public10=ImageTk.PhotoImage(cropImg10)
        qws=self.frame1.grid_slaves(row=new_array[9]/4,column=new_array[9]%4)
        qws[0].configure(image=self.im_public10)
        #同上

        region11=(x_average*3,y_average*2,x_average*4,y_average*3)
        cropImg11=self.public_image_s.crop(region11)
        self.im_public11=ImageTk.PhotoImage(cropImg11)
        qws=self.frame1.grid_slaves(row=new_array[10]/4,column=new_array[10]%4)
        qws[0].configure(image=self.im_public11)
        #同上

10.游戏执行主逻辑---3*3模式

注:因为代码注释比较详细,所以直接将整个函数代码块贴出来

    def three_three_mod(self):
        #3*3模型
        test_arr=[1,2,3,4,5,6,7,8]
        new_array=[]
        tag_chongfu=False
        num=len(test_arr)
        for i in range(len(test_arr)):
            #获取一个打乱后的次序数组
            rand_int=random.randint(0,7-i)
            new_array.append(test_arr[rand_int])
            del test_arr[rand_int]
        self.list=[[9,9,9,9,9],
                   [9,0,new_array[0],new_array[1],9],
                   [9,new_array[2],new_array[3],new_array[4],9],
                   [9,new_array[5],new_array[6],new_array[7],9],
                   [9,9,9,9,9]]
        #将打乱的一维次序数组映射到图盘二维数组
        #注意这里是套用数组5*5模板
        list_biaozhun=[[9,9,9,9,9],
                       [9,0,1,2,9],
                       [9,3,4,5,9],
                       [9,6,7,8,9],
                       [9,9,9,9,9]]
        #正确图像的原始二维数组
        main_frame=self.root.grid_slaves(row=1,column=0)
        main_frame[0].grid_remove()
        suoluetu_fr=self.frame2.grid_slaves(row=0,column=0)
        suoluetu_fr[0].grid_remove()
        self.frame1=Frame(self.root,relief='groove',borderwidth=2,bg='white')
        self.frame1.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
        #生成图盘布局Frame
        self.img_label=Label(self.frame2,borderwidth=2,relief='groove')
        self.img_label.grid(row=0,column=0)
        def commd1(event,tag):
            #绑定点击函数
            for i in range(len(self.list)):
                for j in range(len(self.list[i])):
                    #遍历与图盘对应的数组
                    if self.list[i][j]==tag:
                        #获取当前点击图盘位置的截图次序值
                        list_canshu=[i,j]
                        break
            for i in range(len(self.list)):
                for j in range(len(self.list[i])):
                    #遍历与图盘对应的数组
                    if self.list[i][j]==0:
                        #获取当前图盘位置为空的截图次序值
                        list_kong_canshu=[i,j]
                        break
            x_1=list_canshu[0]
            #获取当前点击图盘位置的截图次序值的X轴坐标
            y_1=list_canshu[1]
            #获取当前点击图盘位置的截图次序值的Y轴坐标
            x_0=list_kong_canshu[0]
            #获取当前图盘位置为空的截图次序值的X轴坐标
            y_0=list_kong_canshu[1]
            #获取当前图盘位置为空的截图次序值的Y轴坐标
            if x_1+1==x_0 or x_1-1==x_0 or y_1+1==y_0 or y_1-1==y_0:
                #对空值的位置与点击图片的位置进行一个判断(即相邻判断-上-下-左-右)
                shuzu=[x_0,y_0]
                qws=self.frame1.grid_slaves(row=x_1-1,column=y_1-1)
                #获取点击位置上所在布局的Label
                qws[0].grid(row=shuzu[0]-1,column=shuzu[1]-1)
                #将获取点击位置上所在布局的Label移动到空位置的布局上
                for i in range(len(self.list)):
                    for j in range(len(self.list[i])):
                        #遍历与图盘对应的数组
                        if self.list[i][j]==0:
                            #将图盘位置为空的截图次序值置为点击图盘位置截图次序值
                            self.list[i][j]=tag
                        elif self.list[i][j]==tag:
                            #将原来点击图盘位置的截图次序值置为空
                            self.list[i][j]=0
                        else:
                            pass
                if self.list==list_biaozhun:
                    #如果当前与图片对应的数组与原图的数组次序一致,则判断游戏结束
                    self.win_tishi.set("游戏结束")
        out=self.image_public.resize((180, 220))
        self.imtag_label=ImageTk.PhotoImage(out)
        self.img_label.configure(image=self.imtag_label)
        self.public_image_s=self.image_public.resize((450,550))
        size_x=self.public_image_s.size[0]
        size_y=self.public_image_s.size[1]
        x_average=size_x/3
        y_average=size_y/3
        
        self.lab_public1=Label(self.frame1,borderwidth=1)
        self.lab_public1.grid(row=0,column=1)
        self.lab_public1.bind("<Double-Button-1>",lambda e,tag=new_array[0]: commd1(e,tag))
        #双击操作绑定事件
        self.lab_public2=Label(self.frame1,borderwidth=0.5)
        self.lab_public2.grid(row=0,column=2)
        self.lab_public2.bind("<Double-Button-1>",lambda e,tag=new_array[1]: commd1(e,tag))
        #同上
        self.lab_public3=Label(self.frame1,borderwidth=0.5)
        self.lab_public3.grid(row=1,column=0)
        self.lab_public3.bind("<Double-Button-1>",lambda e,tag=new_array[2]: commd1(e,tag))
        #同上
        self.lab_public4=Label(self.frame1,borderwidth=0.5)
        self.lab_public4.grid(row=1,column=1)
        self.lab_public4.bind("<Double-Button-1>",lambda e,tag=new_array[3]: commd1(e,tag))
        #同上
        self.lab_public5=Label(self.frame1,borderwidth=0.5)
        self.lab_public5.grid(row=1,column=2)
        self.lab_public5.bind("<Double-Button-1>",lambda e,tag=new_array[4]: commd1(e,tag))
        #同上
        self.lab_public6=Label(self.frame1,borderwidth=0.5)
        self.lab_public6.grid(row=2,column=0)
        self.lab_public6.bind("<Double-Button-1>",lambda e,tag=new_array[5]: commd1(e,tag))
        #同上
        self.lab_public7=Label(self.frame1,borderwidth=0.5)
        self.lab_public7.grid(row=2,column=1)
        self.lab_public7.bind("<Double-Button-1>",lambda e,tag=new_array[6]: commd1(e,tag))
        #同上
        self.lab_public8=Label(self.frame1,borderwidth=0.5)
        self.lab_public8.grid(row=2,column=2)
        self.lab_public8.bind("<Double-Button-1>",lambda e,tag=new_array[7]: commd1(e,tag))
        #同上
        x_2=x_average
        y_2=y_average
        test_shunxu=[]
        
        region1=(x_average,0,x_average+x_average,y_average)
        cropImg1=self.public_image_s.crop(region1)
        #对原来的图片进行按照区域进行截图
        self.im_public1=ImageTk.PhotoImage(cropImg1)
        qws=self.frame1.grid_slaves(row=new_array[0]/3,column=new_array[0]%3)
        qws[0].configure(image=self.im_public1)
        #将第一个截图显示在frame1
        test_shunxu.append((1,new_array[0]))
        #同时将绑定的次序写入一个二维数组
        region2=(x_average+x_average,0,x_average+x_average+x_average,y_average)
        cropImg2=self.public_image_s.crop(region2)
        self.im_public2=ImageTk.PhotoImage(cropImg2)
        qws=self.frame1.grid_slaves(row=new_array[1]/3,column=new_array[1]%3)
        qws[0].configure(image=self.im_public2)
        test_shunxu.append((2,new_array[1]))
        #同上

        region3=(0,y_average,x_average,y_average+y_average)
        cropImg3=self.public_image_s.crop(region3)
        self.im_public3=ImageTk.PhotoImage(cropImg3)
        qws=self.frame1.grid_slaves(row=new_array[2]/3,column=new_array[2]%3)
        qws[0].configure(image=self.im_public3)
        test_shunxu.append((3,new_array[2]))
        #同上
        
        region4=(x_average,y_average,x_average+x_average,y_average+y_average)
        cropImg4=self.public_image_s.crop(region4)
        self.im_public4=ImageTk.PhotoImage(cropImg4)
        qws=self.frame1.grid_slaves(row=new_array[3]/3,column=new_array[3]%3)
        qws[0].configure(image=self.im_public4)
        test_shunxu.append((4,new_array[3]))
        #同上
        
        region5=(x_average+x_average,y_average,x_average+x_average+x_average,y_average+y_average)
        cropImg5=self.public_image_s.crop(region5)
        self.im_public5=ImageTk.PhotoImage(cropImg5)
        qws=self.frame1.grid_slaves(row=new_array[4]/3,column=new_array[4]%3)
        qws[0].configure(image=self.im_public5)
        test_shunxu.append((5,new_array[4]))
        #同上
        
        region6=(0,y_average+y_average,x_average,y_average+y_average+y_average)
        cropImg6=self.public_image_s.crop(region6)
        self.im_public6=ImageTk.PhotoImage(cropImg6)
        qws=self.frame1.grid_slaves(row=new_array[5]/3,column=new_array[5]%3)
        qws[0].configure(image=self.im_public6)
        test_shunxu.append((6,new_array[5]))
        #同上
        
        region7=(x_average,y_average+y_average,x_average+x_average,y_average+y_average+y_average)
        cropImg7=self.public_image_s.crop(region7)
        self.im_public7=ImageTk.PhotoImage(cropImg7)
        qws=self.frame1.grid_slaves(row=new_array[6]/3,column=new_array[6]%3)
        qws[0].configure(image=self.im_public7)
        test_shunxu.append((7,new_array[6]))
        #同上

        region8=(x_average+x_average,y_average+y_average,x_average+x_average+x_average,y_average+y_average+y_average)
        cropImg8=self.public_image_s.crop(region8)
        self.im_public8=ImageTk.PhotoImage(cropImg8)
        qws=self.frame1.grid_slaves(row=new_array[7]/3,column=new_array[7]%3)
        qws[0].configure(image=self.im_public8)
        test_shunxu.append((8,new_array[7]))
        #同上

11.启动游戏模块

    def start(self,image_path):
        path=image_path
        self.image_public=Image.open(path)
        #读取图片
        size_x=self.image_public.size[0]
        size_y=self.image_public.size[1]
        x_average=size_x/4
        y_average=size_y/3
        if size_x>size_y:
            if size_y+y_average>=size_x or size_x-x_average>=size_y:
                #4*3模式
                self.four_three_mod()
        else:
            #3*3模式
            self.three_three_mod()

《完》

感谢阅读,欢迎指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Python/Tkinter的拼图单机小游戏 的相关文章

  • 如果值已经是字符串,我是否应该避免转换为字符串?

    有时您必须使用列表理解将所有内容转换为字符串 包括字符串本身 b str a for a in l 但我必须这样做 b a if type a str else str a for a in l 我想知道是否str在字符串上已经足够优化no
  • Pandas:根据其他多级列对最里面的列进行分组排序

    考虑下面的 df In 3771 df pd DataFrame A a 11 B b 11 C C1 C1 C2 C1 C3 C3 C2 C3 C3 C2 C2 D D1 D2 D1 D3 D3 D2 D4 D4 D1 D2 D3 E v
  • 在Python中将距离矩阵转换为成对距离列表[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设Python中有以下距离矩阵 0 1 2 3 0 0 1 4 8 1 1 0 3 7 2 4 3 0 3 3 8 7 3 0 我想
  • 如何在python包中包含.pyx文件

    我在我的包中使用了 cythonpyirt https github com 17zuoye pyirt 但是当我将其发布到 pypi 时 pyx 文件不包含在 tar gz 中 我认为这一定与安装文件有关 但是 我找不到解决这个问题的方法
  • PySerial 和多个 Python 安装出现问题

    我的 Windows 7 计算机上有 Python 2 4 4 和 3 1 3 我想使用 PySerial 听说是内置的 所以我尝试了一下import serial在两个版本中 两者都造成了Import Error 然后我从以下位置下载了w
  • 在python中浏览ftp目录

    我正在尝试使用 ftplib 使用 Python 3 从 ftp 服务器下载多个文件夹 我有一个文件夹名称列表 它们都位于文件夹 root 中 问题是我不知道如何浏览它们 当我使用cwd我可以进入更深的目录 但是如何再次起来呢 我正在尝试得
  • python请求:重试直到收到有效响应

    我想知道是否存在重试请求一定次数的常见模式 可能由于服务器错误或网络不良而失败 我想出了这个 并且我愿意在那里找到更好的实现 cnt 0 while cnt lt 3 try response requests get uri if res
  • 如何在 python 中连接到 GObject 信号,而不保留对连接器的引用?

    问题基本上是这样的 在 python 的 gobject 和 gtk 绑定中 假设我们有一个在构造时绑定到信号的类 class ClipboardMonitor object def init self clip gtk clipboard
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • Python 异步 REST API 的响应依赖于 CPU 密集型计算。如何高效处理? [复制]

    这个问题在这里已经有答案了 我已经使用编写了一个基本的 REST APIaiohttp https aiohttp readthedocs io en stable index html 下面包含其简化版本 以说明我想要解决的问题 该 AP
  • 中断QThread睡眠

    我想知道如何暂停 QThread 然后在收到信号时恢复 我已阅读并知道我可以做这样的事情 def run self self ready False while not self ready self sleep 1 QtCore Slot
  • 您能否从函数、args 和 kwargs 确定变量将如何分配?

    我有一些样板逻辑 我想包装几个具有相同可选关键字的函数 现在看起来像下面的代码 但是 这仅处理 opt key 作为关键字传递的情况 而不是按位置传递 解决这个问题的一种方法是了解如何解决参数分配 是否有一些元函数接受函数 args 和 k
  • Django 自定义查询集过滤器

    在 Django 中 是否有一种标准方法可以为查询集编写复杂的自定义过滤器 就像我能写的一样 MyClass objects all filter field val 我想做这样的事情 MyClass objects all filter
  • os.path.expanduser("~") 的替代方案?

    在Python 2 7 x中 os path expanduser Unicode 已损坏 这意味着如果 的扩展中包含非 ASCII 字符 则会出现异常 http bugs python org issue13207 http bugs p
  • 仅打印字符串中的元音

    我是Python新手 我正在尝试打印字符串中的所有元音 因此 如果有人输入 嘿 一切都好吗 所有元音都需要打印 但我不知道怎么做 所以这不是计算元音 而是打印元音 现在我已经得到了这个 sentence input Enter your s
  • 将 Python 3 的“范围”“向后移植”到 Python 2 是一个坏主意吗?

    我的一门课程要求用 Python 完成作业 作为练习 我一直使用如下脚本确保我的程序可以在 Python 2 和 Python 3 中运行 bin bash Run some PyUnit tests python2 test py pyt
  • Django 中同一个模型的多个多对多关系

    给定以下具有两个多对多关系的模型 class Child models Model name models CharField max length 80 class Foo models Model bar models ManyToMa
  • Django 1.6:如何在视图中访问静态文件

    我已经尝试过解决方案here https stackoverflow com questions 11721818 django get the static files url in view这对我不起作用 我正在为 Python 创建一
  • vtkPythonAlgorithm 控制管道执行

    我正在尝试用 python 编写一个 vtk 过滤器ProjectDepthImage进行投影不是问题 它控制 vtk 管道的执行 基本上 我对 UserEvent 有一个回调 当用户在渲染窗口处于活动状态时按下 u 键时会触发该回调 这将
  • pylint:忽略 rcfile 中的多个

    在我的 django 项目中 我使用的是外部编写的应用程序 但编写得很糟糕 现在我想从我的 pylint 报告中忽略这个应用程序 但是我无法让 pylint 忽略它 Pylint 已经忽略了南方的迁移 如下所示 MASTER ignore

随机推荐

  • SCI期刊名缩写查询的三种方法

    SCI期刊名缩写查询的三种方法 在参考文献中 常会用到期刊的缩写名 这里介绍三种用于查询SCI期刊名缩写的方法 便于查询各个期刊的缩写 1 方法一 进入justscience查询 https sci justscience cn 2 方法二
  • 游戏开发UE4知识系列:流关卡与无缝地图切换

    参考 流关卡与无缝地图切换 官方文档 https docs unrealengine com zh CN Engine LevelStreaming index html
  • SQL笛卡尔积、内连接、左连接、右连接、全连接(速记版)

    链接
  • 配置Spring应用上下文

    配置Spring应用上下文 Spring自带了多种类型的应用上下文 下面罗列几个最有可能遇到的 AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spring应用上下文 Annota
  • Ciclop开源3D扫描仪软件---Horus源码分析之src\horus\engine\calibration\autocheck.py

    c 光明工作室 2017 2037 COPYRIGHT 光明工作室团队成员大部分来自全国著名985 211工程院校 具有丰富的工程实践经验 本工作室热忱欢迎大家的光临 工作室长期承接嵌入式开发 PCB设计 算法仿真等软硬件设计 1 基于C8
  • redis 学习导航

    一 redis学习流程 二 redis官方网址 官方网址 https redis io 三 redis简介 1 redis是一个基于内存 单线程的key value的非关系型数据库 整个数据加载到内存中进行操作 读速度可以达到 11w s
  • yolov8使用C++推理的流程及注意事项

    1 下载yolov8项目源码GitHub ultralytics ultralytics NEW YOLOv8 in PyTorch gt ONNX gt OpenVINO gt CoreML gt TFLite 2 下载opencvRel
  • 【第4篇】Inception V2

    文章目录 摘要 1 简介 2 减少内部协变量偏移 3 通过小批量统计进行归一化 3 1 使用 BatchNormalized 网络进行训练和推理 3 2 批量归一化卷积网络 3 3 批量标准化可实现更高的学习率 3 4 Batch Norm
  • 华为c语言编程规范_华为自主研发编程语言“仓颉”,“中国话”将走向世界...

    近日 网上曝光华为自研编程语言名字定为 仓颉 char 项目已经进行了很久 预计明年会对外公布一些具体细节 什么是编程语言 编程语言就好比我们生活中 父母用汉语命令孩子 去写作业 这里的汉语就是是编程语言的种类 而 去写作业 这段文字是编程
  • pytorch: 保存和读取参数和模型

    一 保存和读取参数 1 当训练完后 把当前的参数保存下来 import torch torch save net state dict path 保存参数只需用到torch save 其中net为自定义的模型名称 其子参数state dic
  • linux环境下安装Android Studio

    近期将电脑的操作系统换成了Ubuntu 对于不习惯win8 win10的人来说Ubuntu确实是一个不错的选择 主要的软件都ok了 至于QQ什么的 大家能够去找wine版的 或者直接下载一个叫CrossOver的软件进行wine安装 新的操
  • 21 存在重复元素

    题目 题解 方法1 排序 如果有相邻相等的就有重复的 但O n 是nlogn 因为对数组排序呀 class Solution public bool containsDuplicate vector
  • nodejs-post文件上传原理详解

    转自 http cnodejs org topic 4f16442ccae1f4aa270010ad 基础知识 浅谈HTTP中Get与Post的区别 HTTP请求报文格式 简单介绍下 如下图 其中请求报文中的开始行和首部行包含了常见的各种信
  • 服务器里面的文件怎么传送,FTP服务器怎么传送局域网文件

    现如今 网络的使用已经十分普遍 同时也会有各种各样的局域网知识出现 比如 FTP服务器怎么传送局域网文件 学习啦小编在这里为大家详细介绍 使用局域网传送文件的朋友也许都遇过这样的悲事 自己在拷贝移动一个大的文件的时候 在最后几分钟就会完成
  • 企业数字化转型痛点,低代码平台如何解决?

    编者按 数字化能力建设整体尚处于初级阶段 虽然数字技术的发展已经从互联网 大数据时代迈入人工智能时代 但很多企业的数字化转型总体表现并不理想 那么面对数字化转型的痛点 低代码平台是如何解决的呢 来跟小编一起往下看 关键词 可视化开发 API
  • There is no ‘Animation’ attached to the “Player” game object

    There is no Animation attached to the Player game object 在照着龚老师的Unity3D投篮游戏视频教程练习时 遇到这个错误提示 我知道意思 就是player模型导入时 动画没有正确的加
  • Apache logs目录下找不见access.log文件解决办法

    Apache logs目录下找不见access log文件解决办法 原文链接请点击 https www cnblogs com ruoli s p 14561391 html 今天在做测试的时候 忽然发现 咦 我的apache服务器logs
  • 学习java和html必须要知道的英文单词(入门单词,包括C#)

    以前听说学习编程不需要记太多的英语单词 但是我在学习的时候还是碰到许多重要的编程单词 这里给大家稍微整理了一下 非常适合我们这些萌新 一 java入门基础学习单词 第一篇 public p bl k 公开 static st t k 静态
  • java代码审查

    一 概述 代码审查 Code Review 是消灭Bug最重要的方法之一 这些审查在大多数时候都特别奏效 由于代码审查本身所针对的对象 就是俯瞰整个代码在测试过程中的问题和Bug 并且 代码审查对消除一些特别细节的错误大有裨益 尤其是那些能
  • 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏 基于Py Tk 今天翻出来 然后重新整理 并且发布出来 供大家参考学习 自己看CSDN里有很多了类似的游戏代码 虽然代码逻辑上大同小异 但每个开发者都有自己独特的开发个性和习惯 这并无优劣 而且都可以从代码中都可以