蛇貪吃-代碼
貪吃蛇問世五十年來,人們關注的重點都在蛇身上,而那顆食物只是靜置一隅,坐以待斃。
本游戲中,身份發(fā)生了反轉,你將扮演一顆“不安分”的食物,躲避兩條蛇的追捕。
代碼奉上。業(yè)余自學,無甚章法,還望指教~
####################
# 蛇貪吃 Moodie810 #
####################
from turtle import *
from random import choice
from time import sleep
b1 = [0, 1, 2, 3] ?# 綠色蛇蛇身,0為尾3為頭
b2 = [99, 98, 97, 96] ?# 紫色蛇蛇身
green = True ?# 綠色蛇是否活著(沒有繞進死路)
purple = True
flag = False ?# False為未找到通向食物的路徑,True為已找到
score = 0 ?# 得分,蛇每走一步加一分
cn = 4 ?# 食物走幾幀蛇走一步,從4逐漸減少,直至玩家跟不上[手動滑稽]
count = 0 ?# 食物走了凡幀
a = 44 ?# 食物位置
s = [] ?# 放格子實例
wal = set() ?# 放墻
p1 = [100] ?# 放尋得的一步路徑,因為不能為空所以隨便放個100
p2 = [100]
class Block(Turtle):
? ?def __init__(self):
? ? ? ?Turtle.__init__(self, shape='square')
? ? ? ?self.pu()
? ? ? ?self.color('white', 'silver')
def wall():
? ?for i in range(3):
? ? ? ?ch = set(range(100)) - {44} ?# 除去食物
? ? ? ?ch = ch - set(b1) ?# 除去綠蛇
? ? ? ?ch = ch - set(b2) ?# 除去紫蛇
? ? ? ?ch = ch - wal ?# 除去已設置的障礙
? ? ? ?ww = choice(list(ch))
? ? ? ?wal.add(ww)
? ?for i in wal:
? ? ? ?s[i].fillcolor('black')
def pressKeys():
? ?onkeypress(right, 'Right')
? ?onkeypress(down, 'Down')
? ?onkeypress(left, 'Left')
? ?onkeypress(up, 'Up')
def disable(): ?# 防誤觸
? ?onkeypress(None, 'Right')
? ?onkeypress(None, 'Down')
? ?onkeypress(None, 'Left')
? ?onkeypress(None, 'Up')
def right():
? ?global a
? ?disable()
? ?if a % 10 != 9 and a + 1 not in b1 + b2 and a + 1 not in wal:
? ? ? ?s[a].fillcolor('silver')
? ? ? ?a += 1
? ? ? ?s[a].fillcolor('red')
def down():
? ?global a
? ?disable()
? ?if a > 9 and a - 10 not in b1 + b2 and a - 10 not in wal:
? ? ? ?s[a].fillcolor('silver')
? ? ? ?a -= 10
? ? ? ?s[a].fillcolor('red')
def left():
? ?global a
? ?disable()
? ?if a % 10 != 0 and a - 1 not in b1 + b2 and a - 1 not in wal:
? ? ? ?s[a].fillcolor('silver')
? ? ? ?a -= 1
? ? ? ?s[a].fillcolor('red')
def up():
? ?global a
? ?disable()
? ?if a < 90 and a + 10 not in b1 + b2 and a + 10 not in wal:
? ? ? ?s[a].fillcolor('silver')
? ? ? ?a += 10
? ? ? ?s[a].fillcolor('red')
def detect(n, w, q): ?# 判斷v號方塊周圍方塊的狀態(tài)
? ?global flag
? ?if w[n] == 1:
? ? ? ?flag = True
? ? ? ?return 1
? ?elif w[n] == 2:
? ? ? ?w[n] = 0
? ? ? ?q.append(n)
? ? ? ?return 2
def BFS(start, end, p): ?# 蛇的尋路算法,參數(shù)為起點索引、終點索引、存儲路徑的表
? ?w = [2] * 100 ?# 列表w存放100個格子的狀態(tài),2為未搜索,1為終點,0為已搜索
? ?for i in b1 + b2: ?# 把蛇身標記為已搜索
? ? ? ?w[i] = 0
? ?for i in wal: ?# 把障礙標記為已搜索
? ? ? ?w[i] = 0
? ?w[end] = 1 ?# 標記終點
? ?q = [start] ?# 隊列初始化,加入起點
? ?f = [-1] * 100 ?# 列表f用于存放路徑,記錄每個格子“來自哪里”,-1為未存放
? ?while q:
? ? ? ?v = q[0]
? ? ? ?if 0 <= v + 1 <= 99 and v % 10 != 9: ?# 右邊
? ? ? ? ? ?r = detect(v + 1, w, q)
? ? ? ? ? ?if r == 1:
? ? ? ? ? ? ? ?break
? ? ? ? ? ?elif r == 2:
? ? ? ? ? ? ? ?f[v + 1] = v
? ? ? ?if 0 <= v + 10 <= 99: ?# 上方
? ? ? ? ? ?r = detect(v + 10, w, q)
? ? ? ? ? ?if r == 1:
? ? ? ? ? ? ? ?break
? ? ? ? ? ?elif r == 2:
? ? ? ? ? ? ? ?f[v + 10] = v
? ? ? ?if 0 <= v - 1 <= 99 and v % 10 != 0: ?# 左邊
? ? ? ? ? ?r = detect(v - 1, w, q)
? ? ? ? ? ?if r == 1:
? ? ? ? ? ? ? ?break
? ? ? ? ? ?elif r == 2:
? ? ? ? ? ? ? ?f[v - 1] = v
? ? ? ?if 0 <= v - 10 <= 99: ?# 下方
? ? ? ? ? ?r = detect(v - 10, w, q)
? ? ? ? ? ?if r == 1:
? ? ? ? ? ? ? ?break
? ? ? ? ? ?elif r == 2:
? ? ? ? ? ? ? ?f[v - 10] = v
? ? ? ?q.pop(0)
? ?while v != start:
? ? ? ?p[0] = v
? ? ? ?v = f[v]
def greenmove(to): ?# 綠蛇移動一格
? ?s[b1[0]].color('white', 'silver')
? ?s[b1[-1]].fillcolor('green')
? ?s[to].color('green', 'blue')
? ?b1.pop(0)
? ?b1.append(to)
def purplemove(to): ?# 紫蛇移動一格
? ?s[b2[0]].color('white', 'silver')
? ?s[b2[-1]].fillcolor('purple')
? ?s[to].color('purple', 'blue')
? ?b2.pop(0)
? ?b2.append(to)
setup(400, 300)
tracer(False) ?# 忽略繪制過程
setworldcoordinates(-100, -50, 283, 230)
for y in range(10): ?# 生成10*10場地,用s來裝這些格子,最左下索引為0,右上為99
? ?for x in range(10):
? ? ? ?s.append(Block())
? ? ? ?s[-1].goto(x * 20, y * 20)
for i in b1[:3]: ?# 繪制綠蛇,其中蛇頭為藍色
? ?s[i].color('green', 'green')
s[3].color('green', 'blue')
for i in b2[:3]:
? ?s[i].color('purple', 'purple')
s[96].color('purple', 'blue')
s[44].fillcolor('red') ?# 繪制食物
wall() ?# 生成障礙物
ht() ?# 計分功能
pu()
goto(-50, 80)
write(score, font=('Arial', 20))
update()
pressKeys()
listen()
while 1:
? ?if count is cn:
? ? ? ?count = 0
? ? ? ?if green:
? ? ? ? ? ?flag = False
? ? ? ? ? ?BFS(b1[-1], a, p1)
? ? ? ? ? ?if p1[0] in b1: ?# 如果尋得的路徑在蛇身中,不是吃到了就是繞死了
? ? ? ? ? ? ? ?s[b1[-1]].fillcolor('green')
? ? ? ? ? ? ? ?if flag:
? ? ? ? ? ? ? ? ? ?break
? ? ? ? ? ? ? ?else:
? ? ? ? ? ? ? ? ? ?green = False
? ? ? ? ? ? ? ? ? ?print('綠蛇繞死了!')
? ? ? ? ? ? ? ? ? ?continue
? ? ? ? ? ?greenmove(p1[0])
? ? ? ?# 綠蛇走過了,下面是紫蛇走
? ? ? ?if purple:
? ? ? ? ? ?flag = False
? ? ? ? ? ?BFS(b2[-1], a, p2)
? ? ? ? ? ?if p2[0] in b2:
? ? ? ? ? ? ? ?s[b2[-1]].fillcolor('purple')
? ? ? ? ? ? ? ?if flag:
? ? ? ? ? ? ? ? ? ?break
? ? ? ? ? ? ? ?else:
? ? ? ? ? ? ? ? ? ?purple = False
? ? ? ? ? ? ? ? ? ?print('紫蛇繞死了!')
? ? ? ? ? ? ? ? ? ?continue
? ? ? ? ? ?purplemove(p2[0])
? ? ? ?score += 1
? ?if score == 50: ?# 到50分加速
? ? ? ?cn = 3
? ?if score == 100: ?# 到100分再加速
? ? ? ?cn = 2
? ?count += 1
? ?clear()
? ?write(score, font=('Arial', 12))
? ?pressKeys()
? ?update()
? ?sleep(.03) ?# 動畫更新速度(單位:秒)
s[a].fillcolor('yellow')
update()
print('被吃到了哇!')
sleep(1)
bye()
少于200字竟然不能發(fā)?好,就硬湊。
不如說說游戲目前存在的問題。由于畫面是隔一小段時間刷新一次(如0.03秒),這里使用了time.sleep()函數(shù),因此在程序睡眠期間按鍵是沒有反應的。這就導致每按一次鍵,食物只會走一格,而不能通過長按來控制食物。
有待將來進一步學習……
標簽: