您的位置:首页 > 编程语言 > Python开发

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

2016-01-06 12:17 543 查看

需求:

现在要做这样一个拼图游戏, 有一个九宫格, 其中有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:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息