• 售前

  • 售后

热门帖子
入门百科

python实现简单的贪吃蛇游戏

[复制链接]
123457771 显示全部楼层 发表于 2021-10-26 12:17:56 |阅读模式 打印 上一主题 下一主题
本文实例为各人分享了python实现贪吃蛇游戏的具体代码,加入按钮、难度、音乐、得分功能,供各人参考,具体内容如下
贪吃蛇小游戏,可以表现出得分,又背景音乐,难度选择和开始重启按钮设置。

游戏实现效果如下:






反面有完备代码息争析
  1. import sys
  2. import pygame
  3. import random
  4. class Button(object):#定义按钮类
  5. def __init__(self,begin1,begin2,restart1,restart2,position,position2):
  6. self.gamebegin1=pygame.image.load(begin1).convert_alpha()#导入开始和重启按钮图片
  7. self.gamebegin2=pygame.image.load(begin2).convert_alpha()
  8. self.gamerestart1=pygame.image.load(restart1).convert_alpha()
  9. self.gamerestart2=pygame.image.load(restart2).convert_alpha()
  10. self.position=position
  11. self.position2=position2
  12. def ifpress(self):
  13. point_x,point_y=pygame.mouse.get_pos()#找到鼠标光标所在位置
  14. x,y=self.position#指定的点击按钮位置
  15. w,h=self.gamebegin1.get_size()#定义按钮尺寸
  16. x-=w/2
  17. y-=h/2
  18. if_x=x-w/2<point_x<x+w/2#判断鼠标光标是否在按钮上
  19. if_y=y-h/2<point_y<y+h/2
  20. return if_x and if_y
  21. def ispress(self):
  22. x,y=self.position
  23. w,h=self.gamebegin1.get_size()
  24. x-=w/2
  25. y-=h/2
  26. if self.ifpress():#如果鼠标光标在按钮上,图片显示为gamebegin1,否则显示为gamebegin2
  27.   screen.blit(self.gamebegin1,(x-w/2+8,y-h/2+7))  
  28. else:
  29.   screen.blit(self.gamebegin2,(x-w/2,y-h/2))
  30. #定义重启按钮,方法同上
  31. def ifrepress(self):
  32. point_x,point_y=pygame.mouse.get_pos()
  33. x,y=self.position2
  34. w,h=self.gamerestart1.get_size()
  35. x-=w/2
  36. y-=h/2
  37. if_x=x-w/2<point_x<x+w/2
  38. if_y=y-h/2<point_y<y+h/2
  39. return if_x and if_y
  40. def isrepress(self):
  41. x,y=self.position2
  42. w,h=self.gamerestart1.get_size()
  43. x-=w/2
  44. y-=h/2
  45. if self.ifrepress():
  46.   screen.blit(self.gamerestart1,(x-w/2,y-h/2))  
  47. else:
  48.   screen.blit(self.gamerestart2,(x-w/2,y-h/2))
  49.   
  50. def choice():#定义选择难度
  51. screen.fill((0,0,0))#初始界面颜色设置为黑色
  52. Rect1=pygame.Rect(300,300,200,100)#设置按钮尺寸
  53. Rect2=pygame.Rect(300,450,200,100)
  54. pygame.draw.rect(screen,(136,189,186),Rect1)#创建按钮
  55. screen.blit(font.render('grade one:',-1,(255,255,255)),(300,300))
  56. pygame.draw.rect(screen,(136,189,186),Rect2)
  57. screen.blit(font.render('grade two:',-1,(255,255,255)),(300,450))
  58. pygame.display.flip()#显示到屏幕上
  59. point_x,point_y=pygame.mouse.get_pos()#找到鼠标光标所在位置
  60. global a,b#定义全局变量
  61. if 300<point_x<500 and 300<point_y<400:#判断光标是否在按钮上
  62. if pygame.mouse.get_pressed()[0]:#判断鼠标是否按下
  63.   a=8#a表示没秒执行8次
  64.   b=1#b表示设定的一个数,与后面判断执行时有关
  65. if 300<point_x<500 and 450<point_y<550:
  66. if pygame.mouse.get_pressed()[0]:
  67.   a=12
  68.   b=1
  69. pygame.display.update()#更新屏幕
  70. def getResult():#游戏结束时出现得分结果和gameover
  71. final_text1='Game_Over'
  72. final_text2='Your final score is: '+str(score)
  73. ft1_font=pygame.font.SysFont('Arial',70)
  74. ft1_surf=font.render(final_text1,1,(242,3,36))
  75. screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
  76. pygame.display.flip()
  77. def main():
  78. pygame.init()#初始化pygame
  79. clock=pygame.time.Clock()#定义时间
  80. pygame.font.init()#初始化字符
  81. #需要在其它定义中出现的参数,这里还需要定义全局变量一下
  82. global score,screen,font,button,status,x,y,direction,snackhead,snackbody,foodposition,state,a,b
  83. screen=pygame.display.set_mode((640,640))#设置屏幕尺寸
  84. screen.fill((0,0,0))#填充屏幕颜色
  85. #指明图片路径
  86. beginname1='D://picture//gamebegin1.png'
  87. beginname2='D://picture//gamebegin2.png'
  88. restartname1='D://picture//restart1.png'
  89. restartname2='D://picture//restart2.png'
  90. pygame.display.set_caption('sanckgame')
  91. font=pygame.font.SysFont('Arial',40)#定义字符种类和大小
  92. snackhead=[120,120]#定义初始蛇的头部位置
  93. foodposition=[360,360]#定义初始食物位置
  94. snackbody=[[120,120],[100,120],[80,120]]#定义蛇全身位置
  95. score=0
  96. x=300
  97. y=300
  98. state=0
  99. a=1
  100. b=0
  101. food_eat=1#食物被吃为0,否则为1
  102. direction='right'#定义初始运动方向
  103. re_direction=direction#re_direction为变化后的方向
  104. button = Button(beginname1,beginname2,restartname1,restartname2,(330,300),(600,320))#定义按钮数值
  105. pygame.display.update()
  106. while True:
  107.   
  108. for event in pygame.event.get():#遍历可能出现的事件
  109.   if event.type == pygame.QUIT:#点击关闭,程序关闭
  110.   pygame.quit()
  111.   sys.exit()
  112. button.ispress()#显示按钮
  113. pygame.display.update()
  114. if button.ifpress():
  115.   if pygame.mouse.get_pressed()[0]:   
  116.   break #点击按钮,结束这里的循环,进入游戏选择难度界面
  117. while True:
  118. for event in pygame.event.get():
  119.   if event.type == pygame.QUIT:
  120.   pygame.quit()
  121.   sys.exit()
  122. choice()#运行choice()
  123. if b==1:#如果点击了按钮,结束循环,进入游戏运行界面
  124.   break
  125. pygame.mixer.init()#初始化音乐
  126. pygame.mixer.music.load('D://music//Above Everything - Capo Productions.ogg')#导入音乐
  127. pygame.display.update()
  128. status=True
  129. screen=pygame.display.set_mode((640,640))
  130. screen.fill((0,0,0))
  131. while status:
  132. clock.tick(a)#运行速度
  133. for event in pygame.event.get():
  134.   if event.type == pygame.QUIT:
  135.   pygame.quit()
  136.   sys.exit()
  137.   
  138.   elif event.type == pygame.KEYDOWN:#判断键盘事件
  139.   if event.key == pygame.K_RIGHT or event.key == ord('d'):
  140.    re_direction='right'
  141.   if event.key == pygame.K_LEFT or event.key == ord('a'):
  142.    re_direction='left'
  143.   if event.key == pygame.K_UP or event.key == ord('w'):
  144.    re_direction='up'
  145.   if event.key == pygame.K_DOWN or event.key == ord('s'):
  146.    re_direction='down'
  147. #跳出判断事件循环
  148. if re_direction=='right'and not direction =='left':
  149.   direction=re_direction
  150. if re_direction=='left'and not direction =='right':
  151.   direction=re_direction
  152. if re_direction=='up'and not direction =='down':
  153.   direction=re_direction
  154. if re_direction=='down'and not direction =='up':
  155.   direction=re_direction
  156. #头部坐标变化
  157. if direction=='left':
  158.   snackhead[0]-=20
  159. if direction=='right':
  160.   snackhead[0]+=20
  161. if direction=='down':
  162.   snackhead[1]+=20  
  163. if direction=='up':
  164.   snackhead[1]-=20
  165. snackbody.insert(0,list(snackhead))#每移动一次,把头部新位置插入到最前面,形成新的头部
  166. if snackhead[0]==foodposition[0] and snackhead[1]==foodposition[1]:#判断蛇是否吃到了食物
  167.   food_eat=0
  168.   score+=1
  169.   pygame.display.update()
  170. else:
  171.   snackbody.pop()#没吃到则将位置变化前的尾部剔除出去,设的长度不变
  172. pygame.display.update()
  173. if food_eat==0:#迟到食物后生成新的食物
  174.   x=random.randint(1,31)
  175.   y=random.randint(1,31)
  176.   for position in snackbody:#判断食物是否出现在蛇的身体处,出现则重新生成
  177.   if not x == position[0] and not y == position[1]:
  178.    state=1
  179.   else:
  180.    state=0
  181.   if state ==1:
  182.   foodposition=[int(x*20),int(y*20)]
  183.   food_eat=1
  184.   
  185. screen.fill((0,0,0))
  186. for position in snackbody:#画出蛇的身体和食物
  187.   rect2=pygame.Rect(position[0],position[1],20,20)
  188.   pygame.draw.rect(screen,(166,188,199),rect2)
  189.   rect1=pygame.Rect(foodposition[0],foodposition[1],20,20)
  190.   pygame.draw.rect(screen,(169,111,102),rect1)
  191. screen.blit(font.render('Score:'+str(score),-1,(255,255,255)),(100,50))#显示出得分
  192. pygame.display.update()
  193. #如果蛇撞到墙或自己的身体,则游戏结束
  194. if snackhead[0]<0 or snackhead[0]>620:
  195.   restart()
  196. if snackhead[1]<0 or snackhead[1]>620:
  197.   restart()
  198. for body in snackbody[1:]:
  199.   if body[0]==snackhead[0]and body[1]==snackhead[1]:
  200.   restart()
  201. pygame.display.flip()
  202. pygame.display.update()
  203. if pygame.mixer.music.get_busy()==False:
  204.   pygame.mixer.music.set_volume(0.3)
  205.   pygame.mixer.music.play(-1)#音乐循环
  206. def restart():#重新开始按钮
  207.   
  208. getResult()#显示结果
  209. while True:
  210. for event in pygame.event.get():
  211.   if event.type == pygame.QUIT:
  212.   pygame.quit()
  213.   sys.exit()
  214.   
  215.   button.isrepress()
  216.   pygame.display.update()
  217.   if button.ifrepress():
  218.   pygame.display.update()
  219.   if pygame.mouse.get_pressed()[0]:
  220.    main()
  221. main()
复制代码
按钮图片如下,可以自己画图做,音乐最好用ogg格式的,否则可能出标题。




以上就是本文的全部内容,盼望对各人的学习有所帮助,也盼望各人多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作