设为首页 收藏本站
查看: 770|回复: 0

[经验分享] Python实现, 命令行下的拼图游戏

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-1-7 09:24:28 | 显示全部楼层 |阅读模式
需求:

现在要做这样一个拼图游戏, 有一个九宫格, 其中有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)方块, 打印出结果,源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/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':
        palace[i+1]=([' ', i+1, 0])
    else:
        palace[i+1]=([jigsaw, 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:


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-161251-1-1.html 上篇帖子: python+arrow按月生成表 下篇帖子: Python 父类构建函数中字段,赋值等于子类中属性时;报错问题 拼图游戏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表