python游戏开发库pygame。pygame实现贪吃蛇2 , 游戏结束界面与开始界面 电脑版发表于:2022/7/27 17:29 **封装那个画格子的方法,为什么没有影响到全局变量** 是我理解错了,这个方法里边访问的行列,地图高宽这些是访问哇,又不是改变,访问是可以访问的,但是改变后,外面的变量是不变的,只是在方法里边起作用,除非使用global申请一下。注意区分,是访问,还是修改。 ``` def drawRect(point,color): ## 格子的高度 = 地图的高度/行数 boxheight = height/row ## 格子的宽度 = 地图的高度/列数 boxwidth = width/col ## 距离左边的位置=列宽*所在列 box_head_left = point.col*boxwidth ## 距离上边的位置=行高*所在行 box_head_top = point.row * boxheight ## 根据定义的行列位置画出来格子所在的位置 pygame.draw.rect(screen,color,(box_head_left,box_head_top,boxwidth,boxheight)) ``` ### 十:游戏开始界面制作 直接来就开始游戏,没有一个简单的界面不太好哇。我们来做一个简单的开始界面。类似这样 ![](https://img.tnblog.net/arcimg/aojiancc2/55626a1a0cc944d385b2b767d1753a55.png) 其实就是一个图片和一点文字而已 -。- 吐槽一下,图片资料太难找了。 **先封装一个绘制文字的方法,要重复使用。** ``` def drawText(_text,_fontsize,_textColor,_position): myfont = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',_fontsize) # 如果不要字体第一个参数设置为null即可,系统里边的字体默认都在C:/Windows/Fonts下面 ##myfont=pygame.font.Font(None,_fontsize) text=myfont.render(_text,True,_textColor) #获得显示对象的rect区域坐标 textRect =text.get_rect() # 设置显示对象居中 textRect.center = _position # 将准备好的文本信息,绘制到主屏幕 Screen 上。 screen.blit(text,textRect) ``` **然后封装开始游戏的方法** 里边也要写一个死循环监听按键 ``` ## 开始游戏 def beginGameShow(): image_surface = pygame.image.load('img/3.jpg').convert() image_new = pygame.transform.scale(image_surface,(800,600)) # 将图像放置在主屏幕上 screen.blit(image_new,(0,0)) drawText("贪吃蛇大作战",60,(0,0,0),(400,110)) drawText("F1开始! F2退出!",20,(0,0,0),(390,510)) pygame.display.flip() isRuning = True while isRuning: ## 直接放一张背景图,或者放一个背景图,打印一些字即可。还有简单的动画 clock.tick(13) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() ## 监听按键事件 if event.type == pygame.KEYDOWN: print(event) ## 按下了f1 if event.key == 1073741882: isRuning=False ## 按下了f2 if event.key == 1073741883: sys.exit() ``` ### 十一:游戏结束后,展示游戏界面,重新开始游戏 ``` ## 游戏初始化 def gameInit(): global headPoint global snakeBody headPoint = Point(int(row/2),int(col/2)) snakeBody = [ Point(row=headPoint.row,col=headPoint.col+1), Point(row=headPoint.row,col=headPoint.col+2), Point(row=headPoint.row,col=headPoint.col+3), Point(row=headPoint.row,col=headPoint.col+4), Point(row=headPoint.row,col=headPoint.col+5) ] print("重新开始游戏了------------") ``` ### 十二:重新开始游戏,一直提示撞自己死了的情况分析 明明已经初始化了,看输出,居然蛇头位置也改变了,蛇身也改变了....,为什么呢,没有去移动蛇头哇,蛇头的移动在下面哇。只有 ![](https://img.tnblog.net/arcimg/aojiancc2/61c2d5cd895c4d5b9a6be656d78e5e0d.png) 难道是游戏结束写到了这个下面了,所以不行,但是蛇头位置也不应该会变化呢...,最多只是蛇尾少了而已。 ![](https://img.tnblog.net/arcimg/aojiancc2/d91a3ee4122e415c9c6c79108352a29f.png) 测试了一下,输出感觉没有问题。是不是因为方向哦...初始化后,如果蛇头方向右不是蛇头就跑到身体里边去了么,感觉就是这个问题。但是判断游戏结束是在运动前面一步的哇....不对..第一次判断虽然通过了,但是趋势是向右的,所以会撞自己死掉。果然如此,一来就按右,就会挂掉,然后F1开始就会一直挂。 所以要初始化方向,不能让死了的时候是什么方向,重新开始就是什么方向。<font color=red>而且还要注意使用全局变量哇</font>只是这样还是不行的哦。看颜色都看得出来是灰色的。 ![](https://img.tnblog.net/arcimg/aojiancc2/8b88e87b08394be69a36d146470ccbd3.png) 所以现在重新开始的方法变成了 ``` ## 游戏初始化 def gameInit(): global headPoint global snakeBody global snakeDirect headPoint = Point(int(row/2),int(col/2)) snakeBody = [ Point(row=headPoint.row,col=headPoint.col+1), Point(row=headPoint.row,col=headPoint.col+2), Point(row=headPoint.row,col=headPoint.col+3), Point(row=headPoint.row,col=headPoint.col+4), Point(row=headPoint.row,col=headPoint.col+5) ] ## 注意要初始化方向 snakeDirect = "left" print("重新开始游戏了------------") ## 做一下数据测试 # print(headPoint.col,headPoint.row) # for item in snakeBody: # print(item.col,item.row) ```