1.可以帮我写一个贪吃蛇的贪吃游戏代码吗
2.50行Python代码实现经典游戏,不仅是源源代划水神器,更是码贪码学习利器!
3.python代ç 大å
¨ç®åï¼
4.Python教程:1天教你学会用Python实现「贪吃蛇」游戏~
5.如何用Python写一个贪吃蛇AI
可以帮我写一个贪吃蛇的吃蛇游戏代码吗
当然可以。下面是贪吃一个简单的贪吃蛇游戏代码,使用Python的源源代期货量化指标源码pygame库实现。
python
import pygame
import random
# 初始化pygame
pygame.init()
# 设置屏幕大小
screen = pygame.display.set_mode((,码贪码 ))
# 设置颜色
WHITE = (, , )
RED = (, 0, 0)
GREEN = (0, , 0)
BLACK = (0, 0, 0)
# 设置蛇和食物的大小
SNAKE_SIZE =
FOOD_SIZE =
# 设置游戏速度
SPEED =
# 定义蛇类
class Snake:
def __init__(self):
self.body = [(, ), (, ), (, )]
self.direction = (, 0)
def move(self):
head = self.body[0]
new_head = ((head[0] + self.direction[0]) % , (head[1] + self.direction[1]) % )
self.body = [new_head] + self.body[:-1]
def grow(self):
head = self.body[0]
new_head = ((head[0] + self.direction[0]) % , (head[1] + self.direction[1]) % )
self.body = [new_head] + self.body
def draw(self):
for segment in self.body:
pygame.draw.rect(screen, GREEN, (segment[0], segment[1], SNAKE_SIZE, SNAKE_SIZE))
# 定义食物类
class Food:
def __init__(self):
self.position = (random.randint(0, // SNAKE_SIZE) SNAKE_SIZE, random.randint(0, // SNAKE_SIZE) SNAKE_SIZE)
def draw(self):
pygame.draw.rect(screen, RED, self.position + (0, 0, FOOD_SIZE, FOOD_SIZE))
# 创建蛇和食物对象
snake = Snake()
food = Food()
# 设置游戏结束标志
game_over = False
# 游戏主循环
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and snake.direction != (0, ):
snake.direction = (0, -)
elif event.key == pygame.K_DOWN and snake.direction != (0, -):
snake.direction = (0, )
elif event.key == pygame.K_LEFT and snake.direction != (, 0):
snake.direction = (-, 0)
elif event.key == pygame.K_RIGHT and snake.direction != (-, 0):
snake.direction = (, 0)
screen.fill(BLACK)
snake.move()
if snake.body[0] == food.position:
snake.grow()
food = Food()
snake.draw()
food.draw()
pygame.display.flip()
pygame.time.Clock().tick(SPEED)
pygame.quit()
代码这个贪吃蛇游戏使用Python的pygame库实现。游戏的吃蛇主要部分包括一个蛇类和一个食物类。蛇类有一个身体列表,贪吃用于存储蛇的源源代每个部分的位置,以及一个方向元组,码贪码用于存储蛇的吃蛇移动方向。蛇类还有move、贪吃grow和draw方法,源源代分别用于移动蛇、码贪码增加蛇的长度和绘制蛇。食物类有一个位置属性,用于存储食物的位置,以及一个draw方法,用于绘制食物。游戏的主循环使用pygame的事件循环来处理用户的输入和游戏逻辑。在游戏循环中,首先检查是否有退出事件,如果有,则设置游戏结束标志为True。然后检查是否有按键事件,如果有,则根据按键的方向更新蛇的移动方向。接下来,移动蛇,检查蛇是否吃到食物,如果吃到食物,则增加蛇的长度并重新生成食物。最后,绘制蛇和食物,
行Python代码实现经典游戏,不仅是划水神器,更是网站引流赚钱源码学习利器!
Free Python Games 是一个非常适合学生学习的平台,它通过结合游戏与学习,减轻编程过程中的压力,同时激发探索和理解能力。Terri Furton 和 Brett Bymaster等专家都对此表示了高度的认可。
你是否梦想过开发专属的游戏?你是否在想,实现一款经典游戏需要多少工作?游戏开发在互联网领域往往被认为是门槛较高的工作,对非专业开发者来说,这似乎是一个遥不可及的目标。然而,今天要介绍的这款Python项目将颠覆你的认知,让你仅需-行代码就能实现贪吃蛇、迷宫、吃豆人、扫雷、Flappy Bird等经典游戏。
free-python-games 项目是学习Python的利器,不仅提供了实现经典游戏的代码,更激发了学习者的探索和理解能力。与常见的Python库不同,它要求使用者从头开始构建游戏逻辑,涉及游戏的主题和策略实现,这比简单的功能实现更具挑战性和趣味性。
以贪吃蛇为例,游戏的核心逻辑包括蛇的移动、吃食物、碰撞检测等。这些看似简单的操作背后,实际上包含了复杂的决策逻辑和游戏设计思维。通过这样的练习,学习者不仅能够熟练掌握Python编程,还能够提高逻辑思维和问题解决能力。
free-python-games 的源代码结构清晰,易于理解和扩展。它提供了游戏的基础结构和一些基本元素,如turtle库用于图形界面的绘制、random库用于生成随机数。怎么设置起源码使用者需要根据游戏逻辑进行代码填充和优化,这使得学习者能够深入理解游戏开发的每一个细节。
项目中包含的多款经典游戏,如迷宫、吃豆人、扫雷、Flappy Bird等,为学习者提供了多样化的实践机会。除了游戏实现,学习者还可以通过修改游戏规则、添加新元素等方式,进行个性化开发,进一步提升自己的编程能力和游戏设计能力。
对于希望通过学习Python来开发游戏的人来说,free-python-games 是一个极好的起点。它不仅能够帮助你实现游戏,还能够激发你的创造力和解决问题的能力。而对于希望通过游戏轻松学习编程的用户,该项目也提供了完美的平台,只需简单的安装即可在电脑上体验这些经典游戏。
总之,free-python-games 不仅是实现经典游戏的工具,更是学习Python和游戏开发的实用资源。无论是想深入学习编程,还是寻找一个有趣的学习途径,它都是一个值得推荐的项目。
python代ç å¤§å ¨ç®åï¼
pythonæ趣çç¼ç¨ä»£ç
class?Point:
row=0col=0def?__init__(self,?row,?col):self.row=row
self.col=col
def?copy(self):return?Point(row=self.row,?col=self.col)
#åå§æ¡æ¶
import?pygame
import?random
#åå§å
pygame.init()
W=
H=
ROW=
COL=
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('è´ªåè')
bg_color=(,,)
snake_color=(,,)
head=Point(row=int(ROW/2),?col=int(COL/2))
head_color=(0,,)
snakes=[
Point(row=head.row,?col=head.col+1),Point(row=head.row,?col=head.col+2),Point(row=head.row,?col=head.col+3)]
#çæé£ç©
def?gen_food():
while?1:pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
#æ¯å¦è·è碰ä¸äº
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True#è身å
for?snake?in?snakes:
if?snake.row==pos.row?and?snake.col==pos.col:is_coll=True
break
if?not?is_coll:
breakreturn?pos#å®ä¹åæ
food=gen_food()
food_color=(,,0)
direct='left'#left,right,up,down
#
def?rect(point,?color):
cell_width=W/COLcell_height=H/ROWleft=point.col*cell_widthtop=point.row*cell_heightpygame.draw.rect(window,?color,
(left,?top,?cell_width,?cell_height)
)pass#游æ循ç¯
quit=True
clock=pygame.time.Clock()
while?quit:
#å¤çäºä»¶for?event?in?pygame.event.get():if?event.type==pygame.QUIT:
quit=Falseelif?event.type==pygame.KEYDOWN:
if?event.key==?or?event.key==:if?direct=='left'?or?direct=='right':
direct='up'elif?event.key==?or?event.key==:if?direct?==?'left'?or?direct?==?'right':
direct='down'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='left'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='right'#åä¸è¥¿eat=(head.row==food.row?and?head.col==food.col)#éæ°äº§çé£ç©if?eat:food?=?gen_food()
#å¤ç身å#1.æåæ¥ç头ï¼æå ¥å°snakesç头ä¸snakes.insert(0,?head.copy())#2.æsnakesçæåä¸ä¸ªå æif?not?eat:snakes.pop()
#移å¨if?direct=='left':head.col-=1
elif?direct=='right':head.col+=1
elif?direct=='up':head.row-=1
elif?direct=='down':head.row+=1
#æ£æµdead=False#1.æå¢if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:dead=True
#2.æèªå·±for?snake?in?snakes:if?head.col==snake.col?and?head.row==snake.row:
dead=Truebreakif?dead:print('æ»äº')
quit=False
#渲æââç»åºæ¥#èæ¯pygame.draw.rect(window,?bg_color,?(0,0,W,H))#è头for?snake?in?snakes:rect(snake,?snake_color)
rect(head,?head_color)rect(food,?food_color)#pygame.display.flip()#设置帧é¢ï¼é度ï¼clock.tick(8)#æ¶å°¾å·¥ä½
è¿æ¯ä¸ä¸ªç®æçè´ªåèç代ç ï¼è½ç¶ç»æç®åï¼ä½æ¯è¯¥æçåè½é½æ¯å®æ´çï¼å¯ç©æ§ä¹ä¸é
æ±pythonæ°æ®æ åå代ç ï¼ä½¿ç¨pythonæ ååæ°æ®ç代ç å¦ä¸ï¼
fromsklearnimportpreprocessing
importnumpyasnp
X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
X_scaled=preprocessing.scale(X)
print(X_scaled)
pythonå£è¯æ 代ç ç®å```python#Pythonå£è¯æ 代ç foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```
æå±ï¼å¦ææ³æ¹åæ çå½¢ç¶ï¼å¯ä»¥å¨ä»£ç ä¸æ·»å æ´å¤çæ§å¶åæ°ï¼å¦å¨æ¯ä¸è¡ä¸æ·»å ä¸åçç©ºæ ¼æ°ï¼ä½¿å¾æ çå½¢ç¶ä¸ä¸æ ·ãåæ¶å¯ä»¥éè¿æ·»å HTMLæ ç¾ï¼ä½¿ç¨CSSæ ·å¼æ¥æ¹åå£è¯æ çé¢è²ãèæ¯åæåççã
个æç®python代ç ï¼æ¿èµ°å³ç¨
Helloï¼å¤§å®¶å¥½ï¼ææ¯ç¨åºæ±ªå°æ~
è½ç¶pythonæ¯ä¸ä¸ªæå ¥é¨çè¯è¨ï¼ä½æ¯å¾å¤äººä¾ç¶è¿æ¯ä¼é®å°åºæä¹æ ·å¦Pythonææå¿«ï¼çæ¡å½ç¶æ¯å®æåç§å°é¡¹ç®ï¼åªæèªå·±å»æ³ä¸åï¼æè®°å¾ä½è§åãæ¬æåçæ¯ä¸ªæç®ä»»å¡ï¼åå¦è å¯ä»¥å°è¯çèªå·±å®ç°ï¼æ¬æåæ ·ä¹æ¯æ®µä»£ç ï¼Pythonå¼åè ä¹å¯ä»¥ççæ¯ä¸æ¯æ没æ³å°çç¨æ³ã
以ä¸æ¹æ³å¯ä»¥æ£æ¥ç»å®å表æ¯ä¸æ¯åå¨éå¤å ç´ ï¼å®ä¼ä½¿ç¨set()å½æ°æ¥ç§»é¤ææéå¤å ç´ ã
ç»å®å ·ä½ç大å°ï¼å®ä¹ä¸ä¸ªå½æ°ä»¥æç §è¿ä¸ªå¤§å°åå²å表ã
è¿ä¸ªæ¹æ³å¯ä»¥å°å¸å°åçå¼å»æï¼ä¾å¦ï¼Falseï¼Noneï¼0ï¼ââï¼ï¼å®ä½¿ç¨filter()å½æ°ã
æ们常ç¨For循ç¯æ¥éåæ个å表ï¼åæ ·æ们ä¹è½æ举å表çç´¢å¼ä¸å¼ã
å¦ä¸ä»£ç 段å¯ä»¥å°æå 好çæ对å表解å¼æ两ç»ä¸åçå ç»ã
该æ¹æ³å°éè¿éå½çæ¹å¼å°å表çåµå¥å±å¼ä¸ºå个å表ã
该æ¹æ³å°è¿å第ä¸ä¸ªå表çå ç´ ï¼ä¸ä¸å¨ç¬¬äºä¸ªå表å ãå¦æåæ¶è¦åé¦ç¬¬äºä¸ªå表ç¬æçå ç´ ï¼è¿éè¦å ä¸å¥set_b.difference(set_a)ã
å¦ä¸ä»£ç åå¯ä»¥ç¨æ¥è®¡ç®æ§è¡ç¹å®ä»£ç æè±è´¹çæ¶é´ã
该ç®æ³ä¼æä¹±å表å ç´ ç顺åºï¼å®ä¸»è¦ä¼éè¿Fisher-Yatesç®æ³å¯¹æ°å表è¿è¡æåºï¼
ä¸éè¦é¢å¤çæä½å°±è½äº¤æ¢ä¸¤ä¸ªåéçå¼ã
以ä¸ï¼æ¯æç®åå举çå个pythonæç®ä»£ç ï¼æ¿èµ°å³ç¨ï¼å¸æå¯¹ä½ ææ帮å©ï¼
pythonæ°æ代ç æåªäºï¼pythonæ°æ代ç æå¦ä¸ï¼
defnot_emptyï¼sï¼ã
returnsandlenï¼sãstripï¼ï¼ï¼0ã
#returnsandsãstripï¼ï¼ã
#å¦æç´æ¥ååsãstripï¼ï¼é£ä¹så¦ææ¯Noneï¼ä¼æ¥éï¼å 为None没æstripæ¹æ³ã
#å¦æsæ¯Noneï¼é£ä¹Noneandä»»ä½å¼é½æ¯Falseï¼ç´æ¥è¿åfalseã
#å¦æséNoneï¼é£ä¹å¤å®sãtripï¼ï¼æ¯å¦ä¸ºç©ºã
ç¸å ³ç®ä»ã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±æ°çåè½åæ°æ®ç±»åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
å¹´æï¼è¯è¨æµè¡ææ°çç¼è¯å¨Tiobeå°Pythonå å为æå欢è¿çç¼ç¨è¯è¨ï¼å¹´æ¥é¦æ¬¡å°å ¶ç½®äºJavaãCåJavaScriptä¹ä¸ã
è´¨æ°è¡¨ä»£ç ï¼è´¨æ°è¡¨ä»£ç æ¯æç¨ç¼ç¨è¯è¨çæä¸ç³»åè´¨æ°ç代ç ãè´¨æ°æ¯æåªè½è¢«èªèº«å1æ´é¤çèªç¶æ°ï¼å¦2ï¼3ï¼5ï¼7çã
ä¸åçç¼ç¨è¯è¨æä¸åçå®ç°æ¹æ³ï¼æå¯ä»¥ç»ä½ ä¸äºåèã以ä¸æ¯ä¸äºç½ä¸æç´¢å°çè´¨æ°è¡¨ä»£ç 示ä¾ï¼
Cè¯è¨ï¼
#includestdio.hintmain(){ ?inti,j;?printf("2\n");?for(i=3;i=;i+=2)//ä»3å¼å§éåå¥æ°
{ for(j=3;ji;j++)//å¤ææ¯å¦è½è¢«å°äºå®çå¥æ°æ´é¤{ ?if(i%j==0)//å¦æè½æ´é¤ï¼åè·³åºå¾ªç¯
break;
}if(j==i)//å¦æ循ç¯æ£å¸¸ç»æï¼å说ææ¯è´¨æ°ï¼æå°åºæ¥
printf("%d\n",i);}?return0;}
Pythonï¼
#!/usr/bin/python#-*-coding:UTF-8-*-
#è¾åºæå®èå´å çç´ æ°
#ç¨æ·è¾å ¥æ°æ®lower=int(input("è¾å ¥åºé´æå°å¼:"))
upper=int(input("è¾å ¥åºé´æ大å¼:"))
fornuminrange(lower,upper+1):?#ç´ æ°å¤§äº1
ifnum1:foriinrange(2,num):?if(num%i)==0:breakelse:?print(num)
Python教程:1天教你学会用Python实现「贪吃蛇」游戏~
学习Python实现贪吃蛇游戏,这将是你对Python语言认识的一次有趣实践。让我们一起探索如何将编程变成一种娱乐,而不仅仅是一种技术学习。
回顾童年,动画片和游戏是我们的欢乐源泉。如今,借助Python这种强大的编程语言,我们可以将儿时记忆中的贪吃蛇游戏亲手重现。通过使用Python的第三方库和框架,如freegames和turtle,辅助网络验证源码我们将深入学习如何将随机生成的食物和蛇的移动实现游戏逻辑。
这门课程旨在以趣味学习为主线,引领大家快速掌握Python技术知识。我们将在课程中探讨:
1. 如何安装Python的第三方库,以便为我们的游戏提供更多功能。
2. Turtle绘图框架的运用,让我们能够直观地在屏幕上绘制出贪吃蛇和食物。
3. Freegames游戏实现框架,通过它,我们将构建出完整的贪吃蛇游戏。
我们的主讲教师,金牌讲师刘老师,有着丰富的软件开发和教育经验。他的教学风格注重实战驱动,理论与实践紧密结合。你将从他的课程中收获深入的Python知识,并在实践中提高解决问题的能力。
赶快加入今晚的课程,让我们一起在Python的世界里探索贪吃蛇游戏的奥秘吧!
如何用Python写一个贪吃蛇AI
如何用Python写一个贪吃蛇AI
前言
最近在网上看到一张让人涨姿势的,中展示的是贪吃蛇游戏,估计大部分人都玩过。但如果仅仅是贪吃蛇游戏,那么它就没有世差含什么让人涨姿势的地方了。问题的关键在于,中的贪吃蛇真的很贪吃XD,它把矩形中出现的食物吃了个遍,然后华丽丽地把整个矩形填满,真心是看得赏心悦目。作为一个CSer,第一个想到的是,这东西是写程序实现的(因为,一般人干不出这事。果断是要让程序来干的)第二个想到的是,写程序该如何实现,该用什么算法?既然开始想了,就开始做。ssm分页源码下载因为Talk is cheap,要show me the code才行。 (从耗子叔那学来的)开始之前,让我们再欣赏一下那只让人涨姿势的贪吃蛇吧:(如果下面的动态浏览效果不佳的话,可以右键保存下来查看)
语言选择
Life is short, use python!所以,根本就没多想,直接上python。最初版本先让你的程序跑起来首先,我们第一件要做的就是先不要去分析这个问题。你好歹先写个能运行起来的贪吃蛇游戏,然后再去想AI部分。这个应该很简单,cc++也就百来行代码(如果我没记错的话。不弄复杂界面,直接在控制台下跑),python就更简单了,去掉注释和空行,5、行代码就搞定了。而且,最最关键的,这个东西网上肯定写滥了,你没有必要重复造轮子,去弄一份来按照你的意愿改造一下就行了。
简单版本
我觉得直接写perfect版本不是什么好路子。因为perfect版本往往要考虑很多东西,直接上来就写这个一般是bug百出的。所以,一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而已。现在让我们来陈述一下最初的问题:
在一个矩形中,每一时刻有一个食物,贪吃蛇要在不撞到自己的条件下,找到一条路(未必要最优),然后沿着这条路运行,去享用它的美食。
我们先不去想蛇会越来越长这个事实,问题基本就是,给你一个起点(蛇头)和一个终点(食物),要避开障碍物(蛇身),从起点找到一条可行路到达终点。
我们可以用的方法有:BFSDFSA*只要有选择,就先选择最简单的方案,我们现在的目标是要让程序先跑起来,优化是后话。so,从BFS开始。我们最初将蛇头位置放入队列,然后只要队列非空,就将队头位置出队,然后把它四领域内的4个点放入队列,不断地循环操作,直到到达食物的位置。这个过程中,我们需要注意几点:
1.访问过的点不再访问。
2.保存每个点的父结点(即每个位置是从哪个位置走到它的,这样我们才能把可行路径找出来)。
3.蛇身所在位置和四面墙不可访问。
通过BFS找到食物后,只需要让蛇沿着可行路径运动即可。这个简单版本写完后,贪吃蛇就可以很欢快地运行一段时间了。看图吧:(不流畅的感觉来自录屏软件@_@)
为了尽量保持简单,我用的是curses模块,直接在终端进行绘图。从上面的动态可以看出,每次都单纯地使用BFS,最终有一天,贪吃蛇会因为这种不顾后果的短视行为而陷入困境。而且,即使到了那个时候,它也只会BFS一种策略,导致因为当前看不到目标(食物),认为自己这辈子就这样了,破罐子破摔,最终停在它人生中的某一个点,不再前进。(我好爱讲哲理XD)
BFS+Wander
上一节的简单版本跑起来后,我们认识到,只教贪吃蛇一种策略是不行的。它这么笨一条蛇,你不多教它一点,它分分钟就会挂掉的。所以,我写了个Wander函数,顾名思义,当贪吃蛇陷入困境后,就别让它再BFS了,而是让它随便四处走走,散散心,思考一下人生什么的。这个就好比你困惑迷茫的时候还去工作,效率不佳不说,还可能阻碍你走出困境;相反,这时候你如果放下手中的工作,停下来,出去旅个游什么的。回来时,说不定就豁然开朗,土地平旷,屋舍俨然了。Wander函数怎么写都行,但是肯定有优劣之分。我写了两个版本,一个是在可行的范围内,朝随机方向走随机步。也就是说,蛇每次运动的方向是随机出来的,总共运动的步数也是随机的。Wander完之后,再去BFS一下,看能否吃到食物,如果可以那就皆大欢喜了。如果不行,说明思考人生的时间还不够,再Wander一下。这样过程不断地循环搜笑进行。可是就像“随机过程随机过”一样,你“随机Wander就随机挂”。会Wander的蛇确实能多走好多步。可是有一天,它就会把自己给随机到一条死路上了。陷入困境还可以Wander,进入死胡同,那可没有回滚机制。所以,第二个版本的Wander函数,我就让贪吃蛇贪到底。在BFS无解后,告诉蛇一个步数step(随机产生step),让它在空白区域以S形运动step步。这回运动方向就不随机了,而是有组织有纪律地运动。先看图,然后再说说它的问题:
没错,最终还是挂掉了。S形运动也是无法让贪吃蛇避免死亡的命运。贪吃蛇可以靠S形运动多存活一段时间,可是由于它的策略是:
1. 目标是食物时,走最短路径
2. 目标是蛇尾时,走最长路径
那第三种情况呢?与食物和蛇尾都没路径存在的情况下,这个时候本来就只是挑一步可行的步子来走,最短最长关系都不大了。至于人为地让蛇走S形,我觉得这不是什么好策略,最初版本中已经分析过它的问题了。 (当然,除非你想使用最最无懈可击的那个版本,就是完全不管食物,让蛇一直走S,然后在墙边留下一条过道即可。这样一来,蛇总是可以完美地把所有食物吃完,然后占满整个空间,可是就很boring了。没有任何的意思)
上面还提到一个问题:因为食物是随机出现的,有没可能出现无解的布局?答案是:有。我运行了程序,然后把每一次布局都输出到log,发现会有这样的情况:
# # # # # # #
* * * * * #
* * - 0 * #
* * # + * #
* * * * * #
* * * * * #
# # # # # # #
其中,+号是蛇头,-号是蛇尾,*号是蛇身,0是食物,#号代表空格,外面一圈#号代表墙。这个布局上,食物已经在蛇头面前了,可是它能吃吗?不能!因为它吃完食物后,长度加1,蛇头就会把0的位置填上,布局就变成:
# # # # # # #
* * * * * #
* * - + * #
* * # * * #
* * * * * #
* * * * * #
# # # # # # #
此时,由于蛇的长度加1,蛇尾没有动,而蛇头被自己围着,挂掉了。可是,我们却还有一个空白的格子#没有填充。按照我们之前教给蛇的策略,面对这种情况,蛇头就只会一直追着蛇尾跑,每当它和食物有路径时,它让虚拟的蛇跑一遍发现,得到的新布局是不安全的,所以不会去吃食物,而是选择继续追着蛇尾跑。然后它就这样一直跑,一直跑。死循环,直到你按ESC键为止。由于食物是随机出现的,所以有可能出现上面这种无解的布局。当然了,你也可以得到完满的结局,贪吃蛇把整个矩形都填充满。上面的最后一个问题,暴力法是否能得到最优序列。从上面的分析看来,可以得到,但不能保证一定得到。最后,看看高瞻远瞩的蛇是怎么跑的吧:
矩形大小*,除去外面的边框,也就是8*。Linux下录完屏再转成GIF格式的,优化前多M,真心是没法和Windows的比。用下面的命令优化时,有一种系统在用生命做优化的感觉:
Shell
convert output.gif -fuzz % -layers Optimize optimised.gif
最后还是拿到Windows下用AE,三下五除二用序列合成的动态 (记得要在format options里选looping,不然是不会循环播放的)
Last but not least如果对源代码感兴趣,请戳以下的链接:
Code goes here
另外,本文的贪吃蛇程序使用了curses模块,类Unix系统都默认安装的,使用Windows的童鞋需要安装一下这个模块,送上地址:
需要curses请戳我
以上的代码仍然可以继续改进(现在加注释不到行,优化一下可以更少),