python版扫雷(基于tkinter),教你学python

这篇具有很好参考价值的文章主要介绍了python版扫雷(基于tkinter),教你学python。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

扫雷是一款相对简单好玩的小游戏,对于初学某种程序语言来说(特别是python),没有用一个项目来熟练自己所学的知识是很难过的去的。本次使用python语言去写一款居于python标准库模块tkinter的扫雷游戏,供python爱好者学习。

  1. 扫雷游戏规则与思路构建
  2. tkinter标准模块
  3. 扫雷游戏暗含那种像算法一样的东西
  4. 类与类的继承
  5. 背景图片显示与控件显示样式
  6. 自定义按钮
  7. 完整代码(直接看完整代码)

python简易扫雷代码,python,python,开发语言,游戏程序

1.扫雷游戏规则与思路构建

扫雷的游戏规则简单来说就是点开所有背后不是雷的方块就通关了,每个被点开的方块都会有一个数字(除0外)表示以该方块为中心的九个宫格内地雷的个数,玩家可以通过每个方块的数字推测那些方块背后不是雷那些方块是雷,然后逐一点开非雷方块,完成游戏。扫雷有个默认规则,就是玩家点开的方块背后无数字,则表明以该方块的九个宫格都不可能会有雷,所有以该方块为中心的九个方块会自动打开并以本规则类推到被打开的方块.

python简易扫雷代码,python,python,开发语言,游戏程序
从上图看,有红色辐条那块方块1数字,表明该方块九宫格内只有一个雷,因为这方块四周除了左上角一除没有被打开,其余地方都被打开了,所有我们很容易推出测左上角为雷,玩家可以把它标记为红旗。然后在上一个方块,有黄色标记的方块1,表明其九宫格内有一个雷,然而九宫格内已经有红旗标记了,所以可以推出?的方块不是雷,玩家可以把它点开,依此类推。

对于以上规则,在程序中我们应该如何处理呢?

首先,所表示的方块我们可以创建一个数组(python叫列表)来代表,假设每一个方块是一个对象,我们创建一个数组,数组保存上面的方块,形成一个地图map

创建一个继承了tkinter.Button按钮的特征类用于方块,该类还有一些公用成员

class Sweep(tkinter.Button):
    
    map = []   #地图
    w = 7      #地图宽度  
    h = 8      #地图高度
    mine = 5   #地雷个数
    x0 = 30    #地图相对于主窗口的起点
    y0 = 50
    count = 0  #扫除计数
    state = 0  #0play 1vectroy 2over 游戏状态
    mine_size = 40 #地图方块大小
    #数字0~9的字体颜色rgb
    fgs = [(255, 255,255),(9, 147, 62),(0, 187, 187),(240, 78, 0),(166, 19, 188)
           ,(185, 122, 87),(136, 0, 21),(163, 73, 164),(0, 0, 0),(0,0,0)]
    #方块状态颜色与背景图片
    bgs = [(128,128,128),(255,255,255),(0,255,0),(255,0,0),(255,200,0),(0,255,0),(163,73,164)]
    images = ['area.png','opened.png','flag.png','doubt.png','boom.png','sweeped.png','mistake.png']
    pic = []

    
    #创建地图
    def create_map(w=w,h=h,mine=mine,x0=x0,y0=x0,
                   mine_size=mine_size,fgs=fgs,bgs=bgs,images=images):
        Sweep.w = w
        Sweep.h = h
        Sweep.mine = mine
        Sweep.x0 = x0
        Sweep.y0 = y0
        Sweep.mine_size= mine_size
        Sweep.fgs = fgs
        Sweep.bgs = bgs
        Sweep.images=images
        Sweep.state = 0
        Sweep.count = 0

        #加载背景图片
        if not Sweep.pic :
            for filename in Sweep.images :
                image = get_image(filename,Sweep.mine_size,Sweep.mine_size)
                Sweep.pic.append(image)
        

Sweep类的公用成员是Sweep实例都可能用到的,它规定每一个方块的大小和地图大小,游戏状态等等一些公用变量。

2. tkinter标准模块

tkinter模块,是UI设计的保障,本次主要利用其中的按钮特性,还有菜单栏。

class Sweep(tkinter.Button):
		....
		def __init__(self, master=None, cnf={}, **kw):
        
       	 	super().__init__(master, cnf, **kw)
        
        	self.text = self['text']
        	self.command = self['command']
        	self.bind('<Button-1>', self.clicked)#绑定左点击,然后重写点击处理函数
        	self.bind('<Button-3>', self.right_clicked)#绑定右点击
       	 	self.r=0#按钮记录自身在map的位置 r,c
        	self.c=0
        	self.n=0#记录自身数字,9就是雷
        	self.state=0 #0没有被打开 1已经被打开 2被标志 3被质疑 4打开是雷被爆炸 5被扫除 6标志错误

        	self.update_style()
        	self.__class__.map.append(self)
        
        

    	def clicked(self, event):

        	if self.__class__.state != 0 :
                #tkinter.messagebox.showinfo(title="游戏结束!",message = "游戏已经结束,请重新开始")
                return
        	if self.state == 1: return

菜单设置

root=tkinter.Tk()

def del_menu(args):

    if args == "入门":
        Sweep.create_map(w=6,h=5,mine=1)
    elif args == "简单":
        Sweep.create_map(w=10,h=10,mine=15)
    elif args == "一般":
        Sweep.create_map(w=16,h=16,mine=40)
    elif args == "困难":
       Sweep.create_map(w=20,h=16,mine=60)
    elif args == "重新开始":
        pass
    Sweep.init_map(root)

    
 
if __name__ == '__main__':

    
    root.title('扫雷')
    Sweep.create_map(w=6,h=5,mine=3)
    Sweep.init_map(root)

    menu_bar = tkinter.Menu(root)
    root.config(menu=menu_bar)

    game_menu = tkinter.Menu(menu_bar,tearoff=False)
    menu_bar.add_cascade(label="游戏",menu=game_menu)

	#使用lambda函数用来区分每个菜单点击传入的参数
    game_menu.add_command(label="入门",command=lambda: del_menu("入门"))
    game_menu.add_command(label="简单",command=lambda: del_menu("简单"))
    game_menu.add_command(label="一般",command=lambda: del_menu("一般"))
    game_menu.add_command(label="困难",command=lambda: del_menu("困难"))
    game_menu.add_command(label="重新开始",command=lambda: del_menu("重新开始"))

    root.iconbitmap('mine.ico')
    root.mainloop()

因为点击不同的菜单处理不同的事物,每个command都要重复写很麻烦,使用lambada,可以生成不同的匿名函数。
创建一个带参数del_menu(args),通过lambda传入不同参数,实际上是生成了不同的lambda函数,该方法只能适用参数是一个已知常量

3. 扫雷游戏暗含那种像算法一样的东西

创建扫雷地图之后,我们需要在地图里面随机埋雷,埋完雷之后,我们还需要根据雷的位置,在雷的九个宫格映射数字。

埋雷
根据地图的大小,随机产生0到地图大小范围的随机数保存到random_numbers列表中,个数为地雷的数目

random_numbers = random.sample(range(0, Sweep.w*Sweep.h), Sweep.mine)

因为这里我们默认每一个方块都编号了(r,c),它们的编号是0~Sweep.w*Sweep.h,而且不重复,所以在随机序号表的编号就是代表雷了

        for i in range(Sweep.w*Sweep.h) :
            r = i // Sweep.w #i为按钮默认编号
            c = i % Sweep.w #通过编号计算出按钮在地图的行列位置
            n =  9 if i in random_numbers else 0 #如何编号在随机列表中,则为地雷赋值为9,否则赋初值
            button = Sweep(root)#按钮创建时自身会加入到map
            button.place(x = c*Sweep.mine_size+Sweep.x0,y = r*Sweep.mine_size+Sweep.y0
                         ,width = Sweep.mine_size,height = Sweep.mine_size)#方块的显示位置
            button.setPos(r=r,c=c,n=n)#设置方块在地图的行列位置和方块数字
    
        for mine in Sweep.map :#最后根据雷的位置给地图中方块更新数字映射
            mine.map_mine()  

映射数字

地雷埋好了,我们要找到地雷的位置映射雷区,如下图(r,c	)为地雷位置

python简易扫雷代码,python,python,开发语言,游戏程序
因此在(r,c)四周的方块数字n都要加一(如果方块存在,而且不是雷)

    def map_mine(self):

        if self.n != 9 : #如果n不是9,表明方块不是雷,不需要做映射
            return
            
        for mine in  self.__class__.map :#变量地图中所有方块
            r = mine.r
            c = mine.c
            if  mine == self or mine.n == 9 : #如果是自身或者映射方块是雷就跳过
                continue
			#依次找出四周方块
            if r==self.r and c==self.c+1 :
                mine.n += 1
            elif r==self.r and c==self.c-1:
                mine.n += 1
            elif r==self.r+1 and c==self.c+1:
                mine.n += 1
            elif r==self.r+1 and c==self.c-1:
                mine.n += 1
            elif r==self.r-1 and c==self.c+1:
                mine.n += 1
            elif r==self.r-1 and c==self.c-1:
                mine.n += 1
            elif r==self.r+1 and c==self.c:
                mine.n += 1
            elif r==self.r-1 and c==self.c:
                mine.n += 1

对于上面代码简单通俗易懂,但是效率不高代码重复,下面我们来做一些优化

    def map_mine(self):

        if self.n != 9 :
            return
           
         #将(r,c)的邻居的位置都找出来   
        neighbors = [(self.r+i, self.c+j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
        for r, c in neighbors:
            for mine in self.__class__.map:
                if mine.r == r and mine.c == c and mine.n != 9:
                    mine.n += 1

自动扫雷:我们知道扫雷默认规则就是打开一个没有数字的方块会自动打开其周围的方块,如果周围的方块也没有数字,就会类推下去,下面我们来实现这个规则

...
		#在方块打开是判断数字是否为0,如果为0就调用auto_sweep()
        if self.n == 0 :
            self.auto_sweep()
            self.vectory()
            return
       #以上一段代码是在clicked里面的
...

def auto_sweep(self):

        if self.state == 1 : return

        self.state = 1
        self.update_style()
        self.__class__.count += 1
        
        if self.n != 0 :
            return    
            
        neighbors = [(self.r+i, self.c+j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
        for r, c in neighbors:
            for mine in self.__class__.map:
                if mine.r == r and mine.c == c and mine.n !=9 :
                    mine.clicked(None)#自身点击实现自动打开
     

4. 类与类的继承

本次设计的扫雷游戏,主要是用到按钮的点击,然后通过按钮判断自身的情况,去影响整个map.
#一个Sweep类继承tkinter.Button
class Sweep(tkinter.Button):
    map = []   #地图
    w,h,mine,bgs,images #地图大小背景图片地雷个数等等一些共有参数
    #创建地图公共函数
    def create_map(w=w,h=h,mine=mine,x0=x0,y0=x0,
                   mine_size=mine_size,fgs=fgs,bgs=bgs,images=images):
    def init_map(root) :
    def reset_map():    
	
	#实例化函数
    def __init__(self, master=None, cnf={}, **kw):
    	#初始化,定义按钮方块一些大小状态变量等等,并把自身加入到map
    def clicked(self, event):
    	#点击打开方块
    def right_clicked(self, event):
    	#右键标记方块
    def setPos(self,r,c,n):
    	#设置方块在map的位置和数字
    def map_mine(self):  
    	#如果方块是雷,则映射周围数字          
    def update_style(self) :
    	#根据方块状态显示样式
    def auto_sweep(self):
    	#如果方块数字为零就会被调用
    
    #游戏结束和胜利
    def gameover(self) :
    def vectory(self) :

5. 背景图片显示与控件显示样式

update_style实现了根据方块的自身状态去显示不同的样式,其中images是保存在公共类的一个背景图片的路径,分别是’area.png’,‘opened.png’,‘flag.png’,‘doubt.png’,‘boom.png’,‘sweeped.png’,‘mistake.png’,表示方块的未打开,被打开,标准,疑问,爆炸,扫除,标记错误六种状态的图片路径,pic是加载了images图片对象列表,get_image是通过路径加载图片返回图片对象,如果图片路径不存在,则是None不显示背景图片。
fgs为0~8的数字字体颜色,bgs为默认的背景颜色(背景图片不存在情况下)

#通过路径获取图片
def get_image(filename, w=None, h=None):
    try:
        im = tkinter.PhotoImage(file=filename)
        if w != None and h !=None :
            im = im.subsample(im.width() // w, im.height() // h)
        return im
    except:
        return None
        
....

	#根据按钮自身的不同状态去显示按钮的样式
def update_style(self) :
    
        text=str("")
        if self.n !=0 and self.n != 9 and self.state == 1:  text=str(self.n)

        hex_fg = '#{:02x}{:02x}{:02x}'.format( self.__class__.fgs[self.n][0]
                                                 , self.__class__.fgs[self.n][1],
                                                 self.__class__.fgs[self.n][2])

        hex_bg = '#{:02x}{:02x}{:02x}'.format( self.__class__.bgs[self.state][0]
                                                 , self.__class__.bgs[self.state][1],
                                                 self.__class__.bgs[self.state][2])

        image = self.__class__.pic[self.state]
        self.image = image
        
        if self.state == 2 : 
            text = str("!")
            hex_fg = "red"
        elif self.state == 3 : 
            text = str("?")
            hex_fg = str("yellow")
        elif self.state == 6 : 
            text = str("×")
            hex_fg = str("red")
            
        if image != None :
            hex_bg = None
        
  self.configure(bg=hex_bg,fg=hex_fg,image=image,text=text,compound=tkinter.CENTER)

compound=tkinter.CENTER这个是必须的配置的,否则背景就会挡住字体
self.image = image 应该的,先把image赋值给自身的image,否则背景配置无法显示。

有背景图片情况下
python简易扫雷代码,python,python,开发语言,游戏程序

无背景图片情况下默认的背景颜色

python简易扫雷代码,python,python,开发语言,游戏程序

修改一些有趣的图片

通过修改boom.png显示一个猪头,图片需要是一个长宽一样的,否则显示会有点问题。
python简易扫雷代码,python,python,开发语言,游戏程序

6. 自定义按钮

通过自己自定义类继承按钮类重构了新的按钮,看以上代码

7. 完整代码

import tkinter
import tkinter.messagebox
import random


#通过路径获取图片
def get_image(filename, w=None, h=None):
    try:
        im = tkinter.PhotoImage(file=filename)
        if w != None and h !=None :
            im = im.subsample(im.width() // w, im.height() // h)
        return im
    except:
        return None


class Sweep(tkinter.Button):
    
    map = []   #地图
    w = 7      #地图宽度  
    h = 8      #地图高度
    mine = 5   #地雷个数
    x0 = 30    #地图相对于主窗口的起点
    y0 = 50
    count = 0  #扫除计数
    state = 0  #0play 1vectroy 2over 游戏状态
    mine_size = 40 #地图方块大小
    #数字0~9的字体颜色rgb
    fgs = [(255, 255,255),(9, 147, 62),(0, 187, 187),(240, 78, 0),(166, 19, 188)
           ,(185, 122, 87),(136, 0, 21),(163, 73, 164),(0, 0, 0),(0,0,0)]
    #方块状态颜色与背景图片
    bgs = [(128,128,128),(255,255,255),(0,255,0),(255,0,0),(255,200,0),(0,255,0),(163,73,164)]
    images = ['area.png','opened.png','flag.png','doubt.png','boom.png','sweeped.png','mistake.png']
    pic = []

    
    #创建地图
    def create_map(w=w,h=h,mine=mine,x0=x0,y0=x0,
                   mine_size=mine_size,fgs=fgs,bgs=bgs,images=images):
        Sweep.w = w
        Sweep.h = h
        Sweep.mine = mine
        Sweep.x0 = x0
        Sweep.y0 = y0
        Sweep.mine_size= mine_size
        Sweep.fgs = fgs
        Sweep.bgs = bgs
        Sweep.images=images
        Sweep.state = 0
        Sweep.count = 0

        #加载背景图片
        if not Sweep.pic :
            for filename in Sweep.images :
                image = get_image(filename,Sweep.mine_size,Sweep.mine_size)
                Sweep.pic.append(image)
        
    def init_map(root) :
        
        size_str='{}x{}+400+80'.format(Sweep.w*Sweep.mine_size+80,Sweep.h*Sweep.mine_size+100)
        root.geometry(size_str)

        Sweep.state = 0
        Sweep.count = 0
        
        for button in Sweep.map :
            button.destroy()
        Sweep.map.clear()
        root.update()
        
        random_numbers = random.sample(range(0, Sweep.w*Sweep.h), Sweep.mine)

        for i in range(Sweep.w*Sweep.h) :
            r = i // Sweep.w
            c = i % Sweep.w
            n =  9 if i in random_numbers else 0
            button = Sweep(root)
            button.place(x = c*Sweep.mine_size+Sweep.x0,y = r*Sweep.mine_size+Sweep.y0
                         ,width = Sweep.mine_size,height = Sweep.mine_size)
            button.setPos(r=r,c=c,n=n)
    
        for mine in Sweep.map :
            mine.map_mine()   

        root.update()
        Sweep.reset_map()

    def reset_map():

        Sweep.state = 0
        for mine in Sweep.map:
            mine.state = 0
            mine.update_style()
              
    
    def __init__(self, master=None, cnf={}, **kw):
        
        super().__init__(master, cnf, **kw)
        
        self.text = self['text']
        self.command = self['command']
        self.bind('<Button-1>', self.clicked)
        self.bind('<Button-3>', self.right_clicked)
        self.r=0
        self.c=0
        self.n=0
        self.state=0 #0没有被打开 1已经被打开 2被标志 3被质疑 4打开是雷被爆炸 5被扫除 6标志错误

        self.update_style()
        self.__class__.map.append(self)
        
        

    def clicked(self, event):

        if self.__class__.state != 0 :
                #tkinter.messagebox.showinfo(title="游戏结束!",message = "游戏已经结束,请重新开始")
                return
        if self.state == 1: return
            
        if self.n == 9 :
            self.gameover()
            return

        if self.n == 0 :
            self.auto_sweep()
            self.vectory()
            return

        self.__class__.count += 1
        self.state = 1
        self.update_style()
        
        self.vectory()
        
    def right_clicked(self, event):

        if self.state == 1 : return
        if self.state == 0 : self.state=2 
        elif self.state == 2 : self.state=3
        elif self.state == 3 : self.state=0
        self.update_style()
        
    def setPos(self,r,c,n):
         self.r=r
         self.c=c
         self.n=n
        
    def map_mine(self):

        if self.n != 9 :
            return
            
        neighbors = [(self.r+i, self.c+j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
        for r, c in neighbors:
            for mine in self.__class__.map:
                if mine.r == r and mine.c == c and mine.n != 9:
                    mine.n += 1
                    
    def update_style(self) :
    
        text=str("")
        if self.n !=0 and self.n != 9 and self.state == 1:  text=str(self.n)

        hex_fg = '#{:02x}{:02x}{:02x}'.format( self.__class__.fgs[self.n][0]
                                                 , self.__class__.fgs[self.n][1],
                                                 self.__class__.fgs[self.n][2])

        hex_bg = '#{:02x}{:02x}{:02x}'.format( self.__class__.bgs[self.state][0]
                                                 , self.__class__.bgs[self.state][1],
                                                 self.__class__.bgs[self.state][2])

        image = self.__class__.pic[self.state]
        self.image = image
        
        if self.state == 2 : 
            text = str("!")
            hex_fg = "red"
        elif self.state == 3 : 
            text = str("?")
            hex_fg = str("yellow")
        elif self.state == 6 : 
            text = str("×")
            hex_fg = str("red")
            
        if image != None :
            hex_bg = None
        
        self.configure(bg=hex_bg,fg=hex_fg,image=image,text=text,compound=tkinter.CENTER)
                
    def auto_sweep(self):

        if self.state == 1 : return

        self.state = 1
        self.update_style()
        self.__class__.count += 1
        
        if self.n != 0 :
            return    
            
        neighbors = [(self.r+i, self.c+j) for i in range(-1, 2) for j in range(-1, 2) if i != 0 or j != 0]
        for r, c in neighbors:
            for mine in self.__class__.map:
                if mine.r == r and mine.c == c and mine.n !=9 :
                    mine.clicked(None)
     
    def gameover(self) :
        
        self.state = 4
        self.__class__.state = 2
        
        for mine in self.__class__.map :
            if mine.n == 9 and mine.state != 2:
                mine.state = 4
                mine.update_style()
            elif mine.n != 9 and mine.state == 2:
                mine.state = 6
                mine.update_style()
                 
            
        
        tkinter.messagebox.showinfo(parent = self,title = "游戏结束!",message = "失败!")
        

    def vectory(self) :
        if self.__class__.count == (self.__class__.h*self.__class__.w - self.__class__.mine) :
            if self.__class__.state != 1 :
                tkinter.messagebox.showinfo("游戏结束!","恭喜过关!!!")
                self.__class__.state = 1

root=tkinter.Tk()

def del_menu(args):

    if args == "入门":
        Sweep.create_map(w=6,h=5,mine=1)
    elif args == "简单":
        Sweep.create_map(w=10,h=10,mine=15)
    elif args == "一般":
        Sweep.create_map(w=16,h=16,mine=40)
    elif args == "困难":
       Sweep.create_map(w=20,h=16,mine=60)
    elif args == "重新开始":
        pass
    Sweep.init_map(root)

    
 
if __name__ == '__main__':

    
    root.title('扫雷')
    Sweep.create_map(w=6,h=5,mine=3)
    Sweep.init_map(root)

    menu_bar = tkinter.Menu(root)
    root.config(menu=menu_bar)

    game_menu = tkinter.Menu(menu_bar,tearoff=False)
    menu_bar.add_cascade(label="游戏",menu=game_menu)

    game_menu.add_command(label="入门",command=lambda: del_menu("入门"))
    game_menu.add_command(label="简单",command=lambda: del_menu("简单"))
    game_menu.add_command(label="一般",command=lambda: del_menu("一般"))
    game_menu.add_command(label="困难",command=lambda: del_menu("困难"))
    game_menu.add_command(label="重新开始",command=lambda: del_menu("重新开始"))

    #root.iconbitmap('mine.ico')
    root.mainloop()

一些图片资源:

python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序
python简易扫雷代码,python,python,开发语言,游戏程序文章来源地址https://www.toymoban.com/news/detail-772666.html

到了这里,关于python版扫雷(基于tkinter),教你学python的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言两百行代码实现简易扫雷

    扫雷应该是我们接触到的第一个电脑游戏,用c语言实现扫雷对初学者来说是一个不错的锻炼 编写扫雷只需要用到数组、函数和生成随机数的知识,所以比较适合成为编程学习者编写的第一个小游戏。 如果不熟悉生成随机数的知识,可以去我的上一篇文章看看《C生成随机数》

    2024年02月05日
    浏览(37)
  • 大聪明教你学Java | 深入浅出聊 ConcurrentHashMap

    🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~ 在 Java 的集合框架中,HashMap 是一种非常常用的数据结构,它提供了键值对形式的存储和访问方式。然

    2024年02月10日
    浏览(29)
  • 手把手教你学AltiumDesigner之新建元件封装库

    学好软件,请多加练习!!! 学好软件,请多加练习!!! 学好软件,请多加练习!!! 距离上一次更新已经过去了很久很久,其实这段时间不是没有时间更新,只是笔者思想比较混乱,很少来这里,就没有按时更新,真的很抱歉。2023年新年到来之际,就查资料么,又回到

    2023年04月08日
    浏览(29)
  • python 基于tkinter商品销售系统

    苹果手机商店信息管理系统 在信息时代的今天,计算机以其快速,准确的处理功能渗透在我们周围的方方面面,同时随着网络技术和软件技术的飞速发展,当今社会也正快速向信息化时代前进,信息系统的作用也越来越大,商业经营管理也日渐体现出运用计算机的优越性。商

    2023年04月09日
    浏览(61)
  • 排好队,一个一个来:宫本武藏教你学队列(附各种队列源码)

    哈喽!欢迎来到黑洞晓威的博客! 上一次我们在这里聊了一下队列,现在,让我们再次翻开这个话题,继续探讨一下这个有趣的数据结构吧! 虽然队列看起来比较普通,但是它在实际应用中却 有着不可替代的作用。所以,无论是计算机系统中的任务调度,还是网络数据包的

    2023年04月09日
    浏览(19)
  • python基于Tkinter实现学生信息管理系统

    1.添加学生成绩:管理员可以在系统中添加学生的成绩信息,包括学生姓名、学号、课程名称、成绩等。 2.删除学生成绩:管理员可以根据学生的学号或者姓名删除学生的成绩信息。 3.修改学生成绩:管理员可以修改学生的成绩信息,包括学生姓名、学号、课程名称、成绩等

    2024年02月08日
    浏览(61)
  • 如何运用yolov5训练自己的数据(手把手教你学yolo)

    在这篇博文中,我们对YOLOv5模型进行微调,用于自定义目标检测的训练和推理。 深度学习领域在2012年开始快速发展。在那个时候,这个领域还比较独特,编写深度学习程序和软件的人要么是深度学习实践者,要么是在该领域有丰富经验的研究人员,或者是具备优秀编码技能

    2024年02月07日
    浏览(69)
  • 基于Python+Tkinter GUI 的模式识别水果分类小程序

      采用Python语言编写,并结合Tkinter GUI工具制作交互式小程序开发,实现了简单的水果的边缘提取和分类。如图1-A,用户可以自定义选择路径并输出,同时可以在对话框中输入/输出结果,如图1-B。 A 界面展示 B 交互展示   图1 Tkinter GUI 展示 本次课程实践一整体设计分为三个部

    2024年02月09日
    浏览(45)
  • python基于opencv和tkinter实现人脸识别【内附完整代码】

    人脸识别技术已经在许多领域得到了广泛应用,例如安防、金融、医疗等等。人脸识别可以帮助我们识别和验证一个人的身份,这是一项非常重要的任务。本篇博客将介绍如何使用Python和OpenCV库进行人脸识别。我们将学习如何使用OpenCV中的人脸检测器检测图像中的人脸,如何

    2023年04月14日
    浏览(29)
  • 《手把手教你学嵌入式无人机》——入门航模遥控器使用(MC6C)

    一、 MC6C入门航模遥控器简介     六通道MC6C迈克遥控器是普遍使用的一款入门航模遥控器,价格较为低廉,同时性能比较稳定,性价比较高。 遥控器与接收机 1.基本参数: 遥控器: 遥控范围:大于800米 供电电源:4节普通5号电池 接收机: 尺寸:45*45*10(mm) 重量:9.6克 电

    2024年02月02日
    浏览(283)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包