学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * SW = 768 SH = 1024 m = 8 n = 8 CW = SW // m CH = CW R = CW // 2 - 2 OX = (SW - CW * m) / 2 OY = (SH - CH * n) / 2 def ij2xy(i, j): return [OX + i * CW + CW / 2, OY + (n - 1 - j) * CH + CH / 2] def xy2ij(x, y): return [int((x - OX) / CW), n - 1 - int((y - OY) / CH)] fill("bg15") qipan = [] for i in range(m): qipan.append([]) for j in range(n): xy = ij2xy(i, j) qipan[i].append([ 0, circle(xy[0], xy[1], R, "white"), circle(xy[0], xy[1], R, "red"), circle(xy[0], xy[1], R, "green") ]) tfOver = text("", SW / 2, 100, 60, "red", "center") isOver = False player = 1 qiNum = 0 def win(): global isOver tfOver.change("你赢了") tfOver.show() isOver = True def lose(): global isOver tfOver.change("我赢了") tfOver.show() isOver = True def heqi(): global isOver tfOver.change("和棋") tfOver.show() isOver = True def reset(): global isOver,player, qiNum isOver = False player = 1 qiNum = 0 tfOver.hide() for i in range(m): for j in range(n): qipan[i][j][0] = 0 qipan[i][j][2].hide() qipan[i][j][3].hide() def showQi1(i, j): qipan[i][j][0] = 1 qipan[i][j][2].show() def showQi2(i, j): qipan[i][j][0] = 2 qipan[i][j][3].show() drs = [[1, 0], [0, 1], [1, 1], [1, -1]] def checkWin(i, j): global player for dr in drs: if checkDir(i, j, dr): if player == 1: win() else: lose() break def isNotOut(i, j): return i >= 0 and i < m and j >= 0 and j < n def getSameNum(i, j, dr, v): num = 0 for ii in range(1, 4): i1 = i + dr[0] * ii j1 = j + dr[1] * ii if isNotOut(i1, j1) and qipan[i1][j1][0] == v: num += 1 else: break return num def checkDir(i, j, dr): return getSameNums(i, j, dr, qipan[i][j][0]) >= 3 def getSameNums(i, j, dr, v): dr1 = [-dr[0], -dr[1]] n1 = getSameNum(i, j, dr, v) n2 = getSameNum(i, j, dr1, v) return n1 + n2 def checkOver(): global isOver, qiNum, m, n if not isOver and qiNum == m * n: heqi() def tap(): global isOver, player if isOver: reset() return if player == 1: turn1() def turn1(): ij = xy2ij(x, y) i = ij[0] if i >= 0 and i < m: putOn(i) def putOn(i): global player,qiNum, isOver j = getEmpty(i) if j >= 0: if player == 1: showQi1(i, j) qiNum += 1 else: showQi2(i, j) qiNum += 1 checkWin(i, j) checkOver() if not isOver: if player == 1: player = 2 delay(turn2, 2000) else: player = 1 def getEmpty(i): for j in range(n): if qipan[i][j][0] == 0: return j return -1 scoresTable = [0, 10, 50, 200, 10000] def getScore(i, j): sc = 0 num = 0 for dr in drs: num = min(4, getSameNums(i, j, dr, 1)) sc += scoresTable[num] num = min(4, getSameNums(i, j, dr, 2)) sc += scoresTable[num] * 2 return sc def turn2(): arr = getEmptys() maxSc = 0 maxPos = arr[0] for pos in arr: sc = getScore(pos[0], pos[1]) if sc > maxSc: maxSc = sc maxPos = pos putOn(maxPos[0]) def getEmptys(): arr = [] for i in range(m): j = getEmpty(i) if j >= 0: arr.append([i, j]) return arr reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。