摸鱼宝典(一)——贪吃蛇游戏改版:贪吃龙 · 双龙戏珠小游戏(Python)

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 摸鱼宝典(一)——贪吃蛇游戏改版:贪吃龙 · 双龙戏珠小游戏(Python)

      啊哈哈哈,最近闲来无事,随手写了个小游戏,在学习的时候摸鱼和划水那是必备啊!还等什么?快来体验这款独特的改版贪吃蛇 ——《贪吃龙 · 双龙戏珠》小游戏吧!

【Tip:源码下载链接在文章最下面】

【游戏效果】

游戏是贪吃蛇的改游戏开始时有两条“龙”,一条绿龙,一条黄龙,分别用 AWSD 和 JIKL 控制上下左右,按空格键开始游戏,每吃掉一个食物,吃掉食物的那条龙长度加一,总分加10,任意一条龙撞墙都会si 。

【教程环节】

【完整源码在后面,可以直接参考】 版,主要思路

两个类,一个是蛇类Snake,另一个是主类Main,实例化一个Snake类就可以添加一条蛇,我们的目标是两条蛇(毕竟咱也只有两只手),Main类的设定完全只是方便于写代码,让代码很清晰。Snake类有四个方法,move方法用于移动,update方法用于更新,eat方法用于判断是否吃掉食物,dead方法用于判断是否撞墙si亡;Main类有三个方法,start方法用于启动游戏的一些功能,fresh方法用于更新画面,move方法用于接收键盘的消息并传给Snake类的实例化的move方法。


步骤一:引入模块

1. from tkinter import *# 引入界面化编程模块
2. from random import *# 引入随机数模块

引入两个模块,一个是tkinter模块,用于界面化编程,一个是random模块,用于随机产生贪吃蛇的食物。

步骤二:设置全局变量

Food,Score,Life = [None,None],0,1# 设置初始食物位置、初始分数、是否存活(1==True 0==False)

一个是食物的位置列表,还有一个是分数,最后是生命,设置为全局变量是为了方便后面的代码对其进行修改。

步骤三:Main主类初始化

class Main:
    '''
    ### 主类
    ---
    类似于C语言中main函数
    用类实现只是为了方便,在这个程序中没其他作用
    '''
    def __init__(self):
        '''
        界面的初始化
        '''
        self.game = Tk()# 初始化界面
        self.game.title('贪吃龙!')# 界面标题
        self.game.geometry('600x600+300+50') #界面大小及位置(600×600像素,偏移屏幕左上角横向300像素,纵向50像素)
        self.game.resizable(0,0)# 窗口横向、纵向大小是否可以拉伸(0==False 1==True)
        self.canvas = Canvas(self.game,bg='black',highlightthickness=0)# 初始化画布控件,背景黑色,高亮边框厚度为0
        self.canvas.place(width=600,height=600)# 画布控件左上角置于(0,0)[默认值] 宽600像素、高600像素
        self.canvas.create_text(300,200,text='贪吃龙·双龙戏珠',font=('华文行楷',30,'bold'),fill='#666666')# 字样1
        self.canvas.create_text(300,300,text='按 AWSD 操控绿龙\n按 JIKL 操控黄龙\n按<空格>键开始游戏',font=('微软雅黑',20,'bold'),fill='#666666',justify='center')# 字样2
        self.score = self.canvas.create_text(300,400,text='0',font=('微软雅黑',30,'bold'),fill='#666666')# 得分字样
        self.s1 = Snake(self.game,self.canvas,4,12,'springgreen')# 实例化第一条 Snake(类)
        self.s2 = Snake(self.game,self.canvas,25,12,'gold')# 实例化第二条 Snake(类) 【有兴趣的可以实例化第N条】
        self.game.bind('<Key-space>',self.start)# 空格键键盘关联 start 方法
        self.game.mainloop()# 消息事件循环

编写 __init__ 方法,设置窗口的基本特征,具体每行代码的作用都写在上面的注释中了。那个 bind 关联的 start 方法在后面会写到。Snake 类也在后面会添加,这里先不具体解释了。

步骤四:编写Main类的start方法、move方法和fresh方法

    def start(self,event:Event):# event 参数没有用到但不能删去,为了与前面形成关联
        '''
        游戏启动
        '''
        self.game.unbind('<Key-space>')# 取消空格键的关联
        self.move()# 键盘关联开始有反应
        self.fresh()# 游戏画面开始更新

按下空格键以执行start方法,为防止后面误按空格键,故取消空格键的关联。

    def move(self):
        '''
        键盘关联
        '''
        self.game.bind('<Key-a>',self.s1.move)# a 按键检测
        self.game.bind('<Key-w>',self.s1.move)# w 按键检测
        self.game.bind('<Key-s>',self.s1.move)# s 按键检测
        self.game.bind('<Key-d>',self.s1.move)# d 按键检测
        self.game.bind('<Key-j>',self.s2.move)# j 按键检测
        self.game.bind('<Key-i>',self.s2.move)# i 按键检测
        self.game.bind('<Key-k>',self.s2.move)# k 按键检测
        self.game.bind('<Key-l>',self.s2.move)# l 按键检测

对于 AWSD 和 JIKL 八个键盘按键,都进行关联并指向Snake类的实例化的move方法。

    def fresh(self):
        '''
        画面更新
        '''
        global Food,Score,Life# 声明为全局变量,方便对它们的修改
        if Food == [None,None]:# 判断界面上是不是没有食物,没有才会刷新食物
            x,y = randint(0,29),randint(0,29)# 随机产生食物的坐标 (x*20,y*20)
            Food = [self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,fill='red',width=0),[x,y]]# 产生食物
        self.s1.update()# 更新 s1 的位置
        self.s2.update()# 更新 s2 的位置
        self.canvas.itemconfigure(self.score,text=str(Score))# 更新分数字样
        if Life:self.game.after(int(100-Score**0.5),self.fresh)# 如果 Life 不为 0(False) 就继续“更新”

界面的像素大小为600×600,以20×20像素的方格为一个单位,建立一个虚拟坐标,其中0≤x≤29,0≤y≤29,最后一行代码会在全局变量Life不为0时执行,自动循环执行fresh方法,间隔时间为int(100-Score**0.5),也就是说,间隔时间会随着分数的提高而减小。


步骤五:Snake蛇类的初始化

class Snake:
    '''
    ### 蛇类 
    ---
    实例化一个就可以实现一个单独的蛇
    Example:
    `s1 = Snake(self.game,self.canvas,4,12,'springgreen')`
    就可以实现一个颜色为'springgreen',头部左上角位置在(4×20,12*20)的“蛇”
    '''
    def __init__(self,tk:Tk,canvas:Canvas,x:int,y:int,color:str):
        self.game = tk
        self.canvas = canvas
        i1 = self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,width=0,fill='purple')# 初始化蛇头
        i2 = self.canvas.create_rectangle(20*x+1,20*(y+1)+1,20*(x+1)-1,20*(y+2)-1,width=0,fill=color)# 初始化蛇身1
        i3 = self.canvas.create_rectangle(20*x+1,20*(y+2)+1,20*(x+1)-1,20*(y+3)-1,width=0,fill=color)# 初始化蛇身2
        i4 = self.canvas.create_rectangle(20*x+1,20*(y+3)+1,20*(x+1)-1,20*(y+4)-1,width=0,fill=color)# 初始化蛇身3
        i5 = self.canvas.create_rectangle(20*x+1,20*(y+4)+1,20*(x+1)-1,20*(y+5)-1,width=0,fill=color)# 初始化蛇身4
        self.snake = [[i1,'w'],[i2,'w'],[i3,'w'],[i4,'w'],[i5,'w']]# 将蛇的数据放入蛇数据列表方便分析
        self.head,self.tail,self.color = [x,y],[x,y+4],color# 记录当前蛇头位置、当前蛇尾位置、蛇身颜色

这里只对蛇的数据列表中单个元素作一下说明,如 [i1,'w'] 中,第一个代表蛇的身体方格,而 ‘w’ 则表示该方格下一次更新的方向,‘w’ 代表向上,‘a’,‘s’ 和 ‘d’ 分别代表向左、向下和向右。

步骤六:Snake类的move方法和update方法

    def move(self,event:Event):
        '''
        移动的区分
        '''
        if event.char in ['a','j']:self.snake[0][1] = 'a'# 按 a 或 j 键向左
        elif event.char in ['w','i']:self.snake[0][1] = 'w'# 按 w 或 i 键向上
        elif event.char in ['s','k']:self.snake[0][1] = 's'# 按 s 或 k 键向下
        elif event.char in ['d','l']:self.snake[0][1] = 'd'# 按 d 或 l 键向右

event.char 代表键盘输入的字符。

    def update(self):
        '''
        更新蛇的位置
        '''
        for k in range(len(self.snake)-1,-1,-1):# 遍历蛇数据列表(必须倒遍历!)
            dx = 0 if self.snake[k][1] in ['w','s'] else 20 if self.snake[k][1] == 'd' else -20# 解析当前蛇身在水平方向应该的位移
            dy = 0 if self.snake[k][1] in ['a','d'] else 20 if self.snake[k][1] == 's' else -20# 解析当前蛇身在垂直方向应该的位移
            self.canvas.move(self.snake[k][0],dx,dy)# 更新当前蛇身位置
            if k:self.snake[k][1] = self.snake[k-1][1]# 更新当前蛇身下次前行的方向(就是更新为前一个的蛇身的方向)
            else:# else的情况只能是 k 为 0,也就是蛇头位置
                hx,hy = self.head# 读取旧蛇头位置
                self.head = [hx+dx//20,hy+dy//20]# 更新蛇头位置数据
            if k == len(self.snake)-1:# 判断是否为蛇尾
                tx,ty = self.tail# 读取旧蛇尾位置
                self.tail = [tx+dx//20,ty+dy//20]# 更新蛇尾位置数据
        self.dead()# 判定是否撞墙死亡
        self.eat()# 判定是否吃掉食物

每次更新的时候,根据Snake类的蛇数据列表 self.snake 中每个小列表的第二项来确定该方格单元应移向哪个方向,更新完方格在界面上的位置之后,还要再次更新该小列表的第二项,将其改为下一次更新的方向,而这个方向就是前一个方格单元的移动方向,因此,该蛇数据列表需要倒着更新。


同时,在更新蛇数据列表的同时还要判断更新循环中当前更新方格是否为蛇头或蛇尾,更新到这两个地方时,要同时更新蛇头位置存储列表 self.head 或者蛇尾位置存储列表 self.tail。蛇头位置存储列表是用于 dead 方法(si亡判定)和 eat 方法(吃掉食物),蛇尾位置存储列表用于 eat 方法为蛇增加长度。


最后,每次更新完后,进行si亡判定(dead方法)和吃掉食物的检测(eat方法)。

步骤七:Snake类的dead方法和eat方法

    def dead(self):
        '''
        检测是否撞墙死亡,实则是坐标位置越界检测
        '''
        global Life# 声明全局变量,方便对其的修改
        x,y = self.head# 蛇头的位置
        if not (0<=x<=29 and 0<=y<=29):# 检测蛇头位置是否越界(超出屏幕)
            Life = 0# Life 设为 0(False) 标识死亡
            self.canvas.create_text(300,250,text='You\nDead',fill='red',font=('华文新魏',100,'bold'),justify='center')# 产生死亡字样

读取蛇头位置,对其是否越出屏幕界限进行检测,若是则设置全局变量 Life 为0,方便于使其他功能终止(如Main类中的fresh方法),同时显示死亡字样。

    def eat(self):
        '''
        检测是否吃掉食物,有点类似于碰撞检测(但又没有碰撞检测那么复杂)
        '''
        global Food,Score# 声明全局变量,方便对其的修改
        if self.head == Food[1]:# 当前蛇头位置与食物位置重合,判定为吃掉食物
            self.canvas.delete(Food[0])# 删去食物的图像
            Food = [None,None]# 设置食物坐标为空,即屏幕中没有食物了
            Score += 10# 得分加10
            x,y = self.tail# 读取当前蛇尾位置,准备给蛇增加长度
            dx = 0 if self.snake[-1][1] in ['w','s'] else 20 if self.snake[-1][1] == 'd' else -20# 判断水平方向上蛇的位移
            dy = 0 if self.snake[-1][1] in ['a','d'] else 20 if self.snake[-1][1] == 's' else -20# 判断垂直方向上蛇的位移
            x -= dx//20;y -= dy//20# 解析新蛇尾应该的实际坐标
            self.tail = [x,y]# 更新蛇尾坐标为新的蛇尾坐标
            self.snake.append([self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,width=0,fill=self.color),self.snake[-1][1]])# 蛇数据列表加上新蛇尾的数据

这里要注意的就是,要先删除 Food 在屏幕上的显示,再清空 Food 位置列表,读取蛇尾位置,解析出新蛇尾下一次更新的方向,然后再蛇数据列表上,增加新蛇尾的数据,最后,不要忘了,更新蛇尾位置列表。

步骤八:实例化Main类,开始游戏

Main()

放在程序代码的最后,程序从这里开始运行!

大家在看完源码后,也可以自己修改源码,弄出三条龙,四条龙,甚至更多哦!

【完整源码】

from tkinter import *# 引入界面化编程模块
from random import *# 引入随机数模块
Food,Score,Life = [None,None],0,1# 设置初始食物位置、初始分数、是否存活(1==True 0==False)
class Snake:
    '''
    ### 蛇类 
    ---
    实例化一个就可以实现一个单独的蛇
    Example:
    `s1 = Snake(self.game,self.canvas,4,12,'springgreen')`
    就可以实现一个颜色为'springgreen',头部左上角位置在(4×20,12*20)的“蛇”
    '''
    def __init__(self,tk:Tk,canvas:Canvas,x:int,y:int,color:str):
        self.game = tk
        self.canvas = canvas
        i1 = self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,width=0,fill='purple')# 初始化蛇头
        i2 = self.canvas.create_rectangle(20*x+1,20*(y+1)+1,20*(x+1)-1,20*(y+2)-1,width=0,fill=color)# 初始化蛇身1
        i3 = self.canvas.create_rectangle(20*x+1,20*(y+2)+1,20*(x+1)-1,20*(y+3)-1,width=0,fill=color)# 初始化蛇身2
        i4 = self.canvas.create_rectangle(20*x+1,20*(y+3)+1,20*(x+1)-1,20*(y+4)-1,width=0,fill=color)# 初始化蛇身3
        i5 = self.canvas.create_rectangle(20*x+1,20*(y+4)+1,20*(x+1)-1,20*(y+5)-1,width=0,fill=color)# 初始化蛇身4
        self.snake = [[i1,'w'],[i2,'w'],[i3,'w'],[i4,'w'],[i5,'w']]# 将蛇的数据放入蛇数据列表方便分析
        self.head,self.tail,self.color = [x,y],[x,y+4],color# 记录当前蛇头位置、当前蛇尾位置、蛇身颜色
    def eat(self):
        '''
        检测是否吃掉食物,有点类似于碰撞检测(但又没有碰撞检测那么复杂)
        '''
        global Food,Score# 声明全局变量,方便对其的修改
        if self.head == Food[1]:# 当前蛇头位置与食物位置重合,判定为吃掉食物
            self.canvas.delete(Food[0])# 删去食物的图像
            Food = [None,None]# 设置食物坐标为空,即屏幕中没有食物了
            Score += 10# 得分加10
            x,y = self.tail# 读取当前蛇尾位置,准备给蛇增加长度
            dx = 0 if self.snake[-1][1] in ['w','s'] else 20 if self.snake[-1][1] == 'd' else -20# 判断水平方向上蛇的位移
            dy = 0 if self.snake[-1][1] in ['a','d'] else 20 if self.snake[-1][1] == 's' else -20# 判断垂直方向上蛇的位移
            x -= dx//20;y -= dy//20# 解析新蛇尾应该的实际坐标
            self.tail = [x,y]# 更新蛇尾坐标为新的蛇尾坐标
            self.snake.append([self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,width=0,fill=self.color),self.snake[-1][1]])# 蛇数据列表加上新蛇尾的数据
    def dead(self):
        '''
        检测是否撞墙死亡,实则是坐标位置越界检测
        '''
        global Life# 声明全局变量,方便对其的修改
        x,y = self.head# 蛇头的位置
        if not (0<=x<=29 and 0<=y<=29):# 检测蛇头位置是否越界(超出屏幕)
            Life = 0# Life 设为 0(False) 标识死亡
            self.canvas.create_text(300,250,text='You\nDead',fill='red',font=('华文新魏',100,'bold'),justify='center')# 产生死亡字样
    def update(self):
        '''
        更新蛇的位置
        '''
        for k in range(len(self.snake)-1,-1,-1):# 遍历蛇数据列表(必须倒遍历!)
            dx = 0 if self.snake[k][1] in ['w','s'] else 20 if self.snake[k][1] == 'd' else -20# 解析当前蛇身在水平方向应该的位移
            dy = 0 if self.snake[k][1] in ['a','d'] else 20 if self.snake[k][1] == 's' else -20# 解析当前蛇身在垂直方向应该的位移
            self.canvas.move(self.snake[k][0],dx,dy)# 更新当前蛇身位置
            if k:self.snake[k][1] = self.snake[k-1][1]# 更新当前蛇身下次前行的方向(就是更新为前一个的蛇身的方向)
            else:# else的情况只能是 k 为 0,也就是蛇头位置
                hx,hy = self.head# 读取旧蛇头位置
                self.head = [hx+dx//20,hy+dy//20]# 更新蛇头位置数据
            if k == len(self.snake)-1:# 判断是否为蛇尾
                tx,ty = self.tail# 读取旧蛇尾位置
                self.tail = [tx+dx//20,ty+dy//20]# 更新蛇尾位置数据
        self.dead()# 判定是否撞墙死亡
        self.eat()# 判定是否吃掉食物
    def move(self,event:Event):
        '''
        移动的区分
        '''
        if event.char in ['a','j']:self.snake[0][1] = 'a'# 按 a 或 j 键向左
        elif event.char in ['w','i']:self.snake[0][1] = 'w'# 按 w 或 i 键向上
        elif event.char in ['s','k']:self.snake[0][1] = 's'# 按 s 或 k 键向下
        elif event.char in ['d','l']:self.snake[0][1] = 'd'# 按 d 或 l 键向右
class Main:
    '''
    ### 主类
    ---
    类似于C语言中main函数
    用类实现只是为了方便,在这个程序中没其他作用
    '''
    def __init__(self):
        '''
        界面的初始化
        '''
        self.game = Tk()# 初始化界面
        self.game.title('贪吃龙!')# 界面标题
        self.game.geometry('600x600+300+50') #界面大小及位置(600×600像素,偏移屏幕左上角横向300像素,纵向50像素)
        self.game.resizable(0,0)# 窗口横向、纵向大小是否可以拉伸(0==False 1==True)
        self.canvas = Canvas(self.game,bg='black',highlightthickness=0)# 初始化画布控件,背景黑色,高亮边框厚度为0
        self.canvas.place(width=600,height=600)# 画布控件左上角置于(0,0)[默认值] 宽600像素、高600像素
        self.canvas.create_text(300,200,text='贪吃龙·双龙戏珠',font=('华文行楷',30,'bold'),fill='#666666')# 字样1
        self.canvas.create_text(300,300,text='按 AWSD 操控绿龙\n按 JIKL 操控黄龙\n按<空格>键开始游戏',font=('微软雅黑',20,'bold'),fill='#666666',justify='center')# 字样2
        self.score = self.canvas.create_text(300,400,text='0',font=('微软雅黑',30,'bold'),fill='#666666')# 得分字样
        self.s1 = Snake(self.game,self.canvas,4,12,'springgreen')# 实例化第一条 Snake(类)
        self.s2 = Snake(self.game,self.canvas,25,12,'gold')# 实例化第二条 Snake(类) 【有兴趣的可以实例化第N条】
        self.game.bind('<Key-space>',self.start)# 空格键键盘关联 start 方法
        self.game.mainloop()# 消息事件循环
    def start(self,event:Event):# event 参数没有用到但不能删去,为了与前面形成关联
        '''
        游戏启动
        '''
        self.game.unbind('<Key-space>')# 取消空格键的关联
        self.move()# 键盘关联开始有反应
        self.fresh()# 游戏画面开始更新
    def fresh(self):
        '''
        画面更新
        '''
        global Food,Score,Life# 声明为全局变量,方便对它们的修改
        if Food == [None,None]:# 判断界面上是不是没有食物,没有才会刷新食物
            x,y = randint(0,29),randint(0,29)# 随机产生食物的坐标 (x*20,y*20)
            Food = [self.canvas.create_rectangle(20*x+1,20*y+1,20*(x+1)-1,20*(y+1)-1,fill='red',width=0),[x,y]]# 产生食物
        self.s1.update()# 更新 s1 的位置
        self.s2.update()# 更新 s2 的位置
        self.canvas.itemconfigure(self.score,text=str(Score))# 更新分数字样
        if Life:self.game.after(int(100-Score**0.5),self.fresh)# 如果 Life 不为 0(False) 就继续“更新”
    def move(self):
        '''
        键盘关联
        '''
        self.game.bind('<Key-a>',self.s1.move)# a 按键检测
        self.game.bind('<Key-w>',self.s1.move)# w 按键检测
        self.game.bind('<Key-s>',self.s1.move)# s 按键检测
        self.game.bind('<Key-d>',self.s1.move)# d 按键检测
        self.game.bind('<Key-j>',self.s2.move)# j 按键检测
        self.game.bind('<Key-i>',self.s2.move)# i 按键检测
        self.game.bind('<Key-k>',self.s2.move)# k 按键检测
        self.game.bind('<Key-l>',self.s2.move)# l 按键检测
Main()# 类似于程序的入口
目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】python之人工智能应用篇--游戏生成技术
游戏生成技术,特别是生成式人工智能(Generative Artificial Intelligence, 简称Generative AI),正逐步革新游戏开发的多个层面,从内容创作到体验设计。这些技术主要利用机器学习、深度学习以及程序化内容生成(Procedural Content Generation, PCG)来自动创造游戏内的各种元素,显著提高了开发效率、丰富了游戏内容并增强了玩家体验。以下是生成式AI在游戏开发中的几个关键应用场景概述
6 2
|
10天前
|
Python
【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】
【python】Python成语接龙游戏[1-3难度均有](源码+数据)【独一无二】
|
13天前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
27 3
|
14天前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
22 1
|
8天前
|
算法 Python
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
|
8天前
|
机器学习/深度学习 存储 算法
【Python】 基于Q-learning 强化学习的贪吃蛇游戏(源码+论文)【独一无二】
【Python】 基于Q-learning 强化学习的贪吃蛇游戏(源码+论文)【独一无二】
|
16天前
|
消息中间件 数据采集 数据挖掘
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【8月更文挑战第3天】在数字化时代,随着软件系统复杂性的提升,Python IPC(进程间通信)技术让多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的管道(Pipe),进程可直接、实时地交换数据,犹如配备对讲机,使数据从采集到预处理、分析及展示各阶段流畅衔接,效率倍增且错误减少。此外,IPC还提供消息队列、共享内存、套接字等机制,适应不同场景需求,使进程间的合作如同团队游戏般精准无误,共同构建高效、健壮的软件系统。
21 0
|
1月前
|
人工智能 Python
python编写跳棋游戏
【7月更文挑战第6天】
27 5
|
1月前
|
UED Python
python编写小游戏
【7月更文挑战第6天】
36 1
|
7天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1