耀极客论坛

 找回密码
 立即注册
查看: 477|回复: 0

Pygame代码 制作一个贪吃蛇小游戏

[复制链接]

193

主题

176

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2022-5-7 01:40:49 | 显示全部楼层 |阅读模式
  这篇文章主要介绍了100行Pygame代码 制作一个贪吃蛇小游戏,相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了,需要的朋友可以参考一下


用到的 Pygame 函数
  贪吃蛇小游戏用到的函数
功能描述init()初始化 pygamedisplay.set_mode()以元组或列表为参数创建窗口update()更新屏幕quit()用于取消初始化的 pygameset_caption()在屏幕的顶部设置文字event.get()返回所有事件的列表Surface.fill()使用纯色填充屏幕time.Clock()追踪时间font.Font()设置字体
创建屏幕
  我们使用函数 display.set_mode()  来创建 pygame 窗口,同时我们还要在程序的开始和结尾处进行 init()  和 quit()  函数,以保证程序可以正确开始和结束。
  1. import pygame
  2. pygame.init()
  3. dis=pygame.display.set_mode((400,300))
  4. pygame.display.update()
  5. pygame.quit()
  6. quit()
复制代码
  这要我们运行程序,就可以得到如下:

  但是这要的代码,我们的程序创建只会一闪而过,下面我们增加一些代码,来保持住程序窗口
  1. import pygame
  2. pygame.init()
  3. dis=pygame.display.set_mode((400,300))
  4. pygame.display.update()
  5. pygame.display.set_caption('Snake game by Edureka')
  6. game_over=False
  7. while not game_over:
  8.     for event in pygame.event.get():
  9.         print(event)   # 打印出所有事件
  10. pygame.quit()
  11. quit()
复制代码
  我们增加了游戏窗口的名称,同时还可以在 Python 控制台中看到我们在 pygame 窗口上操作时的所有事件

  下面我们来增加关闭响应事件
  1. pygame.init()
  2. dis = pygame.display.set_mode((400, 300))
  3. pygame.display.update()
  4. pygame.display.set_caption('贪吃蛇')
  5. game_over = False
  6. while not game_over:
  7.     for event in pygame.event.get():
  8.         if event.type==pygame.QUIT:
  9.             game_over=True
  10. pygame.quit()
  11. quit()
复制代码
  至此我们的游戏窗口就设置好了,下面就可以来画 snake 了

创建 snake
  我们首先创建一些颜色变量,用来表示 snake,food,screen 等
  1. pygame.init()
  2. dis = pygame.display.set_mode((400, 300))
  3. pygame.display.update()
  4. pygame.display.set_caption('贪吃蛇')
  5. blue=(0,0,255)
  6. red=(255,0,0)
  7. game_over = False
  8. while not game_over:
  9.     for event in pygame.event.get():
  10.         if event.type==pygame.QUIT:
  11.             game_over=True
  12.     pygame.draw.rect(dis, blue, [200, 150, 10, 10])
  13.     pygame.display.update()
  14. pygame.quit()
  15. quit()
复制代码

  这样,一只(条)贪吃蛇就创建完成了,就是那个小蓝点儿

使 snake 动起来
  为了实现 snake 的移动,我们需要用到的关键事件是 KEYDOWN,它包含四个 key 值,K_UP, K_DOWN, K_LEFT, 和 K_RIGHT,分别表示向上、向下、向左和向右
  1. pygame.init()
  2. pygame.display.set_caption('贪吃蛇')
  3. white = (255, 255, 255)
  4. black = (0, 0, 0)
  5. red = (255, 0, 0)
  6. dis = pygame.display.set_mode((800, 600))
  7. game_over = False
  8. x1 = 300
  9. y1 = 300
  10. x1_change = 0
  11. y1_change = 0
  12. clock = pygame.time.Clock()
  13. while not game_over:
  14.     for event in pygame.event.get():
  15.         if event.type == pygame.QUIT:
  16.             game_over = True
  17.         if event.type == pygame.KEYDOWN:
  18.             if event.key == pygame.K_LEFT:
  19.                 x1_change = -10
  20.                 y1_change = 0
  21.             elif event.key == pygame.K_RIGHT:
  22.                 x1_change = 10
  23.                 y1_change = 0
  24.             elif event.key == pygame.K_UP:
  25.                 y1_change = -10
  26.                 x1_change = 0
  27.             elif event.key == pygame.K_DOWN:
  28.                 y1_change = 10
  29.                 x1_change = 0
  30.     x1 += x1_change
  31.     y1 += y1_change
  32.     dis.fill(white)
  33.     pygame.draw.rect(dis, black, [x1, y1, 10, 10])
  34.     pygame.display.update()
  35.     clock.tick(30)
  36. pygame.quit()
  37. quit()
复制代码
  我这里创建了 x1_change 和 y1_change 变量来更新 x 和 y 坐标,使得我们的 snake 可以移动起来

处理 Game Over
  对于贪吃蛇游戏来说,如果 snake 移动出了游戏屏幕,那么游戏就已经失败了,下面我们就来处理这部分逻辑
  1. import pygame
  2. import time
  3. pygame.init()
  4. pygame.display.set_caption('贪吃蛇')
  5. white = (255, 255, 255)
  6. black = (0, 0, 0)
  7. red = (255, 0, 0)
  8. dis_width = 600
  9. dis_height = 400
  10. dis = pygame.display.set_mode((dis_width, dis_width))
  11. game_over = False
  12. x1 = dis_width / 2
  13. y1 = dis_height / 2
  14. snake_block = 10
  15. x1_change = 0
  16. y1_change = 0
  17. clock = pygame.time.Clock()
  18. snake_speed = 30
  19. font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
  20. def message(msg, color):
  21.     mesg = font_style.render(msg, True, color)
  22.     dis.blit(mesg, [dis_width / 2, dis_height / 2])
  23. while not game_over:
  24.     for event in pygame.event.get():
  25.         if event.type == pygame.QUIT:
  26.             game_over = True
  27.         if event.type == pygame.KEYDOWN:
  28.             if event.key == pygame.K_LEFT:
  29.                 x1_change = -snake_block
  30.                 y1_change = 0
  31.             elif event.key == pygame.K_RIGHT:
  32.                 x1_change = snake_block
  33.                 y1_change = 0
  34.             elif event.key == pygame.K_UP:
  35.                 y1_change = -snake_block
  36.                 x1_change = 0
  37.             elif event.key == pygame.K_DOWN:
  38.                 y1_change = snake_block
  39.                 x1_change = 0
  40.     if x1 >= dis_width or x1 ‹ 0 or y1 >= dis_height or y1 ‹ 0:
  41.         game_over = True
  42.     x1 += x1_change
  43.     y1 += y1_change
  44.     dis.fill(white)
  45.     pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
  46.     pygame.display.update()
  47.     clock.tick(snake_speed)
  48. message("你失败了,请重新开始游戏!", red)
  49. pygame.display.update()
  50. time.sleep(2)
  51. pygame.quit()
  52. quit()
复制代码


增加食物
  既然是贪吃蛇,当然要投食了,下面我们就来处理食物
  1. import pygame
  2. import time
  3. import random
  4. pygame.init()
  5. pygame.display.set_caption('贪吃蛇')
  6. white = (255, 255, 255)
  7. black = (0, 0, 0)
  8. red = (255, 0, 0)
  9. blue = (0, 0, 255)
  10. dis_width = 800
  11. dis_height = 600
  12. dis = pygame.display.set_mode((dis_width, dis_height))
  13. clock = pygame.time.Clock()
  14. snake_block = 10
  15. snake_speed = 30
  16. font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
  17. def message(msg, color):
  18.     mesg = font_style.render(msg, True, color)
  19.     dis.blit(mesg, [dis_width / 3, dis_height / 3])
  20. def gameLoop():  # creating a function
  21.     game_over = False
  22.     game_close = False
  23.     x1 = dis_width / 2
  24.     y1 = dis_height / 2
  25.     x1_change = 0
  26.     y1_change = 0
  27.     foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  28.     foody = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  29.     while not game_over:
  30.         while game_close == True:
  31.             dis.fill(white)
  32.             message("你失败了,请重新开始游戏!", red)
  33.             pygame.display.update()
  34.             for event in pygame.event.get():
  35.                 if event.type == pygame.KEYDOWN:
  36.                     if event.key == pygame.K_q:
  37.                         game_over = True
  38.                         game_close = False
  39.                     if event.key == pygame.K_c:
  40.                         gameLoop()
  41.         for event in pygame.event.get():
  42.             if event.type == pygame.QUIT:
  43.                 game_over = True
  44.             if event.type == pygame.KEYDOWN:
  45.                 if event.key == pygame.K_LEFT:
  46.                     x1_change = -snake_block
  47.                     y1_change = 0
  48.                 elif event.key == pygame.K_RIGHT:
  49.                     x1_change = snake_block
  50.                     y1_change = 0
  51.                 elif event.key == pygame.K_UP:
  52.                     y1_change = -snake_block
  53.                     x1_change = 0
  54.                 elif event.key == pygame.K_DOWN:
  55.                     y1_change = snake_block
  56.                     x1_change = 0
  57.         if x1 >= dis_width or x1 ‹ 0 or y1 >= dis_height or y1 ‹ 0:
  58.             game_close = True
  59.         x1 += x1_change
  60.         y1 += y1_change
  61.         dis.fill(white)
  62.         pygame.draw.rect(dis, blue, [foodx, foody, snake_block, snake_block])
  63.         pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block])
  64.         pygame.display.update()
  65.         if x1 == foodx and y1 == foody:
  66.             print("Good!")
  67.         clock.tick(snake_speed)
  68.     pygame.quit()
  69.     quit()
  70. gameLoop()
复制代码
  我这里创建了一个函数 gameLoop 作为我们的主函数,同时还初始化了 snake 的食物,还同时增加了键盘 c 和 q 关键字,来重新开始游戏和退出游戏


snake 的成长
  下面我们就开始在 snake 吃掉食物之后,增加 snake 的长度,这也是游戏的基本规则
  1. import pygame
  2. import time
  3. import random
  4. pygame.init()
  5. pygame.display.set_caption('贪吃蛇')
  6. font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
  7. score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)
  8. white = (255, 255, 255)
  9. yellow = (255, 255, 102)
  10. black = (0, 0, 0)
  11. red = (213, 50, 80)
  12. green = (0, 255, 0)
  13. blue = (50, 153, 213)
  14. dis_width = 600
  15. dis_height = 400
  16. dis = pygame.display.set_mode((dis_width, dis_height))
  17. clock = pygame.time.Clock()
  18. snake_block = 10
  19. snake_speed = 15
  20. def our_snake(snake_block, snake_list):
  21.     for x in snake_list:
  22.         pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
  23. def message(msg, color):
  24.     mesg = font_style.render(msg, True, color)
  25.     dis.blit(mesg, [dis_width / 6, dis_height / 3])
  26. def gameLoop():
  27.     game_over = False
  28.     game_close = False
  29.     x1 = dis_width / 2
  30.     y1 = dis_height / 2
  31.     x1_change = 0
  32.     y1_change = 0
  33.     snake_List = []
  34.     Length_of_snake = 1
  35.     foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  36.     foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
  37.     while not game_over:
  38.         while game_close == True:
  39.             dis.fill(blue)
  40.             message("你失败了,请重新开始游戏!", red)
  41.             pygame.display.update()
  42.             for event in pygame.event.get():
  43.                 if event.type == pygame.KEYDOWN:
  44.                     if event.key == pygame.K_q:
  45.                         game_over = True
  46.                         game_close = False
  47.                     if event.key == pygame.K_c:
  48.                         gameLoop()
  49.         for event in pygame.event.get():
  50.             if event.type == pygame.QUIT:
  51.                 game_over = True
  52.             if event.type == pygame.KEYDOWN:
  53.                 if event.key == pygame.K_LEFT:
  54.                     x1_change = -snake_block
  55.                     y1_change = 0
  56.                 elif event.key == pygame.K_RIGHT:
  57.                     x1_change = snake_block
  58.                     y1_change = 0
  59.                 elif event.key == pygame.K_UP:
  60.                     y1_change = -snake_block
  61.                     x1_change = 0
  62.                 elif event.key == pygame.K_DOWN:
  63.                     y1_change = snake_block
  64.                     x1_change = 0
  65.         if x1 >= dis_width or x1 ‹ 0 or y1 >= dis_height or y1 ‹ 0:
  66.             game_close = True
  67.         x1 += x1_change
  68.         y1 += y1_change
  69.         dis.fill(blue)
  70.         pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
  71.         snake_Head = []
  72.         snake_Head.append(x1)
  73.         snake_Head.append(y1)
  74.         snake_List.append(snake_Head)
  75.         if len(snake_List) > Length_of_snake:
  76.             del snake_List[0]
  77.         for x in snake_List[:-1]:
  78.             if x == snake_Head:
  79.                 game_close = True
  80.         our_snake(snake_block, snake_List)
  81.         pygame.display.update()
  82.         if x1 == foodx and y1 == foody:
  83.             foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  84.             foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
  85.             Length_of_snake += 1
  86.         clock.tick(snake_speed)
  87.     pygame.quit()
  88.     quit()
  89.     gameLoop()
复制代码


展示得分
  最后我们来显示得分,毕竟对于游戏来说,玩家的得分还是很重要的
  1. import pygame
  2. import time
  3. import random
  4. pygame.init()
  5. pygame.display.set_caption('贪吃蛇')
  6. font_style = pygame.font.Font("C:/Windows/Fonts/STFANGSO.TTF", 20)
  7. score_font = pygame.font.Font("C:/Windows/Fonts/STCAIYUN.TTF", 30)
  8. white = (255, 255, 255)
  9. yellow = (255, 255, 102)
  10. black = (0, 0, 0)
  11. red = (213, 50, 80)
  12. green = (0, 255, 0)
  13. blue = (50, 153, 213)
  14. dis_width = 600
  15. dis_height = 400
  16. dis = pygame.display.set_mode((dis_width, dis_height))
  17. clock = pygame.time.Clock()
  18. snake_block = 10
  19. snake_speed = 15
  20. def Your_score(score):
  21.     value = score_font.render("Your Score: " + str(score), True, yellow)
  22.     dis.blit(value, [0, 0])
  23. def our_snake(snake_block, snake_list):
  24.     for x in snake_list:
  25.         pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
  26. def message(msg, color):
  27.     mesg = font_style.render(msg, True, color)
  28.     dis.blit(mesg, [dis_width / 6, dis_height / 3])
  29. def gameLoop():
  30.     game_over = False
  31.     game_close = False
  32.     x1 = dis_width / 2
  33.     y1 = dis_height / 2
  34.     x1_change = 0
  35.     y1_change = 0
  36.     snake_List = []
  37.     Length_of_snake = 1
  38.     foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  39.     foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
  40.     while not game_over:
  41.         while game_close == True:
  42.             dis.fill(blue)
  43.             message("你失败了,请重新开始游戏!", red)
  44.             Your_score(Length_of_snake - 1)
  45.             pygame.display.update()
  46.             for event in pygame.event.get():
  47.                 if event.type == pygame.KEYDOWN:
  48.                     if event.key == pygame.K_q:
  49.                         game_over = True
  50.                         game_close = False
  51.                     if event.key == pygame.K_c:
  52.                         gameLoop()
  53.         for event in pygame.event.get():
  54.             if event.type == pygame.QUIT:
  55.                 game_over = True
  56.             if event.type == pygame.KEYDOWN:
  57.                 if event.key == pygame.K_LEFT:
  58.                     x1_change = -snake_block
  59.                     y1_change = 0
  60.                 elif event.key == pygame.K_RIGHT:
  61.                     x1_change = snake_block
  62.                     y1_change = 0
  63.                 elif event.key == pygame.K_UP:
  64.                     y1_change = -snake_block
  65.                     x1_change = 0
  66.                 elif event.key == pygame.K_DOWN:
  67.                     y1_change = snake_block
  68.                     x1_change = 0
  69.         if x1 >= dis_width or x1 ‹ 0 or y1 >= dis_height or y1 ‹ 0:
  70.             game_close = True
  71.         x1 += x1_change
  72.         y1 += y1_change
  73.         dis.fill(blue)
  74.         pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
  75.         snake_Head = []
  76.         snake_Head.append(x1)
  77.         snake_Head.append(y1)
  78.         snake_List.append(snake_Head)
  79.         if len(snake_List) > Length_of_snake:
  80.             del snake_List[0]
  81.         for x in snake_List[:-1]:
  82.             if x == snake_Head:
  83.                 game_close = True
  84.         our_snake(snake_block, snake_List)
  85.         Your_score(Length_of_snake - 1)
  86.         pygame.display.update()
  87.         if x1 == foodx and y1 == foody:
  88.             foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  89.             foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
  90.             Length_of_snake += 1
  91.         clock.tick(snake_speed)
  92.     pygame.quit()
  93.     quit()
  94. gameLoop()
复制代码
  这里创建了一个 Your_score 函数来记录玩家得分

  这样,我们就完成了一个简易的贪吃蛇小游戏了
  最后的最后,我们再给游戏添加音乐背景,让游戏的时光更加惬意吧
  1. # 播放音乐
  2. pygame.init()
  3. pygame.mixer.music.load(r"Game.mp3")
  4. pygame.mixer.music.play()
复制代码
  到此这篇关于100行Pygame代码 制作一个贪吃蛇小游戏的文章就介绍到这了,更多相关Pygame制作一个贪吃蛇小游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|耀极客论坛 ( 粤ICP备2022052845号-2 )|网站地图

GMT+8, 2022-12-7 12:17 , Processed in 0.068530 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表