Python实现, 命令行下的拼图游戏


需求:

现在要做这样一个拼图游戏, 有一个九宫格, 其中有8个方块, 还有一个空位, 点击其中一个方块, 它会往空位移动... 顺序排列8个方块则游戏通关

结构规划:

游戏数据结构

玩家操作

逻辑部分

通关检测

输出部分

主程序

实现构思:

  1. 用字母 A, B, C, ... H 表示8个方块; 字母 I 表示第9个宫格, 即空位, 它实质上也是个方块

    拼图数据结构是由一系列字典元素构成的: {1:[...],2:[]...,9:[]}, 其中KEY number表示正确的位置信息

    字典元素是一个列表, 包含: [拼图符号, 实时位置信息, 状态标志(空/非空)]

    当点击其中一个位置的方块时, 如果周围的方块存在KEY x or y[n+1][2]==0,则修改该方块和空格的->当前位置信息及状态标志, 也就是和KEY x or y交换当前位置信息及状态标志. (反过来也可以检测:标志为0周围可移动的方块)

    直到所有元素都通过正确的位置信息验证, 其中KEY9 的状态一直是 0, 并且是空方块

    用 Python 实现, 操作:输入某个方块(A), 程序移动(A)方块, 打印出结果,源码如下:

    #!/usr/bin/python
    #-*-coding:utf-8-*-
    
    importrandom
    importsys
    fromcopyimportdeepcopy
    
    #生成随机拼图
    jigsaw=[chr(i)foriinrange(65,74)]
    random.shuffle(jigsaw)
    
    palace={}
    foriinrange(9):
    ifjigsaw[i]=='I':
    palace[i+1]=(['',i+1,0])
    else:
    palace[i+1]=([jigsaw[i],i+1,1])
    
    #测试用数据
    #palace={1:['A',1,1],2:['B',2,1],3:['C',3,1],4:['D',4,1],5:['E',5,1],6:['F',6,1],7:['G',7,1],8:['',8,0],9:['H',9,1]}
    
    #移动方块
    defmove_square(square,pledic):
    in_switch=bool()
    zero_switch=bool()
    
    fork,vinpledic.items():
    pledic[k][1]=k
    
    #玩家操作,移动的方块(输入的字符)
    ifv[0]==square:
    in_key=k
    in_val=v
    in_switch=True
    
    #找到字符所在,并作标记
    ifv[2]==0:
    zero=v[1]
    zero_k=k
    zero_v=v
    zero_switch=True
    
    ifzero_switch==in_switch:
    #与空方块交换位置
    ifzero%3==in_val[1]%3andabs(zero-in_val[1])<=3:
    pledic[in_key],pledic[zero_k]=zero_v,in_val
    ifabs(zero-in_val[1])==1and((zero+in_val[1])-1)%3!=0:
    pledic[in_key],pledic[zero_k]=zero_v,in_val
    
    returnpledic
    
    #游戏检测
    defcheck_palace(dic):
    right_count=0
    ifdic[9][2]==0:
    fork,vindic.items():
    ifk==ord(v[0])-64:
    right_count+=1
    ifright_count==8:
    returnTrue
    returnFalse
    
    #输出
    defprint_palace(dic):
    printdic[1][0],dic[2][0],dic[3][0]
    printdic[4][0],dic[5][0],dic[6][0]
    printdic[7][0],dic[8][0],dic[9][0]
    
    #进行游戏
    defplay_palace(palace):
    ple=deepcopy(palace)
    print_palace(ple)
    play_dic={}
    
    whileTrue:
    try:
    square=raw_input('inputA-H:')
    iford(square.upper())>=65andord(square.upper())<=74:
    play_dic=move_square(square.upper(),ple)
    print_palace(play_dic)
    ifcheck_palace(play_dic):
    break
    else:
    print'Pleaseagaininput'
    exceptTypeError:
    print'Pleaseagaininput'
    continue
    
    print"AllRight!YouWin!!"
    sys.exit()
    
    
    if__name__=='__main__':
    play_palace(palace)

     

    最后执行结果,得出如下图

    $python9palace.py
    DF
    GCH
    EAB
    inputA-H:f
    DF
    GCH
    EAB
    inputA-H:c
    DCF
    GH
    EAB
    inputA-H:

    相关内容

      暂无相关文章

    评论关闭