❶ scratch貪吃蛇製作教程
scratch貪吃蛇製作教程如下:
1、游戲工亮輪作過程。鍵盤主要控制貪吃蛇的頭部移動,尾巴是沿著軌跡移動就行。貪吃蛇的身體,是用程序畫筆模塊敬差信畫出來的。如果頭部吃到食物,就給游戲分數加分。
6、最終游戲效果:點擊「綠色旗子」開始游戲,按下鍵盤的方向鍵,控制貪吃蛇移動。
吃到食物時,變數「游戲分數」就會加1分。
classPoint:
row=0
col=0
def__init__(self,row,col):
self.row=row
self.col=col
def(self):
returnPoint(row=self.row,col=self.col)
#初始框架
importpygame
importrandom
#初始化
pygame.init()
W=800
H=600
ROW=30
COL=40
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('貪吃蛇')
bg_color=(255,255,255)
snake_color=(200,200,200)
head=Point(row=int(ROW/2),col=int(COL/2))
head_color=(0,128,128)
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)
]
#生成食物
defgen_food():
while1:
pos=Point(row=random.randint(0,ROW-1),col=random.randint(0,COL-1))
#
is_coll=False
#是否跟蛇碰上了
ifhead.row==pos.rowandhead.col==pos.col:
is_coll=True
#蛇身子
forsnakeinsnakes:
ifsnake.row==pos.rowandsnake.col==pos.col:
is_coll=True
break
ifnotis_coll:
break
returnpos
#定義坐標
food=gen_food()
food_color=(255,255,0)direct='left'#left,right,up,down
#
defrect(point,color):
cell_width=W/COL
cell_height=H/ROW
left=point.col*cell_width
top=point.row*cell_height
pygame.draw.rect(
window,color,
(left,top,cell_width,cell_height)
)
pass
#游戲循環
quit=True
clock=pygame.time.Clock()
whilequit:
#處理事件
foreventinpygame.event.get():
ifevent.type==pygame.QUIT:
quit=False
elifevent.type==pygame.KEYDOWN:
ifevent.key==273orevent.key==119:
ifdirect=='left'ordirect=='right':
direct='up'
elifevent.key==274orevent.key==115:
ifdirect=='left'ordirect=='right':
direct='down'
elifevent.key==276orevent.key==97:
ifdirect=='up'ordirect=='down':
direct='left'
elifevent.key==275orevent.key==100:
ifdirect=='up'ordirect=='down':
direct='right'
#吃東西
eat=(head.row==food.rowandhead.col==food.col)
#重新產生食物
ifeat:
food=gen_food()
#處理身子
#1.把原來的頭,插入到snakes的頭上
snakes.insert(0,head.())
#2.把snakes的最後一個刪掉
ifnoteat:
snakes.pop()
#移動
ifdirect=='left':
head.col-=1
elifdirect=='right':
head.col+=1
elifdirect=='up':
head.row-=1
elifdirect=='down':
head.row+=1
#檢測
dead=False
#1.撞牆
ifhead.col<0orhead.row<0orhead.col>=COLorhead.row>=ROW:
dead=True
#2.撞自己
forsnakeinsnakes:
ifhead.col==snake.colandhead.row==snake.row:
dead=True
break
ifdead:
print('死了')
quit=False
#渲染——畫出來
#背景
pygame.draw.rect(window,bg_color,(0,0,W,H))
#蛇頭
forsnakeinsnakes:
rect(snake,snake_color)
rect(head,head_color)
rect(food,food_color)
#
pygame.display.flip()
#設置幀頻(速度)
clock.tick(8)
#收尾工作
這是一個簡易版貪吃蛇的代碼,雖然結構簡單,但是該有的功能都是完整的,可玩性也不錯
❸ 請用PYTHON編一個小游戲,如五子棋,連連看,貪吃蛇,掃雷,計算器等等
#!/usr/bin/python
from Tkinter import *
import random
class snake(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.body = [(0,0)]
self.bodyid = []
self.food = [ -1, -1 ]
self.foodid = -1
self.gridcount = 10
self.size = 500
self.di = 3
self.speed = 500
self.top = self.winfo_toplevel()
self.top.resizable(False, False)
self.grid()
self.canvas = Canvas(self)
self.canvas.grid()
self.canvas.config(width=self.size, height=self.size,relief=RIDGE)
self.drawgrid()
s = self.size/self.gridcount
id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s,
(self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow")
self.bodyid.insert(0, id)
self.bind_all("<KeyRelease>", self.keyrelease)
self.drawfood()
self.after(self.speed, self.drawsnake)
def drawgrid(self):
s = self.size/self.gridcount
for i in range(0, self.gridcount+1):
self.canvas.create_line(i*s, 0, i*s, self.size)
self.canvas.create_line(0, i*s, self.size, i*s)
def drawsnake(self):
s = self.size/self.gridcount
head = self.body[0]
new = [head[0], head[1]]
if self.di == 1:
new[1] = (head[1]-1) % self.gridcount
elif self.di == 2:
new[0] = (head[0]+1) % self.gridcount
elif self.di == 3:
new[1] = (head[1]+1) % self.gridcount
else:
new[0] = (head[0]-1) % self.gridcount
next = ( new[0], new[1] )
if next in self.body:
exit()
elif next == (self.food[0], self.food[1]):
self.body.insert(0, next)
self.bodyid.insert(0, self.foodid)
self.drawfood()
else:
tail = self.body.pop()
id = self.bodyid.pop()
self.canvas.move(id, (next[0]-tail[0])*s, (next[1]-tail[1])*s)
self.body.insert(0, next)
self.bodyid.insert(0, id)
self.after(self.speed, self.drawsnake)
def drawfood(self):
s = self.size/self.gridcount
x = random.randrange(0, self.gridcount)
y = random.randrange(0, self.gridcount)
while (x, y) in self.body:
x = random.randrange(0, self.gridcount)
y = random.randrange(0, self.gridcount)
id = self.canvas.create_rectangle(x*s,y*s, (x+1)*s, (y+1)*s, fill="yellow")
self.food[0] = x
self.food[1] = y
self.foodid = id
def keyrelease(self, event):
if event.keysym == "Up" and self.di != 3:
self.di = 1
elif event.keysym == "Right" and self.di !=4:
self.di = 2
elif event.keysym == "Down" and self.di != 1:
self.di = 3
elif event.keysym == "Left" and self.di != 2:
self.di = 4
app = snake()
app.master.title("Greedy Snake")
app.mainloop()
貪食蛇
❹ 如何用慧編程做貪吃蛇代碼
用慧編程做貪吃蛇代碼過程如下:
1、我們需要建立四個頭文件,然後分別設置蛇的狀態,上下左右,這是蛇能夠有方向可走的前提,然後我們再設置蛇身的節點,定義一個簡單的函數,這樣蛇的全身以及他的行走方向就弄完了。
2、貪吃蛇不能穿牆代碼。
3、第二步,一個函數這個函數的目的是貪吃蛇不能穿牆,很簡單的代碼分別設置長寬的最大位移,在內部范圍內設置為一即可通過,否則不能穿牆。貪吃蛇隨機生成一個食物。
4、設置一個隨機函數。這樣貪吃蛇代碼就做好了。
慧編程是一款面向STEAM教育領域的積木式和代碼編程軟體,基於圖形化編程開發。
❺ 如何用Python寫一個貪吃蛇AI
首先,讓我們羅列一些問題: (像頭腦風暴那樣,想到什麼就寫下來即可)
蛇和食物間有路徑直接就去吃,不可取。那該怎麼辦?
如果蛇去吃食物後,布局是安全的,是否就直接去吃?(這樣最優嗎?)
怎樣定義布局是否安全?
蛇和食物之間如果沒有路徑,怎麼辦?
最短路徑是否最優?(這個明顯不是了)
那麼,如果布局安全的情況下,最短路徑是否最優?
除了最短路徑,我們還可以怎麼走?S形?最長?
怎麼應對蛇身越來越長這個問題?
食物是隨機出現的,有沒可能出現無解的布局?
暴力法(brute force)能否得到最優序列?(讓貪吃蛇盡可能地多吃食物)
只要去想,問題還挺多的。這時讓我們以面向過程的思想,帶著上面的問題,
把思路理一理。一開始,蛇很短(初始化長度為1),它看到了一個食物, 使用 BFS 得到矩形中每個位置到達食物的最短路徑長度。在沒有蛇身阻擋下,
就是曼哈頓距離。然後,我要先判斷一下,貪吃蛇這一去是否安全。 所以我需要一條虛擬的蛇,它每次負責去探路。如果安全,才讓真正的蛇去跑。
當然,虛擬的蛇是不會繪制出來的,它只負責模擬探路。那麼, 怎麼定義一個布局是安全的呢? 如果你把文章開頭那張動態圖片中蛇的銷魂走位好好的看一下,
會發現即使到最後蛇身已經很長了,它仍然沒事一般地走出了一條路。而且, 是跟著蛇尾走的!嗯,這個其實不難解釋,蛇在運動的過程中,消耗蛇身,
蛇尾後面總是不斷地出現新的空間。蛇短的時候還無所謂,當蛇一長, 就會發現,要想活下來,基本就只能追著蛇尾跑了。在追著蛇尾跑的過程中,
再去考慮能否安全地吃到食物。(下圖是某次 BFS 後,得到的一個布局, 0 代表食物,數字代表該位置到達食物的距離,+號代表蛇頭,*號代表蛇身,
-號代表蛇尾,#號代表空格,外面的一圈#號代表圍牆)
# # # # # # #
# 0 1 2 3 4 #
# 1 2 3 # 5 #
# 2 3 4 - 6 #
# 3 + * * 7 #
# 4 5 6 7 8 #
# # # # # # #
經過上面的分析,我們可以將布局是否安全定義為蛇是否可以跟著蛇尾運動, 也就是蛇吃完食物後,蛇頭和蛇尾間是否存在路徑,如果存在,我就認為是安全的。
OK,繼續。真蛇派出虛擬蛇去探路後,發現吃完食物後的布局是安全的。那麼,
真蛇就直奔食物了。等等,這樣的策略好嗎?未必。因為蛇每運動一步, 布局就變化一次。布局一變就意味著可能存在更優解。比如因為蛇尾的消耗,
原本需要繞路才能吃到的食物,突然就出現在蛇眼前了。所以,真蛇走一步後, 更好的做法是,重新做 BFS。然後和上面一樣進行安全判斷,然後再走。
接下來我們來考慮一下,如果蛇和食物之間不存在路徑怎麼辦? 上文其實已經提到了做法了,跟著蛇尾走。只要蛇和食物間不存在路徑, 蛇就一直跟著蛇尾走。同樣的,由於每走一步布局就會改變, 所以每走一步就重新做 BFS 得到最新布局。
好了,問題又來了。如果蛇和食物間不存在路徑且蛇和蛇尾間也不存在路徑,
怎麼辦?這個我是沒辦法了,選一步可行的路徑來走就是了。還是一個道理, 每次只走一步,更新布局,然後再判斷蛇和食物間是否有安全路徑;
沒有的話,蛇頭和蛇尾間是否存在路徑;還沒有,再挑一步可行的來走。
上面列的好幾個問題里都涉及到蛇的行走策略,一般而言, 我們會讓蛇每次都走最短路徑。這是針對蛇去吃食物的時候,
可是蛇在追自己的尾巴的時候就不能這么考慮了。我們希望的是蛇頭在追蛇尾的過程中,
盡可能地慢。這樣蛇頭和蛇尾間才能騰出更多的空間,空間多才有得發展。 所以蛇的行走策略主要分為兩種:
1. 目標是食物時,走最短路徑
2. 目標是蛇尾時,走最長路徑
那第三種情況呢?與食物和蛇尾都沒路徑存在的情況下, 這個時候本來就只是挑一步可行的步子來走,最短最長關系都不大了。
至於人為地讓蛇走S形,我覺得這不是什麼好策略,最初版本中已經分析過它的問題了。 (當然,除非你想使用最最無懈可擊的那個版本,就是完全不管食物,
讓蛇一直走S,然後在牆邊留下一條過道即可。這樣一來, 蛇總是可以完美地把所有食物吃完,然後占滿整個空間,可是就很 boring 了。
沒有任何的意思)
上面還提到一個問題:因為食物是隨機出現的,有沒可能出現無解的局面? 答案是:有。我運行了程序,然後把每一次布局都輸出到 log,發現會有這樣的情況:
# # # # # # #
# * * * * * #
# * * - 0 * #
# * * # + * #
# * * * * * #
# * * * * * #
# # # # # # #
其中,+號是蛇頭,-號是蛇尾,*號是蛇身,0 是食物,#號代表空格,外面一圈# 號代表牆。這個布局上,食物已經在蛇頭面前了,可是它能吃嗎?不能! 因為它吃完食物後,長度加1,蛇頭就會把 0 的位置填上,布局就變成:
# # # # # # #
# * * * * * #
# * * - + * #
# * * # * * #
# * * * * * #
# * * * * * #
# # # # # # #
此時,由於蛇的長度加1,蛇尾沒有動,而蛇頭被自己圍著,掛掉了。可是, 我們卻還有一個空白的格子#沒有填充。按照我們之前教給蛇的策略,
面對這種情況,蛇頭就只會一直追著蛇尾跑,每當它和食物有路徑時, 它讓虛擬的蛇跑一遍發現,得到的新布局是不安全的,所以不會去吃食物,
而是選擇繼續追著蛇尾跑。然後它就這樣一直跑,一直跑。死循環, 直到你按 ESC 鍵為止。
由於食物是隨機出現的,所以有可能出現上面這種無解的布局。當然了, 你也可以得到完滿的結局,貪吃蛇把整個矩形都填充滿。
上面的最後一個問題,暴力法是否能得到最優序列。從上面的分析看來, 可以得到,但不能保證一定得到。
最後,看看高瞻遠矚的蛇是怎麼跑的吧: