本文主要介绍了如何利用人工智能技术进行波士顿矩阵分析的方法,并通过模拟实例展示了整个过程。
随着企业产品的不断增加,产品分析变得越来越重要,而波士顿矩阵可以帮助我们更好地评估和分析产品。
过去,你可能知道波士顿矩阵很有用,但是却不知道具体怎么做;或者你知道怎么做,但是做起来比较费时费力。
如今,在 AI 技术的加持下,波士顿矩阵分析将变得更加简单、高效,并且将发挥出更加重要的作用。
下面用一个简单的案例,来演示怎么用 AI 进行波士顿矩阵分析。
首先,我们需要准备好待分析的数据。
为了方便演示,下面用 AI 模拟生成一个数据集,提示词如下:
角色:你是一位数据分析专家,主要基于 Anaconda 平台中的 JupyterLab 进行数据分析,能够熟练运用 Python 处理和分析数据,快速制作专业的数据可视化图表。
任务:请你帮我用 Python 随机生成一个数据集,其中包括 12 款产品,产品名称分别用 A-L 表示,销售增长率的取值范围是 -1 到 1,市场占有率的取值范围是 0 到 0.9。
要求:提供完整的 Python 代码,其中产品名称和指标名称都使用中文,应用最新版本的 pandas 库,避免出错警告或错误。
我尝试用了不同的 AI 大模型,发现 GPT-4o 的回复相对比较好,具体代码如下:
import pandas as pd
import random
# 生成产品名称列表
产品名称 = [chr(i) for i in range(ord(‘A’), ord(‘M’))]
# 生成随机数据
数据 = { “产品名称”: 产品名称,
“销售增长率”: [random.uniform(-1, 1) for _ in range(12)],
“市场占有率”: [random.uniform(0, 0.9) for _ in range(12)]
}
# 创建 DataFrame
df = pd.DataFrame(数据)
# 显示数据集
print(df)
在实际工作中,你把 df 可以替换为自己的数据。
其次,我们可以用 AI 生成绘制图表的代码,提示词如下:
请对上面已经准备好的 df 数据 ,使用 matplotlib 绘制散点图,具体绘制要求如下:
要求用中文显示标题和坐标轴标签,请提前做好相关的设置,避免出现中文乱码的情况。
标题波士顿矩阵分析图,标题用 20 号字体,横轴为市场占有率,纵轴为销售增长率。
在散点图中,每个点的上方显示对应的产品名称,用 16 号字体。
在散点图中,增加一条横线,横线的值为销售增长率的平均值,线段样式为黑色虚线。
在散点图中,增加一条竖线,竖线的值为市场占有率的平均值,线段样式为黑色虚线。
上面的横线和竖线把散点分成 4 不同的颜色,透明度为 50%。
散点图中不要显示网格线,不显示图例。
请编写实现上述功能的 Python 代码。
根据 GPT-4o 的回复,略作修改之后代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import random
# 设置中文字体,避免乱码(这里使用 SimHei 字体,需要系统中安装此字体)
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
# 设置随机种子以获得可重复的结果
random.seed(28)
# 生成数据集
产品名称 = [chr(i) for i in range(ord(‘A’), ord(‘M’))]
数据 = {
“产品名称”: 产品名称,
# 计算平均值
平均销售增长率 = df[“销售增长率”].mean
平均市场占有率 = df[“市场占有率”].mean
# 创建散点图
plt.figure(figsize=(10, 6))
plt.scatter(df[“市场占有率”], df[“销售增长率”])
# 添加产品名称标签
for i, row in df.iterrows:
plt.text(row[“市场占有率”], row[“销售增长率”], row[“产品名称”], fontsize=16)
# 添加平均值的横线和竖线
plt.axhline(平均销售增长率, color=’black’, linestyle=’–‘)
plt.axvline(平均市场占有率, color=’black’, linestyle=’–‘)
# 设置标题和坐标轴标签
plt.title(“波士顿矩阵分析图”, fontsize=20)
plt.xlabel(“市场占有率”, fontsize=16)
plt.ylabel(“销售增长率”, fontsize=16)
# 根据四个象限分配颜色
colors = [‘red’, ‘blue’, ‘green’, ‘orange’]
for i, row in df.iterrows:
if row[“销售增长率”] > 平均销售增长率 and row[“市场占有率”] > 平均市场占有率:
color = colors[0]
elif row[“销售增长率”] > 平均销售增长率 and row[“市场占有率”] <= 平均市场占有率:
color = colors[1]
elif row[“销售增长率”] <= 平均销售增长率 and row[“市场占有率”] > 平均市场占有率:
color = colors[2]
else:
color = colors[3]
plt.scatter(row[“市场占有率”], row[“销售增长率”], color=color, alpha=0.5)
# 隐藏网格线
plt.grid(False)
# 显示图表
plt.show
把上面的代码复制粘贴到 JupyterLab 中运行,可以得到下面的图表:
接下来,我们请 AI 进行波士顿矩阵分析:
请分析这些产品在波士顿矩阵中的具体位置和未来发展的策略,并对相关内容进行归纳总结。
你可以根据 AI 回复的内容,结合自己的经验和判断,得出相应的分析结果。例如:按照平均市场占有率和销售增长率,波士顿矩阵把产品分为 4 类,企业可以针对不同类型的产品,采取不同的发展策略。
① 明星产品:高市场占有率,高销售增长率。右上角的 I、J、F,可以继续加大投资,保持市场领先地位,吸引更多的客户和市场份额。
② 问题产品:低市场占有率、高销售增长率。左上角的 C、G,可以评估市场潜力和竞争环境,制定明确的市场策略,尽量增加市场占有率。如果市场前景良好,可以考虑增加投资;否则,需谨慎评估是否继续投入资源。
③ 金牛产品:高市场占有率,低销售增长率。右下角的 D、H、K,努力保持现状,维持现有市场份额,并控制成本,产生现金流以支持其他业务。尽量延长这些产品的生命周期,在不增加大量投资的情况下,保持其稳定的市场地位。
④ 瘦狗产品:低市场占有率,低销售增长率。左下角的 A、B、E、L,建议审慎评估这些产品的市场前景和盈利能力,考虑逐步退出市场,减少资源浪费。如果某些产品还有一定的战略价值,则可以选择保留并进行微调策略。
通过上面的案例分析,我们可以看到,AI 不仅让矩阵分析变得更加简单和高效,而且通过数据可视化,让我们能够更加直观地理解产品在市场中的位置和表现,并指引未来发展的方向。
AI 给我们带来的,不仅是一个工具的升级,更是一次思维的革命。
未来,随着 AI 技术的不断发展,我们可以预见,矩阵分析将会在企业发展过程中发挥出更加重要的作用。它将帮助企业更加精准地调整资源配置,优化产品组合,实现可持续发展。
所以,当你面对复杂的数据和市场分析时,不妨尝试借助 AI 的力量。让我们一起拥抱变化,用科技赋能决策,提升核心竞争力。
本文由人人都是产品经理作者【林骥】,微信公众号:【林骥】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。
题图来自Unsplash,基于 CC0 协议。
贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩。玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长。随着蛇的身体变长,游戏的难度就会变大。当蛇碰到四周的墙壁,或者碰到自己的身体的某一个部位的时候,游戏就结束了。
我们来看一下用Python编写这款游戏的主要思路。带上娃一起编程既好玩又增长知识。
地图
我们将整个游戏界面看成是由许多个小方块组成的,每个方块代表一个单位。这样一来,游戏界面就由若干个小方块形成一个地图,地图上的每个位置都可以表示为小方块的整数倍,如图1所示。
图1
贪吃蛇的长度也用这个小方块来表示,每次吃到食物,蛇身的长度就会增加一个单位。
程序界面
这是一款完整的游戏,所以我们一共为其设计了3个界面,除了游戏界面以外,还包括游戏开始界面和游戏结束界面。
自定义函数
我们要创建的函数包括:main(主程序)、startGame(游戏开始)、runGame(运行游戏)、drawFood(绘制食物)、drawSnake(绘制贪吃蛇)、drawScore(绘制成绩)、moveSnake(移动贪吃蛇)、isEattingFood(是否吃到食物)、isAlive(判断贪吃蛇是否死掉了)、gameOver(游戏结束)和terminate(终止游戏)。
事件
我们要用到的事件是键盘事件。键盘事件是玩家操控贪吃蛇移动的时候发生的事件。我们会在后面介绍的startGame()函数和gameOver()函数中监听键盘事件,并且根据事件类型,来做相应的处理。
声音
我们会在游戏开始后,调用Sound对象的play()方法,播放的背景音乐。
导入模块
首先,将在程序中用到的模块都导入。我们要使用Pygame的函数,因此需要导入Pygame模块。除此之外,我们还会用到sys模块和random模块。sys模块负责程序与Python解释器的交互,用于操控Python运行时的环境,程序要使用sys模块的exit()函数来退出游戏。random模块用于生成随机数。导入这3个模块的语句如下所示:
初始化设置
为了进行游戏启动和运行前的准备工作,程序需要做一些初始化设置工作,包括定义程序要用到的颜色、方向变量,确定游戏窗口和地图的大小,定义游戏需要用到的一些其他变量等。先来看看这部分初始化代码。
定义颜色变量
游戏中要用到的颜色主要包括如下几种。
定义方向变量
为了能够让玩家能够操控贪吃蛇的方向,我们在程序中定义了4个方向变量,分别和玩家操控贪吃蛇移动的上下左右相对应。
定义窗口大小
我们要为贪吃蛇游戏定义一个窗口,让贪吃蛇在这个窗口中移动。我们通过两个变量来定义窗口的宽和高,这是一个宽800像素、高600像素的矩形窗口。
定义地图大小
我们使用变量mapWidth 和mapHeight 来表示地图的宽和高。需要注意的是,地图的宽和高都是基础单位cellSize的整数倍。
其他变量
程序还会用到如下两个变量:
基础函数
程序最终要以通过函数来定义所要执行的功能,并且通过函数调用来完成和实现这些功能。前面介绍了贪吃蛇这款游戏需要定义的函数,这些函数是游戏程序的核心代码,接下来,我们依次来看看这些函数是如何实现的。
main()函数
main()函数是程序执行的入口。先来看一下main()函数的详细代码。
首先,初始化Pygame,调用pygame.init()函数进行模块初始化。然后调用了pygame.display.set_mode()函数,创建了一个宽800像素、高600像素的显示窗口,返回了用于该窗口的pygame.Surface 对象并将其存储在名为screen的变量中。接下来,调用pygame.display.set_caption()函数来设置窗口的标题,这里给游戏窗口起名为“贪吃蛇”。调用screen.fill()函数,将窗口用白色填充。然后创建了一个时钟(Clock)对象,将其赋值给snakeSpeedClock变量,用它来控制帧速率。
然后,调用startGame这个自定义函数,这是负责启动游戏的函数,给它传递的参数是变量screen,后面的小节会详细介绍这个函数。
接下来,为了保持Pygame事件循环一直运行,我们使用while循环,并且循环条件就是布尔值True,这表示循环会一直进行,而退出这个循环的唯一方式是程序终止。在本书前面的示例中,我们通常都会使用一个变量作为循环条件,当程序退出时,修改这个变量来结束循环。这两种做法的效果是相同的,相比之下,这里的用法要更加简单一些。
在循环体中,我们先初始化混合器,然后将一段背景音乐snake.wav加载到一个Sound对象中,并且将其存储到变量music中。接下来调用play()函数播放音乐,参数−1表示会一直循环播放。通过上述代码,我们就为游戏添加了背景音乐。然后调用runGame函数,传递给它的参数是变量screen和snakeSpeedClock,这个函数负责游戏运行,后面的小节还会详细介绍这个函数。当这个函数执行完后,就会调用music.stop()函数来停止背景音乐播放。然后,调用gameOver函数结束游戏,传递给它的参数是变量screen。
startGame()函数
这个函数负责控制我们的程序启动,它接收的参数是窗口的pygame.Surface对象。我们来看一下该函数的代码。
首先,调用image()函数在Pygame窗口中加载“gameStart.png”图片,并创建一个名为gameStart的Surface对象。然后,调用blit()函数,将像素从一个Surface复制到另一个Surface之上。就是把gameStart对象复制到Screen这个Surface上。通过blit()将gameStart复制到指定位置(70, 30)。
然后,调用pygame.font.SysFont函数来创建Font对象,并将其赋值给名为font的变量,这个对象允许我们以40点的SimHei字体绘制到Pygame的Surface上。接下来,在所创建的font对象上使用render()命令,把字符串“按任意键开始游戏”绘制到Surface上。然后,调用blit()函数,将像素从一个Surface复制到另一个Surface之上。screen.blit(tip, (240, 550))负责把tip对象复制到screen这个Surface上的指定位置。
调用pygame.display.update()函数,把绘制到Surface对象上的所有内容都显示到窗口上。
接下来,为了保持Pygame事件循环一直运行,我们使用while循环。在事件循环中,判断事件类型如果是QUIT(关闭窗口),就调用terminate()函数终止程序,我们稍后会介绍terminate()函数。否则,如果事件类型是KEYDOWN,那么事件对象将有一个key属性来识别按下的是哪个键。如果key属性等于K_ESCAPE,表示用户按下的是Esc键,意味着玩家希望结束程序,那么程序的处理方式和点击关闭窗口一样,调用terminate()函数终止程序。否则,表示用户按下的是其他键,退出这个函数,表示游戏开始运行。
当这个函数执行后,会出现如图1所示的游戏界面,这个时候,玩家可以按Esc键关闭程序,如果按其他的任意键则会开始玩游戏。
runGame()函数
这个函数控制着游戏程序运行,它接受的参数是窗口的pygame.Surface对象和Pygame的时钟对象。runGame()函数的代码如下所示:
首先使用random.randint()函数在3到mapWidth−8之间选取一个随机整数赋值给变量startX,在3到mapHeight−8之间选取一个随机整数赋值给变量startY,这两个变量分别表示贪吃蛇初始的x坐标和y坐标。选取随机数的目的是让贪吃蛇出现的位置不是固定的,这样就增加了游戏的不确定性。
然后,用嵌套字典的一个列表来表示贪吃蛇。每个字典表示地图上的一个坐标,{'x': startX, 'y': startY}表示蛇头的位置,{'x': startX - 1, 'y': startY}和{'x': startX - 2, 'y': startY}表示蛇的身体。这是一条水平放置的蛇,蛇头靠右,有两节蛇身。
将direction设置为RIGHT,表示方向向右。RIGHT是我们前面定义过的方向变量。
然后使用random.randint()函数在0到mapWidth−1之间选取一个随机整数作为字典中x键的值,在0到mapHeight−1之间选取一个随机整数作为字典中y键的值,将字典赋值给变量food。用这个变量表示食物的坐标位置。
接下来,为了保持Pygame事件循环一直运行,我们使用while循环。在事件循环中,判断事件类型,如果是QUIT,那么调用terminate()函数终止程序。否则,如果事件类型是KEYDOWN,那么事件对象将有一个key属性来识别按下的是哪个键。
如果key属性等于K_LEFT,表示用户按下的是向左方向键,并且direction != RIGHT,那么将变量direction设置为LEFT,也就是将方向设置为向左。这里,direction != RIGHT的含义是蛇头不向右,因为蛇头向右的话,是没有办法再将方向设置为向左的(因为要避免贪吃蛇直接掉头导致头部和身体相碰撞的情况),只有蛇头向上、向下或向左的时候,我们才可以将蛇头方向设置为向左。
如果key属性等于K_RIGHT,并且direction != LEFT,那么将变量direction设置为RIGHT;如果key属性等于K_UP,并且direction != DOWN,那么将变量direction设置为UP;如果key属性等于K_DOWN,并且direction !=UP,那么将变量direction设置为DOWN。
如果key属性等于K_ESCAPE,表示用户按下的是Esc 键,意味着玩家希望结束程序,那么处理方式和玩家点击关闭窗口是一样的,调用terminate()函数终止程序。
然后,调用moveSnake()函数移动贪吃蛇,该函数的参数是变量direction和snakeCoords,稍后我们还会详细介绍moveSnake()函数。
接下来调用isEattingFood()函数,判断贪吃蛇是否吃到食物,该函数参数是变量snakeCoords和 food,稍后我们还会详细介绍isEattingFood()函数。
然后调用isAlive()函数,判断贪吃蛇是否死亡,该函数的参数是变量snakeCoords,并且将它的返回结果赋值给变量ret,稍后会详细介绍isAlive()函数。判断变量ret是否是True,如果不是,跳出while循环,表示贪吃蛇已经死了,游戏结束。
调用image.load()函数加载游戏背景图片,并创建一个名为gameRun的Surface对象。调用blit()函数,把gameRun对象复制到screen这个Surface上,指定位置是左上角。
然后调用drawFood()函数绘制食物,该函数的参数是变量screen和food,稍后我们还会介绍drawFood()函数。
然后调用drawSnake()函数绘制贪吃蛇,该函数的参数是变量screen和snakeCoords,稍后我们还会详细介绍drawFood()函数。
接下来调用drawScore()函数绘制分数,该函数的参数是变量screen和len(snakeCoords) – 3的结果。len(snakeCoords)表示贪吃蛇的长度。减去3,是因为贪吃蛇最初有一个蛇头和两节身体,也就是snakeCoords初始有3个元素,减去3就是新增的身体部分,也就是相应的得分。
调用pygame.display.update()函数,把绘制到Surface对象上的所有内容,都显示到窗口上。调用时钟对象的tick()方法,表示游戏运行的帧速率是snakeSpeed FPS,即每秒snakeSpeed次。
当runGame()函数执行后,会出现如图3所示的游戏界面。
图3
下面分别介绍一下runGame()函数中用到的其他的自定义函数。
drawFood()函数
drawFood()函数用来绘制食物,它接受的参数是窗口的pygame.Surface对象和表示坐标的字典对象。drawFood()函数的代码如下所示。
将字典food的键“x”对应的值乘以变量cellSize的结果赋值给变量x,将字典food的键“y”对应的值乘以变量cellSize的结果赋值给变量y。因为food的坐标是相对于地图上的坐标,而不是真正窗口的坐标,只有在乘以cellSize后才能够得到窗口上对应的像素位置。然后,调用pygame.draw.rect()函数绘制用黄色填充的一个小方块。
drawSnake()函数
drawSnake()函数用来绘制贪吃蛇,它接受的参数是窗口的pygame.Surface对象和表示贪吃蛇的列表。drawSnake()函数的代码如下所示。
用一个for循环来遍历snakeCoords列表中所有的元素,把每个元素赋值给变量coord。
在每个循环体中,将字典coord的键“x”对应的值乘以变量cellSize,再把结果赋值给变量x,将字典coord的键“y”对应的值乘以变量cellSize,再把结果赋值给变量y。变量x和y对应的是窗口上的像素位置。然后调用pygame.draw.rect()函数绘制一个用深绿色填充的小方块,再次调用pygame.draw.rect()函数在深绿色方块中绘制一个浅绿色的小方块。一个大方块和一个小方块,一起构成了蛇的一节身体。
drawScore()函数
drawScore()函数用来绘制分数,它接受的参数是窗口的pygame.Surface对象和表示分数的变量。drawScore()函数的代码如下所示。
调用pygame.font.SysFont()函数,把字符串"得分:"以及变量score的值绘制到界面上,以抗锯齿方式绘制,文本颜色为白色,将生成的这个Font对象赋值给变量scoreSurf。然后获取scoreSurf的矩形对象并将其赋值给变量scoreRect。指定scoreRect的左上角的坐标为(windowsWidth - 200, 50)。然后,调用blit()函数,把scoreSurf对象复制到screen这个Surface上。
moveSnake()函数
moveSnake()函数用来移动贪吃蛇,它接受的参数是表示方向的变量和表示贪吃蛇的列表。moveSnake()函数会根据方向,来增加一个蛇头的元素到列表中。moveSnake()函数的代码如下所示。
如果变量direction等于UP,表示贪吃蛇的方向是向上,那么创建一个新的蛇头元素,“x”键的值是原来蛇头的“x”键的值不变,“y”键的值是原来蛇头的“y”键的值减去1个单位。
否则,如果变量direction等于DOWN,表示贪吃蛇的方向是向下,那么创建一个新的蛇头元素,“x”键的值是原来蛇头的“x”键的值不变,“y”键的值是原来蛇头的“y”键的值加上1个单位。
否则,如果变量direction等于LEFT,表示贪吃蛇的方向是向左,那么创建一个新的蛇头元素,“x”键的值是原来蛇头的“x”键的值减去1个单位,“y”键的值是原来蛇头的“y”键的值不变。
否则,如果变量direction等于RIGHT,表示贪吃蛇的方向是向右,那么创建一个新的蛇头元素,“x”键的值是原来蛇头的“x”键的值加上1个单位,“y”键的值是原来蛇头的“y”键的值不变。
然后,把这个新创建的字典元素插入到贪吃蛇列表的第一个位置。
isEattingFood()函数
isEattingFood()函数用来判断贪吃蛇是否吃到了食物,它接受的参数是表示贪吃蛇的列表和表示食物位置的变量。isEattingFood()函数的代码如下所示。
首先判断列表snakeCoords的第一个元素的“x”键和“y”键的值是否等于变量food的“x”键和“y”键的值。变量HEAD等于0。
如果相等,表示蛇头碰到了食物。那么重新设置变量food的“x”键和“y”键的值。请注意,对于列表或字典,在函数内修改参数的内容,会影响到函数之外的对象。
如果不相等,删除snakeCoords列表中最后一个元素。在介绍moveSnake()函数的时候提到过,移动贪吃蛇,其实就是增加一个新的元素。例如,最初是3个元素,向右移动一步,就变成了4个元素。如果这个时候没有吃到食物,那么为了保证元素数量不变,就要删除最后一个元素,这样才能确保snakeCoords列表中的元素数量没有变化,仍然是3个元素。
isAlive()函数
isAive()函数用来判断贪吃蛇是否死亡,它接受的参数是表示贪吃蛇的列表。isAive()函数的代码如下所示。
首先,将变量tag设置为True。然后,判断在地图上的蛇头的x坐标是否等于−1,或者蛇头的x坐标是否等于mapWidth,或者蛇头的y坐标是否等于−1,或者蛇头的y坐标是否等于mapHeight,只要满足其中的任何一个条件,就表示蛇头碰到了墙壁,那么就将变量tag设置为False。
然后用一个for循环,来遍历snakeCoords列表中的第2个元素以及之后的元素,把每个元素赋值给变量snake_body,表示蛇的身体。
在循环体内,判断字典snake_body的键“x”和“y”对应的值是否等于snakeCoords列表第一个元素,也就是蛇头的键“x”和“y”对应的值,如果相等,表示蛇头碰到了蛇的身体,那么就将变量tag设置为False。
最后,该函数返回了变量tag。如果tag是True,表示蛇还活着;如果tag是False,表示蛇死掉了。
gameOver()函数
gameOver()函数控制整个程序的结束,它接受的参数是窗口的pygame.Surface对象。gameOver()函数的代码如下所示。
首先调用screen.fill()函数,用白色填充窗口。
然后调用image()函数在Pygame窗口中加载“gameover.png”图片,并创建一个名为gameOver的Surface对象。然后我们调用blit()函数,把gameOver对象复制到screen这个Surface上。通过blit()将gameOver复制到指定左上角位置(0, 0)。
然后调用pygame.font.SysFont函数,把字符串"按Q或者ESC退出游戏,按其他键重新开始游戏"绘制到界面上。然后我们调用blit()函数把tip对象复制到screen这个Surface上。
调用pygame .display.update()函数,把绘制到Surface对象上的所有内容,都显示到窗口上。
接下来,使用while循环监听键盘事件。在事件循环中,判断事件类型,如果是QUIT,那么调用terminate函数终止程序。否则,如果事件类型是KEYDOWN,那么事件对象将有一个key属性来识别按下的是哪个键。如果key属性等于K_ESCAPE或K_q,表示用户按下的是Esc或Q键,意味着玩家希望结束程序,那么处理方式和点击关闭窗口是一样的,调用terminate()函数终止程序。否则,表示用户按下的是其他键,结束这个函数,重新开始游戏。
当这个函数执行后,会出现如图4所示的游戏界面,这个时候,可以按Q键和Esc键结束程序,也可以按任意键重新开始一局游戏。
图4
terminate()函数
terminate()函数终止程序。我们来看一下该函数的代码。
调用pygame.quit()函数,它是和init()相对应的一个函数。在退出程序之前,需要调用它。然后才会退出Pygame。调用sys.exit()函数,退出主程序退。
调用入口函数
最后,我们只要调用入口函数main(),程序就可以开始运行了。
到这里,我们的贪吃蛇游戏就完成了。这是一个真正意义上的完整游戏,有开始界面和结束界面,有游戏背景,还有背景音乐。尝试着玩一玩,然后再回过头来看看游戏的程序代码,这样会更有助于对代码的理解。
《Python少儿趣味编程》
李强 李若瑜 著
编辑推荐
● 少儿编程畅销图书作者精心编写 。
●全彩印刷, 提供代码和素材下载,方便亲子互动和少儿自学 。
Python简单易学,功能强大,是少儿学习编程的首选语言。本书是少儿学习Python编程的趣味指南,全书共17章,按照由简到难、逐步深入的方式组织各章内容。
本书精心选取内容,注重难易适度和趣味性,语言通俗易懂,代码示例丰富。在多章的末尾,还给出了一些练习题并给出了解答。本书适合想要学习Python编程基础的少儿(尤其是10岁以上的孩子)及想要教孩子学习编程的家长阅读,也适合少儿编程培训班的老师用作少儿编程培训的教材。
相关问答
黑体字体SimHei是一种中文字体,是由MicrosoftWindows操作系统自带的一种黑体字体。它的设计基于标准宋体字形,并加入了一些黑体字形的特点,使得它看起来比宋...
simhei是什么字体,simhei是黑体字体。黑体字又称方体或哥特体,没有衬线装饰,字形端正,笔画横平竖直,笔迹全部一样粗细。汉字的黑体是在现代印刷术传入东方后依据...
[最佳回答]字体文件,细黑字体在系统安装中不重要,作用是用文本编辑或文字显示时字体的选择
WPS最粗的字体是"华文行楷"。该字体的笔画粗细非常明显,具有一定的视觉冲击力。它的粗细程度适中,字体笔画浓郁饱满,坚实有力,给人一种稳重、沉稳的感觉。在...
将epub改成内嵌字体,需要用到专业的EPUB编辑器,下面以Sigil为例:1.打开Sigil编辑器,导入需要修改的epub文件。2.打开文件,找到需要更改字体的地方,...
在CAD软件中,有多种字体类型可用于绘制和显示文字。以下是一些常见的CAD字体类型:1.宋体(SimSun):一种常见的中文字体,具有清晰的笔画和较好的可读性。...
我也碰到了这个问题,弄了好半天,发现是缺少黑体字体,系统自带的,在网上下个,或者在别的电脑上拷一个,文件路径是c:/windows/fonts/simhei.ttf有用(0)回复如果...
以下是预算员考试常用的字体:1.宋体:常用的中文宋体字体,适合正式文书和报告的排版。2.黑体:粗体字体,适合突出重点和强调文字。3.微软雅黑:一种...
以黑体为例:p+theme(text=element_text(family="SimHei"))在python中测试通过,R中应该是一样的以黑体为例:p+theme(t...
恐怖黎明是这段时间大热的游戏之一,但是汉化之后游戏内字体变得非常模糊,十分影响观感,今天安下小编就给大家带来恐怖黎明字体替换教程,教大家恐怖...