""" turtle-example-suite:tdemo_nim.pyPlay nim against the computer. The playerwho takes the last stick is the winner.Implements the model-view-controllerdesign pattern."""import turtleimport randomimport timeSCREENWIDTH = 640SCREENHEIGHT = 480MINSTICKS = 7MAXSTICKS = 31HUNIT = SCREENHEIGHT // 12WUNIT = SCREENWIDTH // ((MAXSTICKS // 5) * 11 + (MAXSTICKS % 5) * 2)SCOLOR = (63, 63, 31)HCOLOR = (255, 204, 204)COLOR = (204, 204, 255)def randomrow():return random.randint(MINSTICKS, MAXSTICKS)def computerzug(state):xored = state[0] ^ state[1] ^ state[2]if xored == 0:return randommove(state)for z in range(3):s = state[z] ^ xoredif s <= state[z]:move = (z, s)return movedef randommove(state):m = max(state)while True:z = random.randint(0,2)if state[z] > (m > 1):breakrand = random.randint(m > 1, state[z]-1)return z, randclass NimModel(object):def __init__(self, game):self.game = gamedef setup(self):if self.game.state not in [Nim.CREATED, Nim.OVER]:returnself.sticks = [randomrow(), randomrow(), randomrow()]self.player = 0self.winner = Noneself.game.view.setup()self.game.state = Nim.RUNNINGdef move(self, row, col):maxspalte = self.sticks[row]self.sticks[row] = colself.game.view.notify_move(row, col, maxspalte, self.player)if self.game_over():self.game.state = Nim.OVERself.winner = self.playerself.game.view.notify_over()elif self.player == 0:self.player = 1row, col = computerzug(self.sticks)self.move(row, col)self.player = 0def game_over(self):return self.sticks == [0, 0, 0]def notify_move(self, row, col):if self.sticks[row] <= col:returnself.move(row, col)class Stick(turtle.Turtle):def __init__(self, row, col, game):turtle.Turtle.__init__(self, visible=False)self.row = rowself.col = colself.game = gamex, y = self.coords(row, col)self.shape("square")self.shapesize(HUNIT/10.0, WUNIT/20.0)self.speed(0)self.pu()self.goto(x,y)self.color("white")self.showturtle()def coords(self, row, col):packet, remainder = divmod(col, 5)x = (3 + 11 * packet + 2 * remainder) * WUNITy = (2 + 3 * row) * HUNITreturn x - SCREENWIDTH // 2 + WUNIT // 2, SCREENHEIGHT // 2 - y - HUNIT // 2def makemove(self, x, y):if self.game.state != Nim.RUNNING:returnself.game.controller.notify_move(self.row, self.col)class NimView(object):def __init__(self, game):self.game = gameself.screen = game.screenself.model = game.modelself.screen.colormode(255)self.screen.tracer(False)self.screen.bgcolor((240, 240, 255))self.writer = turtle.Turtle(visible=False)self.writer.pu()self.writer.speed(0)self.sticks = {}for row in range(3):for col in range(MAXSTICKS):self.sticks[(row, col)] = Stick(row, col, game)self.display("... a moment please ...")self.screen.tracer(True)def display(self, msg1, msg2=None):self.screen.tracer(False)self.writer.clear()if msg2 is not None:self.writer.goto(0, - SCREENHEIGHT // 2 + 48)self.writer.pencolor("red")self.writer.write(msg2, align="center", font=("Courier",18,"bold"))self.writer.goto(0, - SCREENHEIGHT // 2 + 20)self.writer.pencolor("black")self.writer.write(msg1, align="center", font=("Courier",14,"bold"))self.screen.tracer(True)def setup(self):self.screen.tracer(False)for row in range(3):for col in range(self.model.sticks[row]):self.sticks[(row, col)].color(SCOLOR)for row in range(3):for col in range(self.model.sticks[row], MAXSTICKS):self.sticks[(row, col)].color("white")self.display("Your turn! Click leftmost stick to remove.")self.screen.tracer(True)def notify_move(self, row, col, maxspalte, player):if player == 0:farbe = HCOLORfor s in range(col, maxspalte):self.sticks[(row, s)].color(farbe)else:self.display(" ... thinking ... ")time.sleep(0.5)self.display(" ... thinking ... aaah ...")farbe = COLORfor s in range(maxspalte-1, col-1, -1):time.sleep(0.2)self.sticks[(row, s)].color(farbe)self.display("Your turn! Click leftmost stick to remove.")def notify_over(self):if self.game.model.winner == 0:msg2 = "Congrats. You're the winner!!!"else:msg2 = "Sorry, the computer is the winner."self.display("To play again press space bar. To leave press ESC.", msg2)def clear(self):if self.game.state == Nim.OVER:self.screen.clear()class NimController(object):def __init__(self, game):self.game = gameself.sticks = game.view.sticksself.BUSY = Falsefor stick in self.sticks.values():stick.onclick(stick.makemove)self.game.screen.onkey(self.game.model.setup, "space")self.game.screen.onkey(self.game.view.clear, "Escape")self.game.view.display("Press space bar to start game")self.game.screen.listen()def notify_move(self, row, col):if self.BUSY:returnself.BUSY = Trueself.game.model.notify_move(row, col)self.BUSY = Falseclass Nim(object):CREATED = 0RUNNING = 1OVER = 2def __init__(self, screen):self.state = Nim.CREATEDself.screen = screenself.model = NimModel(self)self.view = NimView(self)self.controller = NimController(self)def main():mainscreen = turtle.Screen()mainscreen.mode("standard")mainscreen.setup(SCREENWIDTH, SCREENHEIGHT)nim = Nim(mainscreen)return "EVENTLOOP"if __name__ == "__main__":main()turtle.mainloop()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。