数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标。

游戏代码由浙江温州永嘉县教师发展中心应根球老师提供,我略做修改和优化。

代码有点长,用手机阅读可能不太方便,可以复制地址到电脑上用浏览器查看。

import random

#显示数字拼图

def disp(s, d):

#s和d是两个数字字符串,把0换成空格,把数字摆放到指定位置

s = ''.join(s).replace('0', ' ')

d = ''.join(d).replace('0', ' ')

print('''

+---+---+---+        +---+---+---+

| {0[0]} | {0[1]} | {0[2]} |        | {1[0]} | {1[1]} | {1[2]} |

|---+---+---|        |---+---+---|

| {0[3]} | {0[4]} | {0[5]} |   ==>  | {1[3]} | {1[4]} | {1[5]} |

|---+---+---|        |---+---+---|

| {0[6]} | {0[7]} | {0[8]} |        | {1[6]} | {1[7]} | {1[8]} |

|---+---+---|        |---+---+---|

'''.format(s, d))

#移动数字

def move(s, numstr):

if (numstr not in "12345678") or (not numstr):

return

t1 = s.index('0')

t2 = s.index(numstr)

#字符在字符串中的位置除3的商对应游戏图中的行下标

#除3的余数对应游戏图中的列下标

t = zip(divmod(t1,3), divmod(t2,3))

t = ''.join([str(abs(i-j)) for i,j in t])

#如果输入的数字与空格相邻则移动

if t in ('01','10'):

s[t1], s[t2] = s[t2], s[t1]

#获取空格周边可移动数字

def getMoveable(s):

#空格位置的行、列坐标

p, q = divmod(s.index('0'), 3)

#空格上下的位置坐标

ls = [(p, i) for i in (q+1, q-1) if i in range(3)]

#空给左右的位置坐标

ls += [(i, q) for i in (p+1, p-1) if i in range(3)]

return ls

#爬山算法状态计算函数,从当前状态s到终态d所需要的总步数

def getInstance(s,d):

#依次计算s和d中相同数字的距离,并求所有距离之和

sumi = 0

for n in '12345678':

t1 = divmod(s.index(n), 3)

t2 = divmod(d.index(n), 3)

sumi += abs(t1[0]-t2[0]) + abs(t1[1]-t2[1])

return sumi

#让机器根据与目标各数字差距之和的策略选定一个移动数字

def choiceNum(s, moveable, d):

tmp = [100,'0']

for i in moveable:

s1 = s[::]

s1[s1.index('0')], s1[s1.index(i)] = i, '0'

getI = getInstance(s1, d)

if getI < tmp[0]:

tmp = getI, i

elif getI == tmp[0]:

tmp = getI, random.choice([i, tmp[1]])

return tmp[1]

#打乱数字拼图顺序,以得到初始状态

def shufflemove(d, times):

s2 = d[::]

mov = '0'

for i in range(times):

mov1 = mov

mov = [s2[x[0]*3+x[1]] for x in getMoveable(s2)]

if mov1 in mov:

mov.remove(mov1)

mov = random.choice(mov)

move(s2, mov)

return s2

#做题,当who为computer时为计算机解题

#当who为human,即非computer时,人工解题

def do(s, d, who):

s1 = s[::]

num = ''

bushu = 0

while True:

if who != 'computer':

disp(s1,d)

#已成功、步数太大或人工放弃时返回

if s1==d or bushu>=1000 or num=='0':

return bushu

#确定可输入的数字

n_of_m = [s1[x[0]*3+x[1]] for x in getMoveable(s1)]

if who == 'computer':

#机器答题不允许后退

if num in n_of_m:

n_of_m.remove(num)

num = choiceNum(s, n_of_m, d)

else:

#人工答题允许后退

prompt = '第{0}步{1}(输入0退出)=>'.format(bushu, n_of_m)

num = input(prompt)[0]

#输入0步数设为999,视为主动放弃并退出

if num == '0':

bushu = 999

#移动数字

move(s1,num)

bushu += 1

#主程序开始

print('-'*34)

print('拼图游戏'.center(34,'*'))

print('''

**玩法:左边的图通过移动空格相邻的数字到

空格处,最终得到右边的图,游戏即完成。只

要输入空格相邻的数字,该数字即被移到空格

处。=>左边的数字为你已经移动的步数及你可

移动的数字。完成任务的步数越少,你的游戏

成绩越高。祝你幸运!

''')

print('-'*34)

#为简化,设定固定数字目标,其中0显示为空方块

d = list('123804765')

#为简化,让机器从目标开始随机逆移动,先只移动6步

#也可以设置难度,移动步数越多,恢复越难。

s = shufflemove(d,6)

#先让计算机用简易爬山算法去解题,由于爬山算法本身的原因,不一定能得到最优解

cpstep = do(s, d, 'computer')

#显示开始与结束状态及机器解题情况

disp(s, d)

print('这个题目机器用了{0}步!\n'.format(cpstep))

if cpstep > 1000:

print("机器用了1000步还没解出,看你的了!\n")

#用于计人工移动的步数

bushu = 0

#人工解题开始

hmstep = do(s, d, 'human')

#显示游戏结果

if hmstep < cpstep:

print("你胜利,真了不起!")

elif hmstep == cpstep:

print("你与机器持平局,加油!")

else:

print("哈,你输给了机器,这可是用爬山算法哦!")

某次玩游戏的过程如下

Python编写的数字拼图游戏(含爬山算法人机对战功能)相关推荐

  1. python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...

    数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标. 游戏代码由浙江温州永嘉县教师发展中心应根球老师 ...

  2. android小游戏源码拼图,android编写的数字拼图游戏(带详细注释)

    [实例简介]自己正在学android,编写了一个简单的数字拼图游戏,有详细注释,适合初学者参考使用,比较简单易懂 [实例截图] [核心代码] package com.tsu; import java. ...

  3. python编写猜大小游戏_python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...

  4. c++编写手机小游戏代码_只需22行代码,用python编写自己的小游戏

    假期最后一天,有些人在外面玩累了,有些人躺在家里快发霉了,闲暇时候不如动动手做个小游戏玩一玩吧! 本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 1 import ...

  5. Python Tkinter——数字拼图游戏详解版

    Python Tkinter 实践系列--数字拼图游戏详解版 import random #Python中的random是一个标准库用于生成随机数.随机整数.还有随机从数据集取数据. import t ...

  6. Python Tkinter——数字拼图游戏

    Python Tkinter 实践系列--数字拼图游戏 tkinter模块,掌握窗口创建.消息循环等tkinter的基本架构 读取并显示图片,处理键盘事件 导入random库,导入python中的tk ...

  7. python编写猜数字游戏

    一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...

  8. 用python 编写一个简单的游戏

    This blog will memory my work and process with the interesting skill. 用python 编写一个简单的游戏 这是一个非常简单的游戏, ...

  9. python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏

    Python编写贪吃蛇 前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前.看来大家对这类简单易上手小游戏还是很喜爱的. 恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉, ...

最新文章

  1. 模型(Model)– ASP.NET MVC 4 系列
  2. 这种奇奇怪怪的符号,只能用latex打出来,如果实在不行,>---|-->>也行
  3. linux编译避免污染源码分离,如何避免linux上的系统标准C/C++库?
  4. FPGA RAM存储器设计
  5. 一张图30分钟带你入门python-大数据时代来了!神级程序员一张图帮你梳理Python脉络,快速入门...
  6. php 跨天 时间差 秒,判断时间是否在预设跨天时段
  7. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
  8. 感悟Microsoft summer Camp 2010
  9. Ubuntu小技巧13--grep命令详解
  10. 洛谷题集——乒乓球(思维、乒乓球比赛规则)
  11. 年龄识别之ssrnet
  12. Java实现获取long类型的随机数
  13. 外贸人如何从SiteGround购买建站外贸主机
  14. 人工智能学习笔记20221008
  15. 【论文笔记】Regional Differential Information Entropy for Super-Resolution ImageQuality Assessment
  16. Python输出斐波拉契数列
  17. 柔性塑料漆的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. [转帖]希捷硬盘的命名规范
  19. 无线路由器文件服务器,TP-Link无线路由器设置USB网络共享的方法图文详细介绍...
  20. 响铃:厉害了中国古人!原来,我们3000年前就有了机器人

热门文章

  1. echart 高度 不用 不撑满_你担心的高度近视老了之后是这样的
  2. java安装路径_java环境变量和查看安装路径
  3. qmenu基本用法_使用QProxyStyle定制QMenu (二)
  4. pads中如何设置等长_标签打印软件中标签间距以及边距如何设置
  5. java unicode32_【JAVA SE基础篇】32.String类入门
  6. oracle 12c cdb/pdb tnsnames.ora设置
  7. linux禁止内核抢占,Linux内核态抢占机制分析
  8. 三元一次方程组步骤_姜红梅名师工作室【教学感悟】三元一次方程组解法的思考...
  9. php t double arrow,php – 语法错误,意外T_DOUBLE_ARROW
  10. mysql中索引创建 查看和删除语句_MySQL如何创建和删除索引?