Python罗汉塔

部署运行你感兴趣的模型镜像
#!/usr/bin/python                                                                                                                    
# -*- coding: UTF-8 -*-                                                                                                              
#Python 2.7.5                                                                                                                        
print "尚省独家赞助"                                                                                                                 
#from __future__ import print_function                                                                                               
                                                                                                                                     
class HanoiTower:                                                                                                                    
    def __init__(self):                                                                                                              
        self.left = []                                                                                                               
        self.center = []                                                                                                             
        self.right = []                                                                                                              
        self.size = 0                                                                                                                
        self.count = 0                                                                                                               
                                                                                                                                     
    def init(self):                                                                                                                  
        """初始化游戏,设置层数并初始化塔"""                                                                                         
        while True:                                                                                                                  
            try:                                                                                                                     
                size = int(raw_input("请输入层数(1-10): "))                                                                          
                if 1 <= size <= 10:                                                                                                  
                    self.size = size                                                                                                 
                    self.left = [i*2-1 for i in range(size, 0, -1)]                                                                  
                    self.center = []                                                                                                 
                    self.right = []                                                                                                  
                    break                                                                                                            
                else:                                                                                                                
                    print("层数需在1-10之间!")                                                                                       
            except ValueError:                                                                                                       
                print("请输入有效整数!")                                                                                             
                                                                                                                                     
        return self.size                                                                                                             
                                                                                                                                     
    def print_tower(self, tower):                                                                                                    
        """打印单个塔的一层"""                                                                                                       
        tower_str = []                                                                                                               
        for disk in tower:                                                                                                           
            if disk != -1:                                                                                                           
                # 计算空格和X的数量                                                                                                  
                spaces = self.size - (disk - 1) // 2                                                                                 
                tower_str.append(" " * spaces + "X" * disk + " " * spaces)                                                           
            else:                                                                                                                    
                # 空位置用竖线表示                                                                                                   
                tower_str.append(" " * self.size + "|" + " " * self.size)                                                            
        return tower_str                                                                                                             
                                                                                                                                     
    def show(self):                                                                                                                  
        """显示当前游戏状态"""                                                                                                       
        print("-" * (self.size * 6 + 9))                                                                                             
                                                                                                                                     
        # 补齐所有塔到相同长度                                                                                                       
        left_display = self.left + [-1] * (self.size - len(self.left))                                                               
        center_display = self.center + [-1] * (self.size - len(self.center))                                                         
        right_display = self.right + [-1] * (self.size - len(self.right))                                                            
                                                                                                                                     
        for i in range(self.size):                                                                                                   
            left_str = self.print_tower([left_display[i]])[0]                                                                        
            center_str = self.print_tower([center_display[i]])[0]                                                                    
            right_str = self.print_tower([right_display[i]])[0]                                                                      
            print("%s  %s  %s" % (left_str, center_str, right_str))                                                                  
                                                                                                                                     
        print("-" * (self.size * 6 + 9))                                                                                             
        print("左塔: 1  中塔: 2  右塔: 3")                                                                                           
                                                                                                                                     
    def is_valid_move(self, from_tower, to_tower):                                                                                   
        """判断移动是否有效"""                                                                                                       
        if not from_tower:  # 源塔为空                                                                                               
            return False                                                                                                             
        if not to_tower:  # 目标塔为空,可以移动                                                                                     
            return True                                                                                                              
        # 源塔顶部小于目标塔顶部时可以移动                                                                                           
        return from_tower[-1] < to_tower[-1]                                                                                         
                                                                                                                                     
    def move_disk(self, from_tower, to_tower):                                                                                       
        """移动圆盘并更新状态"""                                                                                                     
        if self.is_valid_move(from_tower, to_tower):                                                                                 
            disk = from_tower.pop()                                                                                                  
            to_tower.append(disk)                                                                                                    
            self.count += 1                                                                                                          
            return True                                                                                                              
        return False                                                                                                                 
                                                                                                                                     
    def main(self):                                                                                                                  
        """主游戏循环"""                                                                                                             
        size = self.init()                                                                                                           
        min_steps = 2 ** size - 1                                                                                                    
                                                                                                                                     
        print("将左塔完整地移到右塔就是胜利!")                                                                                       
        print("左-1 中-2 右-3  退出请输入:quit")                                                                                     
        print('例如输入:"1-2"就是将左塔的最上元素放到中塔')                                                                          
        print("%d层的最佳步数是%d" % (size, min_steps))                                                                              
                                                                                                                                     
        while True:                                                                                                                  
            print("当前移动了%d步" % self.count)                                                                                     
            self.show()                                                                                                              
                                                                                                                                     
            # 检查胜利条件                                                                                                           
            if self.right == [i*2-1 for i in range(size, 0, -1)]:                                                                    
                if self.count == min_steps:                                                                                          
                    print("恭喜你使用最少步数%d完成汉诺塔!" % min_steps)                                                             
                else:                                                                                                                
                    print("恭喜你移动了%d步完成汉诺塔小游戏!" % self.count)                                                          
                break                                                                                                                
                                                                                                                                     
            # 获取玩家操作                                                                                                           
            select = raw_input("请操作: ").strip().lower()                                                                           
                                                                                                                                     
            if select == "quit":                                                                                                     
                break                                                                                                                
                                                                                                                                     
            if select in ["1-2", "1-3", "2-1", "2-3", "3-1", "3-2"]:                                                                 
                from_tower_id, to_tower_id = map(int, select.split('-'))                                                             
                                                                                                                                     
                # 映射到对应的塔列表                                                                                                 
                towers = {1: self.left, 2: self.center, 3: self.right}                                                               
                from_tower = towers[from_tower_id]                                                                                   
                to_tower = towers[to_tower_id]                                                                                       
                                                                                                                                     
                if not self.move_disk(from_tower, to_tower):                                                                         
                    print("操作无效!")                                                                                               
            else:                                                                                                                    
                print("操作有误!")                                                                                                   
                                                                                                                                     
if __name__ == "__main__":                                                                                                           
    while True:                                                                                                                      
        game = HanoiTower()                                                                                                          
        game.main()                                                                                                                  
                                                                                                                                     
        replay = raw_input("是否再来一局? (y/n): ").strip().lower()                                                                  
        if replay != 'y':                                                                                                            
            break

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值