为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python


需求:

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

结构规划:

游戏数据结构

玩家操作

逻辑部分

通关检测

输出部分

主程序

实现构思:

用字母 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 -*-

import random

import sys

from copy import deepcopy

# 生成随机拼图

jigsaw = [chr(i) for i in range(65,74)]

random.shuffle(jigsaw)

palace = {}

for i in range(9):

    if jigsaw[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]}

# 移动方块

def move_square(square, pledic):

    in_switch  = bool()

    zero_switch  = bool()

    for k,v in pledic.items():

        pledic[k][1] = k

        # 玩家操作, 移动的方块(输入的字符)

        if v[0] == square:

            in_key = k

            in_val = v

            in_switch = True

        # 找到字符所在, 并作标记

        if v[2] == 0:

            zero = v[1]

            zero_k = k

            zero_v = v

            zero_switch =True

    if zero_switch == in_switch:

        # 与空方块交换位置

        if zero % 3 == in_val[1] % 3 and abs(zero - in_val[1]) <= 3:

            pledic[in_key], pledic[zero_k] = zero_v, in_val

        if abs(zero - in_val[1]) == 1 and ((zero+in_val[1])-1)%3 != 0:

            pledic[in_key], pledic[zero_k] = zero_v, in_val

    return pledic

#  游戏检测

def check_palace(dic):

    right_count = 0

    if dic[9][2] == 0:

        for k,v in dic.items():

            if k == ord(v[0])-64:

                right_count +=1

        if right_count == 8:

            return True

    return False

# 输出

def print_palace(dic):

    print dic[1][0],dic[2][0],dic[3][0]

    print dic[4][0],dic[5][0],dic[6][0]

    print dic[7][0],dic[8][0],dic[9][0]

# 进行游戏

def play_palace(palace):

    ple = deepcopy(palace)

    print_palace(ple)

    play_dic={}

    while True:

        try:

            square = raw_input('input A-H:')

            if ord(square.upper()) >= 65 and ord(square.upper()) <= 74:

                play_dic = move_square(square.upper(), ple)

                print_palace(play_dic)

                if check_palace(play_dic):

                    break

            else:

                print 'Please again input'

        except TypeError:

            print 'Please again input'

            continue

    print "All Right! You Win!!"

    sys.exit()

if __name__=='__main__':

    play_palace(palace)

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

$ python 9palace.py  D F   G C H E A B input A-H:f D   F G C H E A B input A-H:c D C F G   H E A B input A-H:

©著作权归作者所有:来自51CTO博客作者kumikoda的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消