学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
cubes = []
data = []
M = 16
N = 12
W = 64
oxy=0.001
stepN = 20
count = 0
isOver = False
snake = []
face = 1
level = 1
score = 0
def ij2xy(i, j):
return (j * W+oxy, i * W+oxy)
def xy2ij(x, y):
return (int((x-oxy)//W), int((j-oxy)//W))
def ij2n(i, j):
return i * N + j
def n2ij(n):
return (int(n//N), n%N)
for i in range(M):
for j in range(N):
xy = ij2xy(i,j)
cb = box(xy[0],xy[1], W, W, "red")
cubes.append(cb)
data.append(0)
overTxt = text("Game Over", 100, "green", "center")
levalTxt = text("第1关", 1, 80, 50, "green")
scoreTxt = text("得分:0", 1, 150, 50, "green")
def reset():
global data, snake, isOver, overTxt, stepN, count, face
global level, score
n = len(data)
for i in range(n):
data[i] = 0
snake = [ij2n(9, 6),ij2n(8, 6),ij2n(7, 6)]
setBySnake()
isOver = False
overTxt.hide()
stepN = 20
count = 0
face = 1
level = 1
score = 0
addFood()
addFood()
def move():
global count, snake, face, data
count = 0
n = len(snake)
head = snake[n-1]
foot = snake[0]
ij = n2ij(head)
i = ij[0]
j = ij[1]
ti = i
tj = j
if face == 1:
ti -= 1
elif face == 2:
tj += 1
elif face == 3:
ti += 1
elif face == 4:
tj -= 1
#
tn = ij2n(ti, tj)
#
if ti < 0 or ti >= M or tj < 0 or tj >= N:
#print("撞墙了")
#print(i, j, n, tn)
#print(ti, tj, tn)
#print(head, foot)
#print(data)
#print(snake)
gameOver()
elif data[tn] == 1 and tn != foot:
#print("撞自己了")
#print(i, j, n, tn)
#print(ti, tj, tn)
#print(head, foot)
#print(data)
#print(snake)
gameOver()
elif data[tn] == 2:
snake.append(tn)
setBySnake()
addFood()
sddScore()
else:
clearBySnake()
for i in range(n-1):
snake[i] = snake[i + 1]
snake[n-1]=tn
setBySnake()
def sddScore():
global score, level, count, stepN, snake
score += 1
if len(snake) >= 13:
level += 1
count = 0
score += 10
if stepN > 1:
stepN -= 1
clearBySnake()
snake = [snake.pop(), snake.pop(), snake.pop()]
snake.reverse()
setBySnake()
def addFood():
global data
l = len(data)
n = random(l) - 1
while data[n] != 0:
n = random(l) - 1
data[n] = 2
def gameOver():
global isOver, overTxt
isOver = True
overTxt.show()
def setFace(v):
global face
if abs(v-face) == 2:
return
#if face == v:
# move()
face = v
move()
def keydown(keycode, key):
if keycode == 37:
setFace(4)
elif keycode == 38:
setFace(1)
elif keycode == 39:
setFace(2)
elif keycode == 40:
setFace(3)
elif keycode == 32:
global isOver
if isOver:
reset()
def keyup(keycode, key):
pass
def setBySnake():
updateBySnake(1)
def clearBySnake():
updateBySnake(0)
def updateBySnake(v):
global snake, data
l = len(snake)
for i in range(l):
n = snake[i]
data[n] = v
def loop():
global isOver, count, stepN, data, cubes, level, score
if isOver:
return
count += 1
if count >= stepN:
move()
n = len(data)
for i in range(n):
s = data[i]
if s == 2:
cubes[i].change("blue")
elif s == 1:
cubes[i].change("white")
else:
cubes[i].change("red")
levalTxt.change("第"+str(level)+"关")
scoreTxt.change("得分:"+str(score))
reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。