实验二 代码 + 贪吃蛇大作战(360°寻路+AI自动蛇)
目录
一、实验目的
二、实验内容
三、实验过程展示
四、实验成果
五、实验代码
一、实验目的
1.实现基本的贪吃蛇的运动操作
2.实现AI蛇的自动运动
3.实现360°全方位运动
4.实现积分,死亡,加速等操作
二、实验内容
- 初始化蛇操作
- AI蛇路径选择
- 碰撞检测
- 蛇头方向转换
- AI蛇死亡检测,死亡后随机一个区域内生成等值的饼
- 超时检测
- 蛇运动操作
- 游戏封装发
三、实验过程展示
3.1 初始化蛇体操作
初始化操作主要分为游戏全局初始化和蛇体初始化。
本游戏设置1条玩家操作蛇和6条AI自动蛇。首先我们定义Snake类,其中包括游戏开发时需要的所有组件,蛇头、身体、方向、猎捕点集、是否存活等。代码如下:
接下来我们定义全局的饼位置初始化,以及蛇的长度,颜色初始化。这里主要是针对AI蛇的初始化,代码如下:
蛇体组件初始化,这里主要是将蛇头的坐标初始化,并使用append函数加入到body中,并且赋值大小为bodysize。同时定义第二个点,有两个用处,第一判断此时蛇头的方向角,第二填充body。
这里要注意,初始化生成蛇的位置不能太靠近游戏的边界,否则会出现刚刚生成就碰撞死亡的现象。其次,我们的蛇身体不是点,是一个圆,所以要考虑到半径的问题,所以在生成的时候要加上半径,否则会导致身体超出边界。
代码如下:
3.2 方向判断
AI蛇没有鼠标进行方向指引,所以需要给它一个方向才能进行接下来的路径规划和运动。我编写了JodjePoint()函数来进行方向的选择。
这里的返回值为true和false,主要是反馈当前的方向是否需要变化,false表示需要以及更新direction和rewardList,用新的路径行走,true表示不需要变化,函数主体代码如下:
贪吃蛇问题,涉及到饼位置随机变换,AI蛇相对位置不固定等问题,导致地图中没有相对固定的点集,所以无法实时的通过迪杰斯特拉算法求出蛇头和最多的饼之间的最短路径。
所以这里我们采取动态规划思路,简而言之就是“当前最优”。通过广度优先搜索rewardList表,找到蛇头目前和现有的所有的饼中哪一个最近,然后更新hunt猎杀标志位,同时反馈角度和距离到direction中。广度优先搜索的代码如下:
这里在编写是会遇到一个问题:如果此时两条蛇均定位到同一个点,遵循游戏规则,如何实现饼的分配和避让
针对这个问题,我们采取实时检测蛇列表snakelist的动态,如果发现不匹配,说明此位置蛇死亡,更新饼rewardPoint列表,重复广度优先搜索操作,
这里要时刻记住python中atan函数求出来的角度是当前坐标系下的角度,需要转换为四个象限,分别加90,180,360。设置标志位que和临时标志位q,que的作用就是,放入for循环中返回最短距离点的下标。
在这里我们要注意一个角度的问题,根据网络上贪吃蛇大作战的游戏规则,蛇是无法直接掉头的,也就是说我们要计算一个向左和向右的极限角度,如下如所示,极限旋转角度为20°和340°,所以我们在书写代码的时候要加上判断
3.3 路径规划
pathDecision()函数主要是通过调用JudgePoint()函数更新当前的rewardList表格和Snake类中的猎杀目标信息hunt,通过JudgePoint()函数反馈的是否需要更新当前路由,来调用addRecF()函数进行蛇体的前进。
所用到的代码如下,遍历饼列表的核心思想还是广度优先搜索。
3.4 死亡检测/碰撞检测
蛇死亡主要分为两种:碰到边界死亡和撞到别的蛇身体死亡,这里我们编写函数aiisDead()来检测蛇是否死亡。
函数体中我们会发现,需要分为两个个检测阶段:
第一:检测是否碰到边界(考虑蛇每个节点是圆形,因此需要减去半径)
第二:检测当蛇列表不匹配时,蛇和列表中所有的蛇的body列表中是否有距离小于10 (蛇节点半径),这里采用for循环直接暴力求解。
3.5 鼠标监听和动作转换
调用pygame中的event()组件中的get()函数,实时反馈当前界面的所有外设动态。
为实现项目特色:用鼠标指引蛇方向,我们调用了event组件中的pos函数,实时反馈鼠标的坐标,将其反馈给Snake类中的方向参数,实现全方位的移动。
同时调用键盘接口函数KEYDOWN实时监听键盘按键,并通过a,b键操纵目标移动的速度,return键复活。
最后调用diplay组件中的update()函数,实现对游戏的刷新。
具体代码如下:
3.6 绘画蛇体和饼
绘画蛇体,调用pygame内部的draw组件,参考网络游戏贪吃蛇大作战,我将蛇身体用圆点进行展示,调用组件中的circle()函数。
代码如下:
遍历蛇的身体,获取body列表中的坐标。
相似的操作,遍历rewardList中所有的饼,获取饼的坐标进行打印,调用pygame中的draw组件。
代码如下:
四、实验成果
4.1运行界面展示
点击运行,正常进入运行界面,如下图所示:
4.2 阵亡界面展示
触到边界或者碰到别的蛇的body,导致蛇死亡,界面如下:
4.3 封装展示
使用pyinstaller将代码封装成.exe文件,可以更好的方便用户使用,方便后期发布游戏等操作。
如下图:
五、实验代码
import random, pygame,sys,math,operator
from pygame.locals import *pygame.init()
fps=10
Width = 1000
Height= 900
mystep=8
quit=True
clock=pygame.time.Clock()
window=pygame.display.set_mode((Width,Height))
pygame.display.set_caption('THT的贪吃蛇')size=5
size1=10
size2=20
size3=30
bodysize=16WHITE = (255, 255, 255)
BLACK = ( 0, 0, 0)
BLUE = ( 58, 95, 205)
RED = (178, 34, 34)
ORANGE = (255, 165, 0)
PURPLE = (180, 82, 205)
PINK = (235, 121, 159)
GREEN = (102, 205, 170)
DARKGREEN = ( 0, 155, 0)
DARKGRAY = ( 40, 40, 40)
color=[BLUE,ORANGE,PURPLE,PINK,GREEN,DARKGREEN]class Snake():length=0direction=0live=1kill=0hunt=0huntx=0hunty=0flage=0step=8ai=Falsefoodtimeflage=0color=REDbody=[]food=[]def init(self):self.length=self.direction=self.kill=self.huntx=self.hunty=self.hunt=self.foodtimeflage=0self.hunt=0self.step=8self.live=1self.flage=0self.body=[]snake=Snake()
snake1=Snake()
snake2=Snake()
snake3=Snake()
snake4=Snake()
snake5=Snake()
snake6=Snake()
snakelist=[snake1,snake2,snake3,snake4,snake5,snake6]
rewardNode=[]
snakefood=[[],[],[],[],[],[]]def init():initsnake(snake)for i in range(len(snakelist)):initsnake(snakelist[i])snakelist[i].ai = Truesnakelist[i].hunt = isnakelist[i].color=color[i]snakelist[i].food.clear()rewardNode.clear()for food in snakefood:food.clear()for i in range(6):rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])def initsnake(Snake):Snake.init()Snake.body.append([random.randint(10, Width - bodysize * 2), random.randint(10, Height - bodysize * 5), bodysize, bodysize])Snake.body.append([Snake.body[0][0], Snake.body[0][1] + bodysize / 2, bodysize, bodysize])Snake.body.append([Snake.body[1][0], Snake.body[1][1] + bodysize / 2, bodysize, bodysize])if Snake.ai:Snake.color = color[snakelist.index(Snake)]Snake.hunt=snakelist.index(Snake)def timeout(Snake):Snake.flage=0if not Snake.ai:Snake.flage=1for food in rewardNode:dist=round(math.sqrt((Snake.body[0][0]+Snake.body[0][2]//2-food[0]-food[2]//2)*(Snake.body[0][0]+Snake.body[0][2]//2-food[0]-food[2]//2)+(Snake.body[0][1]+Snake.body[0][2]//2-food[1]-food[2]//2)*(Snake.body[0][1]+Snake.body[0][2]//2-food[1]-food[2]//2)))if dist<=food[2]//2+Snake.body[0][2]//2:if food[2]==size1:Snake.flage+=2elif food[2]==size2:Snake.flage+=3size=food[2]i=rewardNode.index(food)rewardNode[i]=[random.randint(0,Width-size1),random.randint(0,Height-size1),size,size]for fo in snakefood:for food in fo:dist = round(math.sqrt((Snake.body[0][0] + Snake.body[0][2] // 2 - food[0] - food[2] // 2) * (Snake.body[0][0] + Snake.body[0][2] // 2 - food[0] - food[2] // 2) + (Snake.body[0][1] + Snake.body[0][2] // 2 - food[1] - food[2] // 2) * (Snake.body[0][1] + Snake.body[0][2] // 2 - food[1] - food[2] // 2)))if dist<=food[2]//2+Snake.body[0][2]//2:Snake.flage += 1size = food[2]fo.remove(food)while Snake.flage:addRectF(Snake)Snake.flage-=1if Snake.ai:pathDecide(Snake)else:Snake.flage=1Snake.body.pop()snake.foodtimeflage+=1if snake.foodtimeflage==180:while len(rewardNode)>60:del rewardNode[random.randint(0,len(rewardNode)-1)]rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])if random.randint(0,5)==3:rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size2, size2])snake.foodtimeflage=0def aitimeout():for lsnake in snakelist:aiisDead(lsnake)if lsnake.live==0:aiDeath(lsnake)else:timeout(lsnake)def pathDecide(Snake):dist=[]direction=Snake.directionhx=Snake.body[0][0]hy=Snake.body[0][1]if judgePoint(Snake):for food in rewardNode:xx = food[0]yy = food[1]dis = round(math.sqrt((hx - xx) * (hx - xx) + (hy - yy) * (hy - yy)))dist.append(dis)smalldist=10000smalli=0for i in range(len(dist)):if dist[i]<smalldist:smalldist=dist[i]smalli=iSnake.hunt=smalliSnake.huntx=rewardNode[Snake.hunt][0]Snake.hunty=rewardNode[Snake.hunt][1]addRectF(Snake)def judgePoint(Snake):que=random.randint(0,len(rewardNode))q=queif (Snake.body[0][0]<=5 and (Snake.direction>180 or Snake.direction<360)):Snake.hunt=random.randint(0,len(rewardNode))return Falseelif ((Snake.body[0][1]<=5) and ((Snake.direction>=0 and Snake.direction<90) or (Snake.direction>270 and Snake.direction<=360))):Snake.hunt=random.randint(0,len(rewardNode))return Falseelif ((Snake.body[0][0]>=Width-5) and (Snake.direction>0 or Snake.direction<180)):Snake.hunt=random.randint(0,len(rewardNode))return Falseelif ((Snake.body[0][1]>=Height-5) and (Snake.direction>90 or Snake.direction<270)):Snake.hunt=random.randint(0,len(rewardNode))return Falsedir=[]for food in rewardNode:huntx=food[0]hunty=food[1]hx=Snake.body[0][0]hy=Snake.body[0][1]if huntx >= hx and hy > hunty:direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)elif huntx > hx and hunty >= hy:direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90elif hx >= huntx and hunty > hy:direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180elif hx > huntx and hy >= hunty:direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi) + 270dist=round(math.sqrt((huntx-hx)*(huntx-hx)+(hunty-hy)*(hunty-hy)))dir.append([direction,dist])for i in range(len(dir)):d=dir[0][1]if Snake.direction>=135 and Snake.direction<=180:if dir[i][0]>=round(180-Snake.direction+360-45)%360 or dir[i][0]<=round(180-Snake.direction+45+360)%360:if d>dir[i][1]:d=dir[i][1]que=ielif Snake.direction>=180 and Snake.direction<=225:if dir[i][0]>=round(Snake.direction-180+45+360)%360 or dir[i][0]<=round(Snake.direction+45+360-180)%360:if d>dir[i][1]:d=dir[i][1]que=ielse:if dir[i][0]>=round(Snake.direction-45+360+180)%360 and dir[i][0]<=round(Snake.direction+45+360+180)%360:if d>dir[i][1]:d=dir[i][1]que=ix=Snake.body[0][0]-round(200*math.sin(Snake.direction/180*math.pi))y=Snake.body[0][1]+round(200*math.cos(Snake.direction/180*math.pi))if x<=0:x=10if y<=0:y=10if(x>=Width):x=980if(y>=Height):y=780for snake in snakelist:if snakelist.index(snake)!=snakelist.index(Snake):for body in snake.body:hx = Snake.body[0][0]hy = Snake.body[0][1]huntx=body[0]+body[2]hunty=body[1]+body[2]if huntx >= hx and hy > hunty:direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)elif huntx > hx and hunty >= hy:direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90elif hx >= huntx and hunty > hy:direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180elif hx > huntx and hy >= hunty:direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi) + 270if Snake.direction<=20 or Snake.direction>=340:if direction>=round(Snake.direction-20+360)%360 or direction<=round(Snake.direction+20+360)%360:dist=round(math.sqrt((huntx-hx)*(huntx-hx)+(hunty-hy)*(hunty-hy)))if dist<=50:if que==q:if len(rewardNode)>=55:se=random.randint(0,len(rewardNode)-1)rewardNode[se]=[random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1]que=seelse:rewardNode.append([random.randint(0,Width-size1),random.randint(0,Height-size1),size1,size1])que=len(rewardNode)-1Snake.hunt=queSnake.direction=round(Snake.direction+150)%360# addRectF(Snake)# del Snake.body[len(Snake.body)-1]# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]return Falseelse:if direction>=round(Snake.direction-20+360)%360 and direction<=round(Snake.direction+20+360)%360:dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))if dist <= 50:if que == q:if len(rewardNode) >= 55:se = random.randint(0, len(rewardNode) - 1)rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1),size1, size1]que = seelse:rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])que = len(rewardNode) - 1Snake.hunt = queSnake.direction = round(Snake.direction + 150) % 360# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]return Falsefor body in snake.body:hx = Snake.body[0][0]hy = Snake.body[0][1]huntx = body[0] + body[2]hunty = body[1] + body[2]if huntx >= hx and hy > hunty:direction = round(math.atan((huntx - hx) / (hy - hunty)) * 180 / math.pi)elif huntx > hx and hunty >= hy:direction = round(math.atan((hunty - hy) / (huntx - hx)) * 180 / math.pi) + 90elif hx >= huntx and hunty > hy:direction = round(math.atan((hx - huntx) / (hunty - hy)) * 180 / math.pi) + 180elif hx > huntx and hy >= hunty:direction = round(math.atan((hy - hunty) / (hx - huntx)) * 180 / math.pi)if Snake.direction <= 45 or Snake.direction >= 315:if direction >= round(Snake.direction - 45 + 360) % 360 or direction <= round(Snake.direction + 45 + 360) % 360:dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))if dist <= 50:if que == q:if len(rewardNode) >= 55:se = random.randint(0, len(rewardNode) - 1)rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1), size1,size1]que = seelse:rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])que = len(rewardNode) - 1Snake.hunt = queSnake.direction = round(Snake.direction + 150) % 360# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]return Falseelse:if direction >= round(Snake.direction - 45 + 360) % 360 and direction <= round(Snake.direction + 45 + 360) % 360:dist = round(math.sqrt((huntx - hx) * (huntx - hx) + (hunty - hy) * (hunty - hy)))if dist <= 50:if que == q:if len(rewardNode) >= 55:se = random.randint(0, len(rewardNode) - 1)rewardNode[se] = [random.randint(0, Width - size1), random.randint(0, Height - size1), size1,size1]que = seelse:rewardNode.append([random.randint(0, Width - size1), random.randint(0, Height - size1), size1, size1])que = len(rewardNode) - 1Snake.hunt = queSnake.direction = round(Snake.direction + 150) % 360# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]# addRectF(Snake)# del Snake.body[len(Snake.body) - 1]return Falseif rewardNode[Snake.hunt] ==[]:Snake.hunt=random.randint(0,len(rewardNode))return Falsereturn Truedef aiisDead(Snake):if Snake.body[0][0]<=0 or Snake.body[0][1]<=0 or Snake.body[0][0]>=Width-Snake.body[0][2] or Snake.body[0][1]>=Height-Snake.body[0][2]:Snake.live=0return Truefor lsnake in snakelist:if snakelist.index(lsnake)!=snakelist.index(Snake):for body in lsnake.body:if math.sqrt(((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) * ((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) + ((Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2)) * ((Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2))) <= 10:Snake.live=0return Truefor body in snake.body:if math.sqrt(((Snake.body[0][0]+Snake.body[0][2]//2)-(body[0]+body[2]//2))*((Snake.body[0][0]+Snake.body[0][2]//2)-(body[0]+body[2]//2))+((Snake.body[0][1]+Snake.body[0][2]//2)-(body[1]+body[2]//2))*((Snake.body[0][1]+Snake.body[0][2]//2)-(body[1]+body[2]//2)))<=10:Snake.live = 0snake.kill+=1return Truereturn Falsedef isDead(Snake):if Snake.body[0][0]<=0 or Snake.body[0][1]<=0 or Snake.body[0][0]>=Width-Snake.body[0][2] or Snake.body[0][1]>=Height-Snake.body[0][2]:Snake.live=0return Truefor lsnake in snakelist:for body in lsnake.body:if math.sqrt(((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) * ((Snake.body[0][0] + Snake.body[0][2] // 2) - (body[0] + body[2] // 2)) + ((Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2)) * ((Snake.body[0][1] + Snake.body[0][2] // 2) - (body[1] + body[2] // 2))) <= 10:Snake.live=0return Truereturn Falsedef aiDeath(Snake):if Snake.live==0:for body in Snake.body:x=body[0]y=body[1]s=body[2]Snake.body.pop()snakefood[snakelist.index(Snake)].append([x+random.randint(0,5)*10,y+random.randint(0,5)*10,s//2,s//2])Snake.body.clear()initsnake(Snake)Snake.live=1def addRectF(Snake):hx=Snake.body[0][0]hy=Snake.body[0][1]if Snake.ai:huntx=rewardNode[Snake.hunt][0]hunty=rewardNode[Snake.hunt][1]else:huntx=Snake.huntxhunty=Snake.huntydirection=Snake.directionif huntx>=hx and hy>hunty:direction=round(math.atan((huntx-hx)/(hy-hunty))*180/math.pi)elif huntx>hx and hunty>=hy:direction=round(math.atan((hunty-hy)/(huntx-hx))*180/math.pi)+90elif hx>=huntx and hunty>hy:direction=round(math.atan((hx-huntx)/(hunty-hy))*180/math.pi)+180elif hx>huntx and hy>=hunty :direction=round(math.atan((hy-hunty)/(hx-huntx))*180/math.pi)+270if (Snake.direction-direction+360)%360>=175 and (Snake.direction-direction+360)%360<=185:direction+=30Snake.direction=direction%360Snake.body.insert(0,[Snake.body[0][0]+round(Snake.step*math.sin(Snake.direction/180*math.pi)),Snake.body[0][1]-round(Snake.step*math.cos(Snake.direction/180*math.pi)),Snake.body[0][2],Snake.body[0][2]])def printsnake(Snake,col):for fo in snakefood:for food in fo:foodsize = food[2]//3foodx=int(food[0]+food[2]//2)foody=int(food[1]+food[2]//2)pos=foodx,foodypygame.draw.circle(window, color[snakefood.index(fo)], pos, foodsize, 0)for body in Snake.body:bodysize=body[2]hx=int(body[0]+bodysize//2)hy=int(body[1]+bodysize//2)pos=hx,hypygame.draw.circle(window, col, pos, bodysize//2,0 )pygame.draw.circle(window, BLACK, pos, bodysize//2,1)def printrewardNode():for body in rewardNode:bodysize = body[2]hx = int(body[0] + bodysize // 2)hy = int(body[1] + bodysize // 2)pos = hx, hypygame.draw.circle(window, WHITE, pos, bodysize // 2, 0)def printtext():textFont = pygame.font.SysFont("simsunnsimsun", 20)textSurface = textFont.render("得分: "+str(len(snake.body)), True, WHITE)window.blit(textSurface, (20,30))textSurface = textFont.render("击杀: " + str(snake.kill), True, WHITE)window.blit(textSurface, (20,60))textSurface = textFont.render("排行榜: " , True, WHITE)window.blit(textSurface, (700, 5))rect=[(720,30),(720,55),(720,80),(720,105),(720,130),(720,155),(720,180)]seq=[]seq.append([6,len(snake.body)])for lsnake in snakelist:seq.append([snakelist.index(lsnake),len(lsnake.body)])seq.sort(key=operator.itemgetter(1),reverse=True)name=['小蓝','小橙','小紫','小粉','小青','小绿','我的']for paixu in seq:textSurface = textFont.render(str(seq.index(paixu)+1)+'. '+name[paixu[0]]+' '+str(paixu[1]), True, WHITE)window.blit(textSurface, rect[seq.index(paixu)])init()
while quit:if snake.live==1:clock.tick(fps)pygame.draw.rect(window, BLACK, (0, 0, Width, Height))aitimeout()timeout(snake)for event in pygame.event.get():if event.type == pygame.QUIT:quit = Falseif event.type == MOUSEMOTION:snake.huntx, snake.hunty = event.posif event.type == pygame.KEYDOWN:if event.key == pygame.K_a:snake.step = 12if event.key == pygame.K_RETURN:snake.live = 1if event.key==pygame.K_b:snake.step = 8printrewardNode()for i in range(len(snakelist)):printsnake(snakelist[i], snakelist[i].color)printsnake(snake, snake.color)isDead(snake)printtext()else:textFont = pygame.font.SysFont("simsunnsimsun", 100)textSurface = textFont.render("GAME OVER!!!!", True, WHITE)window.blit(textSurface, (200, 300))for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:snake.live = 1init()if event.type == pygame.QUIT:quit = Falsepygame.display.update()
实验二 代码 + 贪吃蛇大作战(360°寻路+AI自动蛇)相关推荐
- Java贪吃蛇360旋转,贪吃蛇大作战360版
贪吃蛇大作战360客户端带你享受最轻松.最愉悦的休闲游戏,游戏中比拼的不仅是手速,还有技巧,更加考验你的策略!比赛刚开始时大家都是小蛇,这时候就要通过不断努力来把自己变成巨无霸,这样才能更加轻松的取得 ...
- 面向对象版贪吃蛇大作战游戏创作
贪吃蛇大作战 创作思路: 1.创建蛇头蛇身-----2.让蛇动起来-----3.随机投放食物-----4.吃掉创建的食物------5.判断游戏开始结束 前期准备工作: 创建一个宽1200 高800的 ...
- java实现蛇蛇大作战_蛇蛇大作战3D旋涡版
蛇蛇大作战3D旋涡版是一款趣味的手机游戏,在这里用户需要做的就是不断的寻找各种的游戏的亮点.这个过程是十分有趣的,喜欢的用户能在这里控制着你的蛇在游戏中不断的吞噬各种的小球,这里的每一个小球都是十分有 ...
- python贪吃蛇程序_Python 实现 贪吃蛇大作战 代码分享
感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核.媒体们除了之前竞相追捧<Pokemon Go>热闹了一把,似乎也听不到什么声音了.直到最近几天,突然听见好几人 ...
- python 贪吃蛇大作战_Python 实现 贪吃蛇大作战 代码分享
感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核.媒体们除了之前竞相追捧<Pokemon Go>热闹了一把,似乎也听不到什么声音了.直到最近几天,突然听见好几人 ...
- laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
文章目录 一 功能分析 二 实现方案 1. 代码结构 2. 关键函数实现 2.1 游戏主循环(GameLoop) 2.2 数据层(Model) 2.3 画面绘制层(View) 帧同步的困难与解决方法 ...
- 贪吃蛇大作战ai_二 贪吃蛇大作战!
二 贪吃蛇大作战! !当紫月在一次有意识的时候,他发现他出现在的是一个漆黑的空间里面. 而在这漆黑的空间里面,有着许许多多的小光点,这些光点有大的,有小的,还有各种各样的,颜銫也有着不相同的. 这是一 ...
- C语言高仿贪吃蛇大作战,800行代码就能实现,结尾有源码~
这是一个贪吃蛇大作战类游戏,修改特性为 AI 不互杀: 该程序有四个类:蛇基类 SnakeBase,玩家类 Player,AI 类,Game 类: SnakeBase 和 AI 均继承自 SnakeB ...
- 贪吃蛇大作战代码java,贪吃蛇游戏,贪吃蛇java游戏代码讲解
贪吃蛇游戏,贪吃蛇java游戏代码讲解 来源:互联网 作者:佚名 时间:2020-06-06 贪吃蛇源代码.txt这世界上除了我谁都没资格陪在你身边. 听着,我允许你喜欢我.除了白头偕老,我们... ...
最新文章
- LeetCode 202. Happy Number--Python解法
- 服务器推送信息到客户端,服务器如何发送消息到客户端
- selenium+python面试题目总结,完整度80%,看看你会多少?
- kafka数据 落盘_Kafka数据可靠性保证三板斧-ACK/ISR/HW
- leetcode —— 235. 二叉搜索树的最近公共祖先
- c语言 树的遍历,c语言构造树及树的三种遍历
- library/adodb/adodb.inc.php,ADOdb Library for PHP
- 北工大计算机学院大赛,做北工大的竞赛咖!这些信息你一定不能错过!
- android studio引用高德地图api后地图显示白屏
- F2. Promising String (hard version)(cf)树状数组
- 腾讯蚂蚁字节美团后台实习面经
- 2022学年第一学期郑州大学ACM招新赛选拔赛
- Github从账号创建到上传项目
- mysql show full processlist 分析问题
- 点击次数、访问次数、访问者人数、综合浏览量和唯一浏览量有何区别?(转)...
- 二极管在电路设计中的应用
- 全国计算机等级考试二级Python真题及解析
- webix .datatable 表格分页
- 一文搞懂像素(px)、分辨率、CSS长度单位
- STM8S103内存详析
热门文章
- 英文原文:Where .NET Core 2.1 is Headed
- 微信小程序 扫码功能
- 【人生苦短,我学 Python】基础篇——标准数据类型(Day3)
- 商标注册攻略,正确注册商标的七大方法
- 如何帮助14岁孩子度过青春期
- css让文字成竖排方式呈现
- 教你如何恢复重建被删除的 WindowsApps 目录
- AndroidStudio编译失败:Could not initialize class com.android.repository.api.RepoManager
- 4.CKeditor4.10.0最新图片上传配置
- html 中 css 中 使背景照片覆盖全屏