学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * SW = 768 SH = 1024 m = 3 n = 3 CW = 200 CH = CW R = CW // 4 OX = (SW - CW * (m - 1)) / 2 OY = (SH - CH * (n - 1)) / 2 def ij2xy(i, j): return [OX + i * CW , OY + j * CH] def xy2ij(x, y): return [int((x - OX) / CW + 0.5), int((y - OY) / CH + 0.5)] def drawLine(i1, j1, i2, j2): xy1 = ij2xy(i1, j1) xy2 = ij2xy(i2, j2) line(xy1[0], xy1[1], xy2[0], xy2[1], 10, "black") drawLine(0, 0, 0, 2) drawLine(1, 0, 1, 2) drawLine(2, 0, 2, 2) drawLine(0, 0, 2, 0) drawLine(0, 1, 2, 1) drawLine(0, 2, 2, 2) drawLine(0, 0, 2, 2) drawLine(0, 2, 2, 0) def drawQizi(co): return circle(0, 0, R, "red" if co == 1 else "green") qz1 = drawQizi(1) qz2 = drawQizi(1) qz3 = drawQizi(1) qz4 = drawQizi(2) qz5 = drawQizi(2) qz6 = drawQizi(2) qiziArr = [] line(10) kuang = circle(0, 0, R, "transparent", "blue") data = [] isOver = False player = 1 xuanzhong = [] overTf = text("我赢了", SW / 2, 100, 60, "red", "center") def tap(): global isOver, player if isOver: return reset() if player == 1: turn1() def turn1(): global xuanzhong, data, qiziArr ij = xy2ij(x, y) i = ij[0] j = ij[1] if i < 0 or i > 2 or j < 0 or j > 2: return if not xuanzhong: if data[i][j] == 1: choose(i, j) else: if data[i][j] == 1: choose(i, j) elif data[i][j] == 0: if (abs(xuanzhong[0] - i) == 1 or abs(xuanzhong[1] - j) == 1): moveTo(i, j) checkWin() global isOver, player if not isOver: player = 2 turn2() def getPath2(d, v): a0 = findPath(d, v) return a0[random(len(a0))-1] def turn2(): global data p = getPath2(data, 2) delay(choose, 1000, p[0][0], p[0][1]) delay(moveTo2, 3000, p[1][0], p[1][1]) def moveTo2(i, j): moveTo(i, j) turn2Over() def doMove(d, p): i1 = p[0][0] j1 = p[0][1] i = p[1][0] j = p[1][1] d[i][j] = d[i1][j1] d[i1][j1] = 0 def cloneData(d): a0 = []; for i in range(len(d)): a0.append([]) for j in range(len(d[i])): a0[i].append(d[i][j]) return a0 def turn2Over(): checkWin() global isOver, player if not isOver: player = 1 def moveTo(i, j): global xuanzhong, data, qiziArr i1 = xuanzhong[0] j1 = xuanzhong[1] data[i][j] = data[i1][j1] data[i1][j1] = 0 qiziArr[i][j] = xuanzhong[2] qiziArr[i1][j1] = None setPos(xuanzhong[2], i, j) setPos(kuang, -100, 0) def choose(i, j): global xuanzhong, qiziArr xuanzhong = [i, j, qiziArr[i][j]] setPos(kuang, i, j) def checkWin(): global player, isOver if isWin(data, player): isOver = True if player == 1: overTf.change("你赢了") else: overTf.change("计算机赢了") def isWin(d, v): return isXie(d, v) or isNoPath(d, 2 if v == 1 else 1) def isXie(d, v): return (d[0][0] == v and d[1][1] == v and d[2][2] == v) or (d[2][0] == v and d[1][1] == v and d[0][2] == v) def isNoPath(d, v): a0 = findPath(d, v) return len(a0) == 0 neighbors = [ [[1, 0], [0, 1], [1, 1]], [[0, -1], [0, 1], [1, 0]], [[1, 0], [0, -1], [1, -1]], [[-1, 0], [1, 0], [0, 1]], [[-1, 0], [1, 0], [0, -1], [0, 1], [-1, -1], [1, 1], [-1, 1], [1, -1]], [[-1, 0], [1, 0], [0, -1]], [[-1, 0], [0, 1], [-1, 1]], [[0, -1], [0, 1], [-1, 0]], [[-1, 0], [-1, -1], [0, -1]] ] def isNotOut(i, j): return i >= 0 and i < 3 and j >= 0 and j < 3 def findPath(d, v): a0 = [] for i in range(3): for j in range(3): if d[i][j] == v: for ne in neighbors[i * 3 + j]: i1= i + ne[0] j1 = j + ne[1] if d[i1][j1] == 0: a0.append([[i, j], [i1, j1]]) return a0 def setPos(qz, i, j): xy = ij2xy(i, j) qz.move(xy[0], xy[1]) def reset(): global isOver, player, xuanzhong, data, qiziArr isOver = False player = 1 data = [[1,0,2],[1,0,2],[1,0,2]] qiziArr = [[qz1, None, qz4], [qz2, None, qz5], [qz3, None,qz6]] kuang.move(-100, 0) overTf.change("") setPos(qz1, 0, 0) setPos(qz2, 1, 0) setPos(qz3, 2, 0) setPos(qz4, 0, 2) setPos(qz5, 1, 2) setPos(qz6, 2, 2) reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。