Python编写的数字拼图游戏(含爬山算法人机对战功能)
数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标。
游戏代码由浙江温州永嘉县教师发展中心应根球老师提供,我略做修改和优化。
代码有点长,用手机阅读可能不太方便,可以复制地址到电脑上用浏览器查看。
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编写的数字拼图游戏(含爬山算法人机对战功能)相关推荐
- python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...
数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标. 游戏代码由浙江温州永嘉县教师发展中心应根球老师 ...
- android小游戏源码拼图,android编写的数字拼图游戏(带详细注释)
[实例简介]自己正在学android,编写了一个简单的数字拼图游戏,有详细注释,适合初学者参考使用,比较简单易懂 [实例截图] [核心代码] package com.tsu; import java. ...
- python编写猜大小游戏_python编写猜数字小游戏
本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...
- c++编写手机小游戏代码_只需22行代码,用python编写自己的小游戏
假期最后一天,有些人在外面玩累了,有些人躺在家里快发霉了,闲暇时候不如动动手做个小游戏玩一玩吧! 本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 1 import ...
- Python Tkinter——数字拼图游戏详解版
Python Tkinter 实践系列--数字拼图游戏详解版 import random #Python中的random是一个标准库用于生成随机数.随机整数.还有随机从数据集取数据. import t ...
- Python Tkinter——数字拼图游戏
Python Tkinter 实践系列--数字拼图游戏 tkinter模块,掌握窗口创建.消息循环等tkinter的基本架构 读取并显示图片,处理键盘事件 导入random库,导入python中的tk ...
- python编写猜数字游戏
一.猜数字游戏介绍 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩. 二.猜数字游戏规则 先解释标 ...
- 用python 编写一个简单的游戏
This blog will memory my work and process with the interesting skill. 用python 编写一个简单的游戏 这是一个非常简单的游戏, ...
- python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏
Python编写贪吃蛇 前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前.看来大家对这类简单易上手小游戏还是很喜爱的. 恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉, ...
最新文章
- 模型(Model)– ASP.NET MVC 4 系列
- 这种奇奇怪怪的符号,只能用latex打出来,如果实在不行,>---|-->>也行
- linux编译避免污染源码分离,如何避免linux上的系统标准C/C++库?
- FPGA RAM存储器设计
- 一张图30分钟带你入门python-大数据时代来了!神级程序员一张图帮你梳理Python脉络,快速入门...
- php 跨天 时间差 秒,判断时间是否在预设跨天时段
- C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
- 感悟Microsoft summer Camp 2010
- Ubuntu小技巧13--grep命令详解
- 洛谷题集——乒乓球(思维、乒乓球比赛规则)
- 年龄识别之ssrnet
- Java实现获取long类型的随机数
- 外贸人如何从SiteGround购买建站外贸主机
- 人工智能学习笔记20221008
- 【论文笔记】Regional Differential Information Entropy for Super-Resolution ImageQuality Assessment
- Python输出斐波拉契数列
- 柔性塑料漆的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- [转帖]希捷硬盘的命名规范
- 无线路由器文件服务器,TP-Link无线路由器设置USB网络共享的方法图文详细介绍...
- 响铃:厉害了中国古人!原来,我们3000年前就有了机器人
热门文章
- echart 高度 不用 不撑满_你担心的高度近视老了之后是这样的
- java安装路径_java环境变量和查看安装路径
- qmenu基本用法_使用QProxyStyle定制QMenu (二)
- pads中如何设置等长_标签打印软件中标签间距以及边距如何设置
- java unicode32_【JAVA SE基础篇】32.String类入门
- oracle 12c cdb/pdb tnsnames.ora设置
- linux禁止内核抢占,Linux内核态抢占机制分析
- 三元一次方程组步骤_姜红梅名师工作室【教学感悟】三元一次方程组解法的思考...
- php t double arrow,php – 语法错误,意外T_DOUBLE_ARROW
- mysql中索引创建 查看和删除语句_MySQL如何创建和删除索引?