Python 一步一步教你用pyglet制作汉诺塔游戏(终篇

self.array = [[*range(order)], [], []]
self.arraymacro = []
def move(self, pole1, pole2):
if self.array[pole1]:
bead = self.array[pole1].pop()
if self.array[pole2] and bead<self.array[pole2][-1]:
self.array[pole1].append(bead)
return False
else:
return None
self.beads[bead].move((pole2-pole1)*self.space, (len(self.array[pole2])-len(self.array[pole1]))self.beadheight)
self.array[pole2].append(bead)
self.steps += 1
self.click = True
self.macro.append((pole1, pole2))
self.arraymacro.append([array[:] for array in self.array])
return True
def set_color(self, n, color=Color[0]):
self.click = color==Color[0]
self.disk[n].cir1.color = color
self.disk[n].cir2.color = color
self.disk[n].rect.color = color
self.pole[n].color = color
def on_mouse_over(self, x, y):
for i in range(-1,2):
if hanns.x-hanns.width/2 < x-i
hanns.space < hanns.x+hanns.width/2 and hanns.y-hanns.thickness/2 < y < hanns.y+hanns.poleheight:
return i+1
def success(self):
return len(self.array[2]) == self.order

def hanoi(n, start=0, mid=1, end=2, moves=None):
if moves is None:
moves = []
if n == 1:
moves.append((start, end))
else:
hanoi(n-1, start, end, mid, moves)
moves.append((start, end))
hanoi(n-1, mid, start, end, moves)
return moves

def hanoimacro(n, start=0, mid=1, end=2, moves=None):
global macro, array
if moves is None:
moves = []
array = [[*range(n)],[],[]]
macro = [[[*range(n)],[],[]]]
if n == 1:
moves.append((start, end))
array[end].append(array[start].pop())
macro.append([disk[:] for disk in array])
else:
hanoimacro(n-1, start, end, mid, moves)
moves.append((start, end))
array[end].append(array[start].pop())
macro.append([disk[:] for disk in array])
hanoimacro(n-1, mid, start, end, moves)
return macro

@window.event
def on_draw():
window.clear()
batch.draw()

@window.event
def on_mouse_press(x, y, dx, dy):
global hanns, gamestarting, gamecompleted
if not gamestarting:
gamestarting = True
show_message(False)
return
elif hanns.playback:
return
if not hanns.success():
pole = hanns.on_mouse_over(x, y)
if pole is not None:
hanns.posxy.append(pole)
if len(hanns.posxy)==1:
hanns.set_color(hanns.posxy[0], (200,150,0))
if not hanns.array[pole]:
hanns.set_color(hanns.posxy[0])
hanns.posxy.pop()
return
if len(hanns.posxy)==2:
if hanns.posxy[0]!=hanns.posxy[1]:
info = hanns.move(*hanns.posxy)
hanns.set_color(hanns.posxy[0])
if info:
info1.text = information(3)
else:
info1.text = information(6)
hanns.set_color(hanns.posxy[0])
hanns.posxy.clear()
info2.text = information()
if hanns.success():
if hanns.order<24:
info1.text = information(4)
else:
info1.text = information(5)
gamecompleted = True
return
elif not gamecompleted:
hanns = Hann(hanns.order+1)
info1.text = information(0)
info2.text = information(2)

@window.event
def on_key_press(symbol, modifiers):
global hanns, macro, gamestarting
def show_how(event):
if macro:
hanns.move(*macro.pop(0))
info2.text = information()
else:
info1.text = info1.text.replace(‘中…’, ‘完成!’)
hanns.playback = False
pyglet.clock.unschedule(show_how)
if not gamestarting:
gamestarting = True
show_message(False)
return
if hanns.playback:
if symbol in (key.B, key.BREAK) and modifiers & key.MOD_CTRL:
macro.clear()
info1.text = info1.text.replace(‘中…’, ‘终止,’)+‘游戏继续!’
return
if hanns.macro and hanns.click and not hanns.success() and symbolkey.Z and modifiers & key.MOD_CTRL:
hanns.ctrlz = not hanns.ctrlz
hanns.posxy = hanns.macro.pop()[::-1]
info = hanns.move(hanns.posxy)
hanns.steps -= 2
hanns.ctrlz
hanns.posxy = []
elif symbol == key.H and modifiers & key.MOD_CTRL:
gamestarting = False
show_message(True)
elif symbol == key.R and modifiers & key.MOD_CTRL:
if hanns.steps:
hanns = Hann(hanns.order)
info1.text = information(0)
elif symbol == key.N and modifiers & (key.MOD_CTRL | key.MOD_SHIFT) and modifiers & key.MOD_SHIFT:
if hanns.order>2:
hanns = Hann(hanns.order-1)
info1.text = information(0)
else:
info1.text = information(7)
elif symbol == key.N and modifiers & key.MOD_CTRL and not modifiers & key.MOD_SHIFT:
if hanns.order<24:
hanns = Hann(hanns.order+1)
info1.text = information(0)
else:
info1.text = information(8)
elif symbol in (key.S, key.P) and modifiers & key.MOD_CTRL:
macro = hanns.macro
hanns = Hann(hanns.order)
hanns.playback = True
if symbol
key.S:
task = ‘演示中…’
macro = hanoi(hanns.order)
elif symbol==key.P:
task = ‘回放中…’
info1.text = f’{hanns.order} 层汉诺塔{task}’
pyglet.clock.schedule_interval(show_how, 9/(hanns.order**2+9))
info2.text = information()

def show_message(visible=True):
box1.visible = box2.visible = html.visible = visible
info1.text = information(0)

def messagebox():
global box1, box2, html
rect = 150, 90, 500, 330
box1 = pyglet.shapes.Rectangle(*rect, color=(255,255,255,200), batch=batch, group=group)
box2 = pyglet.shapes.Box(*rect, color=(255,0,0,255), thickness=3, batch=batch, group=group)
html = pyglet.text.HTMLLabel(text=hypertext, multiline=True, width=Width//2, x=Width//2, y=240, batch=batch, group=group)
html.anchor_x = html.anchor_y = ‘center’

def information(info=2):
if info0:
return f’{hanns.order} 层汉诺塔,游戏开始!’
elif info
1:
return ‘点击任意键开始…’
elif info2:
return f’当前层数:{hanns.order:<12}最佳步数:{2**hanns.order-1:<12}当前步数:{hanns.steps:>9}’
elif info
3:
return f’{hanns.order-hanns.array[hanns.posxy[1]][-1]}号圆盘从{hanns.posxy[0]+1}号塔架移动到{hanns.posxy[1]+1}号塔架’
elif info4:
return f’恭喜您完成 {hanns.order} 层汉诺塔!任意点击层数加一!’
elif info
5:
return f’太棒了!您已完成 {hanns.order} 层汉诺塔,游戏全部通关!’
elif info6:
return ‘起始圆盘大于目标位置的圆盘’
elif info
7:
return f’程序设置的最小层数是 2’
elif info==8:
return f’程序设置的最大层数是 {hanns.ordermax}’

hanns = Hann(order=2)
hypertext = ‘’‘汉诺塔 Tower of Hanoi


汉诺塔是一个源于印度的古老传说的益智玩具。这个传说
讲述了大梵天创造世界的时候做了三根金刚石柱子,并在

一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大
梵天命令婆罗门将这些圆盘按照大小顺序重新摆放到另一

根柱子上(左边搬到右边,中间临时存放),规定大圆盘不
能放在小圆盘上,且一次只能移动一个圆盘。



操作方法:先后点击塔架,就能移动塔架上的圆盘


Ctrl+Z 取消操作    Ctrl+R 重新开始
Ctrl+S 自动演示    Ctrl+P 操作回放

Ctrl+B 终止操作    Ctrl+H 帮助消息
Ctrl+N 增减层数(同时按Shift键为减)
’‘’
info1 = pyglet.text.Label(information(1), font_size=21, color=(0,0,0,255), x=400, y=40, anchor_x=‘center’, batch=batch)
info2 = pyglet.text.Label(information(2), font_size=16, font_name=‘宋体’, color=(0,0,0,255), x=70, y=450, batch=batch)
gamestarting, gamecompleted = False, False
messagebox()
pyglet.app.run()

其中记录移动的宏暂未用到,进一步开发会用到:

def hanoimacro(n, start=0, mid=1, end=2, moves=None):
    global macro, array
    if moves is None:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-s3vavfup-1712428067622)]

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值