如何用Python10分钟绘制贪吃蛇小游戏?
贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩。玩家通过
上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长。随着蛇的身体变长,游戏的难度就会变大。当蛇碰到四周的墙壁,或者碰到自己的身体的某一个部位的时候,游戏就结束了。
我们来看一下用Python编写这款游戏的主要思路。带上娃一起编程既好玩又增长知识。
地图
我们将整个游戏界面看成是由许多个小方块组成的,每个方块代表一个单位。这样一来,游戏界面就由若干个小方块形成一个地图,地图上的每个位置都可以表示为小方块的整数倍,如图1所示。
图1
贪吃蛇的长度也用这个小方块来表示,每次吃到食物,蛇身的长度就会增加一个单位。
程序界面
这是一款完整的游戏,所以我们一共为其设计了3个界面,除了游戏界面以外,还包括游戏开始界面和游戏结束界面。
自定义函数
我们要创建的函数包括:main(主程序)、startGame(游戏开始)、runGame(运行游戏)、drawFood(绘制食物)、drawSnake(绘制贪吃蛇)、drawScore(绘制成绩)、moveSnake(移动贪吃蛇)、isEattingFood(是否吃到食物)、isAlive(判断贪吃蛇是否死掉了)、gameOver(游戏结束)和terminate(终止游戏)。
事件
我们要用到的事件是键盘事件。键盘事件是玩家操控贪吃蛇移动的时候发生的事件。我们会在后面介绍的startGame()函数和gameOver()函数中监听键盘事件,并且根据事件类型,来做相应的处理。
声音
我们会在游戏开始后,调用Sound对象的play()方法,播放的背景音乐。
《Python少儿趣味编程》
扫码查看详情
导入模块
首先,将在程序中用到的模块都导入。我们要使用Pygame的函数,因此需要导入Pygame模块。除此之外,我们还会用到sys模块和random模块。sys模块负责程序与Python解释器的交互,用于操控Python运行时的环境,程序要使用sys模块的exit()函数来退出游戏。random模块用于生成随机数。导入这3个模块的语句如下所示:
1import pygame2import random3import sys
初始化设置
为了进行游戏启动和运行前的准备工作,程序需要做一些初始化设置工作,包括定义程序要用到的颜色、方向变量,确定游戏窗口和地图的大小,定义游戏需要用到的一些其他变量等。先来看看这部分初始化代码。
定义颜色变量
游戏中要用到的颜色主要包括如下几种。
1WHITE = (255, 255, 255)2GREEN = (0, 255, 0)3DARKGREEN = (0, 185, 0)4YELLOW = (255,255,0)
定义方向变量
为了能够让玩家能够操控贪吃蛇的方向,我们在程序中定义了4个方向变量,分别和玩家操控贪吃蛇移动的上下左右相对应。
1UP = 12DOWN = 23LEFT = 34RIGHT = 4
定义窗口大小
我们要为贪吃蛇游戏定义一个窗口,让贪吃蛇在这个窗口中移动。我们通过两个变量来定义窗口的宽和高,这是一个宽800像素、高600像素的矩形窗口。
1windowsWidth = 8002windowsHeight = 600
定义地图大小
我们使用变量mapWidth 和mapHeight 来表示地图的宽和高。需要注意的是,地图的宽和高都是基础单位cellSize的整数倍。
1cellSize = 20 #定义基础单位大小 2mapWidth = int(windowsWidth / cellSize) #地图的宽3mapHeight = int(windowsHeight / cellSize) #地图的高
其他变量
程序还会用到如下两个变量:
1HEAD = 0 #贪吃蛇头部下标2snakeSpeed = 7 #贪吃蛇的速度
基础函数
程序最终要以通过函数来定义所要执行的功能,并且通过函数调用来完成和实现这些功能。前面介绍了贪吃蛇这款游戏需要定义的函数,这些函数是游戏程序的核心代码,接下来,我们依次来看看这些函数是如何实现的。
main()函数
main()函数是程序执行的入口。先来看一下main()函数的详细代码。
1def main(): #入口函数,程序从这里开始运行 2 pygame.init() # 模块初始化 3 screen = pygame.display.set_mode((windowsWidth, windowsHeight)) 4 pygame.display.set_caption("贪吃蛇") 5 screen.fill(WHITE) 6 snakeSpeedClock = pygame.time.Clock() 7 8 startGame(screen) #游戏开始 910 while True:11 music=pygame.mixer.Sound("snake.wav")12 music.play(-1)13 runGame(screen, snakeSpeedClock)14 music.stop()15 gameOver(screen) #游戏结束
首先,初始化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对象。我们来看一下该函数的代码。
1def startGame(screen): 2 gameStart = pygame.image.load("gameStart.png") 3 screen.blit(gameStart, (70, 30)) 4 5 font = pygame.font.SysFont("SimHei", 40) 6 tip = font.render("按任意键开始游戏", True, (65, 105, 225)) 7 screen.blit(tip, (240, 550)) 8 9 pygame.display.update()1011 while True: #键盘监听事件12 for event in pygame.event.get(): #关闭窗口13 if event.type == pygame.QUIT: 14 terminate() 15 elif event.type == pygame.KEYDOWN:16 if (event.key == pygame.K_ESCAPE): #按下ESC键17 terminate() 18 else:19 return
首先,调用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()函数的代码如下所示:
1def runGame(screen,snakeSpeedClock): 2 startX = random.randint(3, mapWidth - 8) 3 startY = random.randint(3, mapHeight - 8) 4 snakeCoords = [{"x": startX, "y": startY}, 5 {"x": startX - 1, "y": startY}, 6 {"x": startX - 2, "y": startY}] 7 8 direction = RIGHT 910 food = {"x": random.randint(0, mapWidth - 1), "y": random.randint(0, mapHeight - 1)} 1112 while True:13 for event in pygame.event.get():14 if event.type == pygame.QUIT:15 terminate()16 elif event.type == pygame.KEYDOWN:17 if event.key == pygame.K_LEFT and direction != RIGHT:18 direction = LEFT 19 elif event.key == pygame.K_RIGHT and direction != LEFT:20 direction = RIGHT 21 elif event.key == pygame.K_UP and direction != DOWN:22 direction = UP23 elif event.key == pygame.K_DOWN and direction != UP:24 direction = DOWN 25 elif event.key == pygame.K_ESCAPE:26 terminate()2728 moveSnake(direction, snakeCoords) #移动贪吃蛇2930 isEattingFood(snakeCoords, food) #判断贪吃蛇是否吃到食物3132 ret = isAlive(snakeCoords) #判断贪吃蛇是否还活着33 if not ret:34 break #贪吃蛇已经死了,游戏结束3536 gameRun = pygame.image.load("background.png")37 screen.blit(gameRun, (0, 0))38 drawFood(screen, food)39 drawSnake(screen, snakeCoords)40 drawScore(screen, len(snakeCoords) - 3) 4142 pygame.display.update()43 snakeSpeedClock.tick(snakeSpeed) #控制帧速率
首先使用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()函数的代码如下所示。
1def drawFood(screen, food):2 x = food["x"] * cellSize3 y = food["y"] * cellSize4 pygame.draw.rect(screen, YELLOW, (x, y, cellSize, cellSize))
将字典food的键“x”对应的值乘以变量cellSize的结果赋值给变量x,将字典food的键“y”对应的值乘以变量cellSize的结果赋值给变量y。因为food的坐标是相对于地图上的坐标,而不是真正窗口的坐标,只有在乘以cellSize后才能够得到窗口上对应的像素位置。然后,调用pygame.draw.rect()函数绘制用黄色填充的一个小方块。
drawSnake()函数
drawSnake()函数用来绘制贪吃蛇,它接受的参数是窗口的pygame.Surface对象和表示贪吃蛇的列表。drawSnake()函数的代码如下所示。
1def drawSnake(screen, snakeCoords):2 for coord in snakeCoords:3 x = coord["x"] * cellSize4 y = coord["y"] * cellSize5 pygame.draw.rect(screen, DARKGREEN, (x, y, cellSize, cellSize)) 6 pygame.draw.rect(screen, GREEN,(x + 4, y + 4, cellSize - 8, cellSize - 8))
用一个for循环来遍历snakeCoords列表中所有的元素,把每个元素赋值给变量coord。
在每个循环体中,将字典coord的键“x”对应的值乘以变量cellSize,再把结果赋值给变量x,将字典coord的键“y”对应的值乘以变量cellSize,再把结果赋值给变量y。变量x和y对应的是窗口上的像素位置。然后调用pygame.draw.rect()函数绘制一个用深绿色填充的小方块,再次调用pygame.draw.rect()函数在深绿色方块中绘制一个浅绿色的小方块。一个大方块和一个小方块,一起构成了蛇的一节身体。
drawScore()函数
drawScore()函数用来绘制分数,它接受的参数是窗口的pygame.Surface对象和表示分数的变量。drawScore()函数的代码如下所示。
1def drawScore(screen,score):2 font = pygame.font.SysFont("SimHei", 30)3 scoreSurf = font.render("得分: " + str(scoer), True, WHITE)4 scoreRect = scoreSurf.get_rect()5 scoreRect.topleft = (windowsWidth - 200, 50)6 screen.blit(scoreSurf, scoreRect)
调用pygame.font.SysFont()函数,把字符串"得分:"以及变量score的值绘制到界面上,以抗锯齿方式绘制,文本颜色为白色,将生成的这个Font对象赋值给变量scoreSurf。然后获取scoreSurf的矩形对象并将其赋值给变量scoreRect。指定scoreRect的左上角的坐标为(windowsWidth - 200, 50)。然后,调用blit()函数,把scoreSurf对象复制到screen这个Surface上。
moveSnake()函数
moveSnake()函数用来移动贪吃蛇,它接受的参数是表示方向的变量和表示贪吃蛇的列表。moveSnake()函数会根据方向,来增加一个蛇头的元素到列表中。moveSnake()函数的代码如下所示。
1def moveSnake(direction, snakeCoords): 2 if direction == UP: 3 newHead = {"x": snakeCoords[HEAD][ "x"], "y": snakeCoords[HEAD][ "y"] - 1} 4 elif direction == DOWN: 5 newHead = {"x": snakeCoords[HEAD][ "x"], "y": snakeCoords[HEAD][ "y"] + 1} 6 elif direction == LEFT: 7 newHead = {"x": snakeCoords[HEAD][ "x"] - 1, "y": snakeCoords[HEAD][ "y"]} 8 elif direction == RIGHT: 9 newHead = {"x": snakeCoords[HEAD][ "x"] + 1, "y": snakeCoords[HEAD][ "y"]}1011 snakeCoords.insert(0, newHead)
如果变量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()函数的代码如下所示。
1def isEattingFood(snakeCoords, food): 2 if snakeCoords[HEAD]["x"] == food["x"] and snakeCoords[HEAD]["y"] == food["y"]:3 food["x"] = random.randint(0, mapWidth - 1)4 food["y"] = random.randint(0, mapHeight - 1) 5 else:6 del snakeCoords[-1]
首先判断列表snakeCoords的第一个元素的“x”键和“y”键的值是否等于变量food的“x”键和“y”键的值。变量HEAD等于0。
如果相等,表示蛇头碰到了食物。那么重新设置变量food的“x”键和“y”键的值。请注意,对于列表或字典,在函数内修改参数的内容,会影响到函数之外的对象。
如果不相等,删除snakeCoords列表中最后一个元素。在介绍moveSnake()函数的时候提到过,移动贪吃蛇,其实就是增加一个新的元素。例如,最初是3个元素,向右移动一步,就变成了4个元素。如果这个时候没有吃到食物,那么为了保证元素数量不变,就要删除最后一个元素,这样才能确保snakeCoords列表中的元素数量没有变化,仍然是3个元素。
isAlive()函数
isAive()函数用来判断贪吃蛇是否死亡,它接受的参数是表示贪吃蛇的列表。isAive()函数的代码如下所示。
1def isAlive(snakeCoords):2 tag = True3 if snakeCoords[HEAD]["x"] == -1 or snakeCoords[HEAD]["x"] == mapWidth or snakeCoords[HEAD]["y"] == -1 or snakeCoords[HEAD]["y"] == mapHeight:4 tag = False # 贪吃蛇碰壁5 for snake_body in snakeCoords[1:]:6 if snake_body["x"] == snakeCoords[HEAD]["x"] and snake_body["y"] == snakeCoords[HEAD]["y"]:7 tag = False # 贪吃蛇碰到自己身体8 return tag
首先,将变量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()函数的代码如下所示。
1def gameOver(screen): 2 #加载游戏结束图片 3 screen.fill(WHITE) 4 gameOver = pygame.image.load("gameover.png") 5 screen.blit(gameOver, (0, 0)) 6 #加载游戏结束提示信息 7 font = pygame.font.SysFont("SimHei", 36) 8 tip = font.render("按Q或者ESC退出游戏, 按其他键重新开始游戏", True, (65, 105, 225)) 9 screen.blit(tip, (30, 500))10 #显示Surface对象上的内容11 pygame.display.update()1213 while True: 14 for event in pygame.event.get(): 15 if event.type == pygame.QUIT:16 terminate() 17 elif event.type == pygame.KEYDOWN:18 if event.key == pygame.K_ESCAPE or event.key == pygame.K_q: 19 terminate()20 else:21 return #结束此函数, 重新开始游戏
首先调用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()函数终止程序。我们来看一下该函数的代码。
1def terminate(): 2 pygame.quit()3 sys.exit()
调用pygame.quit()函数,它是和init()相对应的一个函数。在退出程序之前,需要调用它。然后才会退出Pygame。调用sys.exit()函数,退出主程序退。
调用入口函数
最后,我们只要调用入口函数main(),程序就可以开始运行了。
1main()
到这里,我们的贪吃蛇游戏就完成了。这是一个真正意义上的完整游戏,有开始界面和结束界面,有游戏背景,还有背景音乐。尝试着玩一玩,然后再回过头来看看游戏的程序代码,这样会更有助于对代码的理解。
《Python少儿趣味编程》
李强 李若瑜 著
扫码查看详情
编辑推荐
● 少儿编程畅销图书作者精心编写 。
●全彩印刷, 提供代码和素材下载,方便亲子互动和少儿自学 。
Python简单易学,功能强大,是少儿学习编程的首选语言。本书是少儿学习Python编程的趣味指南,全书共17章,按照由简到难、逐步深入的方式组织各章内容。
本书精心选取内容,注重难易适度和趣味性,语言通俗易懂,代码示例丰富。在多章的末尾,还给出了一些练习题并给出了解答。本书适合想要学习Python编程基础的少儿(尤其是10岁以上的孩子)及想要教孩子学习编程的家长阅读,也适合少儿编程培训班的老师用作少儿编程培训的教材。
【END】
扫码加入码书群
码书群,是一个可以为你推荐书籍的交流群,在这里,你可以和不同技术的人进行交流,不知道选择什么样的技术书籍学习,也可在群里咨询哦,学习或者工作压力比较大,也可以在群里聊些轻松的话题,也可以在群里咨询物流信息~