14
2024
11

python编程学习-华容道

学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。

可以在线运行,效果如下(在新页面中打开链接):

代码如下(用到平台自定义的xdf库):

from xdf import *

cw = 192
ox = 2
oy = 2
curHr = None
isPlaying = True

def ij2xy(i, j):
    return (j * cw + ox, i * cw + oy)

def xy2ij(x, y):
    return (int((y - oy)//cw), int((x - ox)//cw))

class Hero:
    def __init__(self):
        global cw
        self.cw = cw
        self.I = 0
        self.J = 0
        self.x = 0
        self.y = 0
        self.w = 0
        self.h = 0
        self.fsize = self.cw * 0.5
        self.b = None
        
    def update(self):
        self.b.move(self.x + self.w * 0.5, self.y + self.h * 0.5)
    
    def setIJ(self, i, j):
        self.I = i
        self.J = j
        xy = ij2xy(self.I, self.J)
        self.x = xy[0]
        self.y = xy[1]
        self.update()
        
    def choose(self):
        self.b.change("green", "red")
        
    def unChoose(self):
        self.b.change("blue", "white")
        
    def tryMoveTo(self, i, j):
        return False
    
    def moveTo(self, i, j):
        pass

class Caocao(Hero):
    def __init__(self):
        Hero.__init__(self)
        self.w = self.cw * 2
        self.h = self.cw * 2
        self.b = box(0, 0, self.w, self.h, "blue", "white")
        self.t = text("曹操", 0, 0, self.fsize, "red", "center")
    
    def update(self):
        super().update()
        self.t.move(self.x + self.w * 0.5, self.y + (self.h + self.fsize) * 0.5)
    
    def tryMoveTo(self, i, j):
        if mp[i][j] == None:
            if i == self.I - 1:
                if mp[i][self.J] == None and mp[i][self.J + 1] == None:
                    self.moveTo(i, self.J)
                    return True
                return False
            if i == self.I + 2:
                if mp[i][self.J] == None and mp[i][self.J + 1] == None:
                    self.moveTo(i - 1, self.J)
                    return True
                return False
            if j == self.J - 1:
                if mp[self.I][j] == None and mp[self.I + 1][j] == None:
                    self.moveTo(self.I, j)
                    return True
                return False
            if j == self.J + 2:
                if mp[self.I][j] == None and mp[self.I + 1][j] == None:
                    self.moveTo(self.I, j - 1)
                    return True
                return False
        return False
    
    def moveTo(self, i, j):
        mp[self.I][self.J] = None
        mp[self.I][self.J + 1] = None
        mp[self.I + 1][self.J] = None
        mp[self.I + 1][self.J + 1] = None
        mp[i][j] = self
        mp[i][j + 1] = self
        mp[i + 1][j] = self
        mp[i + 1][j + 1] = self
        self.setIJ(i, j)
        

class Guanyu(Hero):
    def __init__(self):
        Hero.__init__(self)
        self.w = self.cw * 2
        self.h = self.cw
        self.b = box(0, 0, self.w, self.h, "blue", "red")
        self.t = text("关羽", 0, 0, self.fsize, "red", "center")
    
    def update(self):
        super().update()
        self.t.move(self.x + self.w * 0.5, self.y + (self.h + self.fsize) * 0.5)
    
    def tryMoveTo(self, i, j):
        if mp[i][j] == None:
            if i == self.I:
                if j == self.J - 1:
                    self.moveTo(self.I, j)
                    return True
                if j == self.J + 2:
                    self.moveTo(self.I, j - 1)
                    return True
                return False
            if abs(i - self.I) == 1:
                if mp[i][self.J] == None and mp[i][self.J + 1] == None:
                    self.moveTo(i, self.J)
                    return True
                return False
        return False
    
    def moveTo(self, i, j):
        mp[self.I][self.J] = None
        mp[self.I][self.J + 1] = None
        mp[i][j] = self
        mp[i][j+1] = self
        self.setIJ(i, j)
        
class Zhangfei(Hero):
    def __init__(self):
        Hero.__init__(self)
        self.w = self.cw
        self.h = self.cw * 2
        self.b = box(0, 0, self.w, self.h, "blue", "red")
        self.t1 = text("张", 0, 0, self.fsize, "red", "center")
        self.t2 = text("飞", 0, 0, self.fsize, "red", "center")
    
    def update(self):
        super().update()
        self.t1.move(self.x + self.w * 0.5, self.y + self.h * 0.5 - self.fsize * 0.5)
        self.t2.move(self.x + self.w * 0.5, self.y + self.h * 0.5 + self.fsize * 0.5)
    
    def tryMoveTo(self, i, j):
        if mp[i][j] == None:
            if j == self.J:
                if i == self.I - 1:
                    self.moveTo(i, self.J)
                    return True
                if i == self.I + 2:
                    self.moveTo(i - 1, self.J)
                    return True
                return False
            if abs(j - self.J) == 1:
                if mp[self.I][j] == None and mp[self.I + 1][j] == None:
                    self.moveTo(self.I, j)
                    return True
                return False
        return False
    
    def moveTo(self, i, j):
        mp[self.I][self.J] = None
        mp[self.I + 1][self.J] = None
        mp[i][j] = self
        mp[i + 1][j] = self
        self.setIJ(i, j)
        
class Machao(Zhangfei):
    def __init__(self):
        Zhangfei.__init__(self)
        self.t1.change("马")
        self.t2.change("超")
        
class Zhaoyun(Zhangfei):
    def __init__(self):
        Zhangfei.__init__(self)
        self.t1.change("赵")
        self.t2.change("云")
        
class Huangzhong(Zhangfei):
    def __init__(self):
        Zhangfei.__init__(self)
        self.t1.change("黄")
        self.t2.change("忠")

class Bing(Hero):
    def __init__(self):
        Hero.__init__(self)
        self.w = self.cw
        self.h = self.cw
        self.b = box(0, 0, self.w, self.h, "blue", "red")
        self.t = text("兵", 0, 0, self.fsize, "red", "center")
    
    def update(self):
        super().update()
        self.t.move(self.x + self.w * 0.5, self.y + (self.h + self.fsize) * 0.5)
    
    def tryMoveTo(self, i, j):
        if mp[i][j] == None:
            if i == self.I and abs(j - self.J) == 1:
                self.moveTo(i, j)
                return True
            if j == self.J and abs(i - self.I) == 1:
                self.moveTo(i, j)
                return True
        return False
    
    def moveTo(self, i, j):
        mp[self.I][self.J] = None
        mp[i][j] = self
        self.setIJ(i, j)

caocao = Caocao()
guanyu = Guanyu()
zhangfei = Zhangfei()
machao = Machao()
zhaoyun = Zhaoyun()
huangzhong = Huangzhong()
bing1 = Bing()
bing2 = Bing()
bing3 = Bing()
bing4 = Bing()
txt = text("恭喜过关", 200, "yellow", "center")
txt.hide()
mp = []

def reset():
    global isPlaying, mp, curHr, txt
    global zhangfei, caocao, machao, zhaoyun, guanyu, huangzhong
    global bing1, bing2, bing3, bing4
    txt.hide()
    mp = [
        [zhangfei, caocao, caocao, machao]
        ,[zhangfei, caocao, caocao, machao]
        ,[zhaoyun, guanyu, guanyu, huangzhong]
        ,[zhaoyun, bing2, bing3, huangzhong]
        ,[bing1, None, None, bing4]
    ]
    zhangfei.setIJ(0, 0)
    caocao.setIJ(0, 1)
    machao.setIJ(0, 3)
    zhaoyun.setIJ(2, 0)
    guanyu.setIJ(2, 1)
    huangzhong.setIJ(2, 3)
    bing1.setIJ(4, 0)
    bing2.setIJ(3, 1)
    bing3.setIJ(3, 2)
    bing4.setIJ(4, 3)
    isPlaying = True
    if curHr != None:
        curHr.unChoose()
    curHr = None

def checkWin():
    global isPlaying
    if caocao.I == 3 and caocao.J == 1:
        isPlaying = False
        txt.show()
    
def loop():
    pass

def tap():
    global isPlaying, mp, curHr
    if not isPlaying:
        reset()
        return
    ij = xy2ij(x, y)
    if ij[0] < 0 or ij[0] > 4 or ij[1] < 0 or ij[1] > 3:
        return
    hr = mp[ij[0]][ij[1]]
    if hr == curHr:
        return
    if hr == None:
        if curHr != None:
            if curHr.tryMoveTo(ij[0], ij[1]):
                checkWin()
    else:
        if curHr:
            curHr.unChoose()
        curHr = hr
        curHr.choose()

reset()


也可以下载代码,本地python环境运行(用pygame封装了xdf库)。



« 上一篇下一篇 »

相关文章:

python编程学习-四子棋  (2024-11-15 11:30:32)

python编程学习-动画  (2024-11-14 16:39:37)

python编程学习-别踩白块  (2024-11-14 16:38:59)

python编程学习-俄罗斯方块  (2024-11-14 16:38:19)

python编程学习-井字棋  (2024-11-14 16:34:9)

python编程学习-五子棋  (2024-11-14 16:33:23)

python编程学习-乒乓  (2024-11-14 16:32:46)

python编程学习-一笔画关卡生成  (2024-11-14 16:32:6)

python编程学习-一笔画  (2024-11-14 16:31:27)

python编程学习-woblox  (2024-11-14 16:30:47)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。