找回密码
 会员注册
查看: 27|回复: 0

Pythonpygame贪吃蛇小游戏(200行完整代码+注释+可运行)

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
68585
发表于 2024-9-5 09:50:31 | 显示全部楼层 |阅读模式
一、运行效果图二、完整代码#!/usr/bin/envpython#-*-coding:utf-8-*-#author:Wangdalitime:2021年1月20日16:08:44#python实现:贪吃蛇'''游戏玩法:回车开始游戏;空格暂停游戏/继续游戏;方向键/wsad控制小蛇走向''''''思路:用列表存储蛇的身体;用浅色表示身体,深色背景将身体凸显出来;蛇的移动:仔细观察,是:身体除头和尾不动、尾部消失,头部增加,所以,新添加的元素放在列表头部、删除尾部元素;游戏结束判定策略:超出边界;触碰到自己的身体:蛇前进的下一格子为身体的一部分(即在列表中)。'''#注:因为在列表中需要频繁添加和删除元素,所以用deque容器代替列表;是因为deque具有高效的插入和删除效率#初始化蛇,长度为3,放置在屏幕左上角;#导包importrandomimportsysimporttimeimportpygamefrompygame.localsimport*fromcollectionsimportdeque#基础设置Screen_Height=480Screen_Width=600Size=20#小方格大小Line_Width=1#游戏区域的坐标范围Area_x=(0,Screen_Width//Size-1)#0是左边界,1是右边界#注:python中//为整数除法;/为浮点数除法Area_y=(2,Screen_Height//Size-1)#食物的初步设置#食物的分值+颜色Food_Style_List=[(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]#整体颜色设置Light=(100,100,100)Dark=(200,200,200)Black=(0,0,0)Red=(200,30,30)Back_Ground=(40,40,60)#文本输出格式设置defPrint_Txt(screen,font,x,y,text,fcolor=(255,255,255)):#font.render参数意义:.render(内容,是否抗锯齿,字体颜色,字体背景颜色)Text=font.render(text,True,fcolor)screen.blit(Text,(x,y))#初始化蛇definit_snake():snake=deque()snake.append((2,Area_y[0]))snake.append((1,Area_y[0]))snake.append((0,Area_y[0]))returnsnake#食物设置#注意需要对食物出现在蛇身上的情况进行判断defCreat_Food(snake):'''注:randint产生的随机数区间是包含左右极限的,也就是说左右都是闭区间的[1,n],能取到1和n。而randrange产生的随机数区间只包含左极限,也就是左闭右开的[1,n),1能取到,而n取不到。randint产生的随机数是在指定的某个区间内的一个值,而randrange产生的随机数可以设定一个步长,也就是一个间隔。'''food_x=random.randint(Area_x[0],Area_x[1])#此处有疑问food_y=random.randint(Area_y[0],Area_y[1])#如果食物出现在蛇上,重来;while(food_x,food_y)insnake:food_x=random.randint(Area_x[0],Area_x[1])food_y=random.randint(Area_y[[0],Area_y[1]])returnfood_x,food_y#食物风格defFood_Style():returnFood_Style_List[random.randint(0,2)]#返回随机的分值和颜色defmain():pygame.init()screen=pygame.display.set_mode((Screen_Width,Screen_Height))#初始化一个准备显示的窗口或屏幕pygame.display.set_caption('贪吃蛇')#Setthecurrentwindowcaption#得分字体设置font1=pygame.font.SysFont('SimHei',24)#GO字体设置font2=pygame.font.SysFont(None,72)fwidth,fheight=font2.size('GAMEOVER')####程序bug修复:如果蛇在向右移动,快速点击分别施加向下、向左的命令,向下的命令会被覆盖,只有向左的命令被接受,直接GameOver#b变量为了防止这个情况发生b=True#蛇snake=init_snake()#食物food=Creat_Food(snake)food_style=Food_Style()#方向控制pos=(1,0)####启动游戏相关变量初始化game_over=True#结束标志#是否开始,当start=True,game_over=True时,才显示GAMEOVERgame_start=False#开始标志score=0#得分orispeed=0.3#蛇初始速度speed=orispeed#蛇速度last_move_time=Nonepause=False#暂停whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:sys.exit()elifevent.type==KEYDOWN:ifevent.key==K_RETURN:ifgame_over:game_start=Truegame_over=Falseb=Truesnake=init_snake()food=Creat_Food(snake)food_style=Food_Style()pos=(1,0)#得分score=0last_move_time=time.time()elifevent.key==K_SPACE:ifnotgame_over:pause=notpause#以下为防止蛇在向右移动时按向左键,导致GameOverelifevent.keyin(K_UP,K_w):ifbandnotpos[1]:###pos=(0,-1)b=Falseelifevent.keyin(K_DOWN,K_s):ifbandnotpos[1]:pos=(0,1)b=Falseelifevent.keyin(K_LEFT,K_a):ifbandnotpos[0]:pos=(-1,0)b=Falseelifevent.keyin(K_RIGHT,K_d):ifbandnotpos[0]:pos=(1,0)b=False#填充背景色screen.fill(Back_Ground)####画网格线、竖线forxinrange(Size,Screen_Width,Size):pygame.draw.line(screen,Black,(x,Area_y[0]*Size),(x,Screen_Height),Line_Width)#画网格线、横线foryinrange(Area_y[0]*Size,Screen_Height,Size):pygame.draw.line(screen,Black,(0,y),(Screen_Width,y),Line_Width)#蛇的爬行过程ifnotgame_over:curTime=time.time()ifcurTime-last_move_time>speed:###ifnotpause:b=Truelast_move_time=curTimenext_s=(snake[0][0]+pos[0],snake[0][1]+pos[1])#如果吃到了食物ifnext_s==food:snake.appendleft(next_s)score+=food_style[0]speed=orispeed-0.03*(score//100)food=Creat_Food(snake)food_style=Food_Style()else:#在区域内ifArea_x[0]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-5 08:50 , Processed in 1.015721 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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