学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
cubes = []
data = []
M = 16
N = 12
W = 64
oxy=0.001
isOver = False
lastTap = None
def ij2xy(i, j):
return (j * W+oxy, i * W+oxy)
def xy2ij(x, y):
return (int((y-oxy)//W), int((x-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)
hw = W / 2
gap = 5
fsize = hw
cb = [
box(xy[0],xy[1], W, W, "white", "black"),
box(xy[0] + gap,xy[1] + gap, hw - gap, W - gap * 2, "black"),
box(xy[0] + hw,xy[1] + gap, hw - gap, W - gap * 2, "black"),
circle(xy[0] + hw, xy[1] + hw, hw - gap, "red", "black"),
text("9", xy[0] + hw, xy[1] + hw + fsize / 2, fsize, "black", "center"),
box(xy[0] + gap + (W - gap * 2) * 0.15,
xy[1] + gap + (W - gap * 2) * 0.15,
(W - gap * 2) * 0.7,
(W - gap * 2) * 0.7, "red"),
0
]
cb[5].rotate(45)
cubes.append(cb)
data.append(0)
winTxt = text("You Win", 100, "green", "center")
overTxt = text("Game Over", 100, "red", "center")
neighbors = [
[-1, -1], [-1, 0], [-1, 1],
[0, -1], [0, 1],
[1, -1], [1, 0], [1, 1],
]
def isOpen(n):
global cubes
cb = cubes[n]
return cb[6] == 1
def isClose(n):
global cubes
cb = cubes[n]
return cb[6] == 0
def isOpenMine(n):
global cubes,data
cb = cubes[n]
return cb[6] == 1 and data[n] == -1
def isMark(n):
global cubes
cb = cubes[n]
return cb[6] == 2
def isOpenOrMark(n):
global cubes
cb = cubes[n]
return cb[6] == 2 or cb[6] == 1
# tp = 0 关闭,1 打开,2 标记
def showCb(n, tp):
global cubes, data
cb = cubes[n]
cb[0].show()
cb[1].hide()
cb[2].hide()
cb[3].hide()
cb[4].hide()
cb[5].hide()
cb[6] = tp
if tp == 0:
cb[1].show()
cb[2].show()
elif tp == 1:
if data[n] == -1:
cb[3].show()
else:
cb[4].show()
elif tp == 2:
cb[1].show()
cb[2].show()
cb[5].show()
def mineNum(i, j):
num = 0
global data,neighbors
for k in range(8):
a = neighbors[k]
ii = i + a[0]
jj = j + a[1]
if ii >= 0 and ii < M and jj >= 0 and jj < N:
n0 = ij2n(ii, jj)
if data[n0] == -1:
num = num + 1
return num
def initData():
global data, cubes
tn = M * N
for i in range(tn):
data[i] = 0
if random(9) == 5:
data[i] = -1
for i in range(tn):
if data[i] == 0:
ij = n2ij(i)
data[i] = mineNum(ij[0], ij[1])
for i in range(tn):
cb = cubes[i]
cb[4].change(str(data[i]))
showCb(i, 0)
#showCb(i, 1) # 直接处于打开状态,测试用
def reset():
global isOver, overTxt, winTxt
isOver = False
overTxt.hide()
winTxt.hide()
initData()
def gameOver():
global isOver, overTxt
isOver = True
overTxt.show()
def gameWin():
global isOver, winTxt
isOver = True
winTxt.show()
def keydown(keycode, key):
if keycode == 32:
global isOver
if isOver:
reset()
def keyup(keycode, key):
pass
#单击,标记
def delaySingleTap():
global lastTap
if lastTap != None:
singleTap(lastTap)
lastTap = None
# 标记
def singleTap(n):
showCb(n, 2) # 标记
checkWin()
# 双击打开
def doubleTap(n):
showCb(n, 1) # 打开
if isOpenMine(n):
gameOver()
else:
autoOpen(n)
checkWin()
def tap():
global isOver,lastTap
if isOver:
reset()
return
ij = xy2ij(x, y)
i = ij[0]
j = ij[1]
n = ij2n(i, j)
if isOpen(n):
return
if lastTap == None:
lastTap = n
delay(delaySingleTap, 300)
else:
#print(n, lastTap)
if n == lastTap:
doubleTap(n)
else:
# 点两下,没点到一个格子里
singleTap(lastTap)
singleTap(n)
lastTap = None
def loop():
pass
def autoOpen(n):
global data,cubes,neighbors
if data[n] == 0:
ij = n2ij(n)
i = ij[0]
j = ij[1]
for k in range(8):
a = neighbors[k]
ii = i + a[0]
jj = j + a[1]
if ii >= 0 and ii < M and jj >= 0 and jj < N:
n0 = ij2n(ii, jj)
if isClose(n0):
showCb(n0, 1) # 打开
autoOpen(n0)
def checkWin():
if isWin():
gameWin()
def isWin():
global data,cubes
tn = M * N
for i in range(tn):
v = data[i]
if v == -1: # 雷
if not isMark(i): # 没标记
return False
else: # 非雷
if not isOpen(i): # 没打开
return False
return True
reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。