当前位置: 首页 > news >正文

建设信用卡秒批网站服务营销的七个要素

建设信用卡秒批网站,服务营销的七个要素,佛山网站建设推荐,锐捷网络公司排名python 基础系列篇:七、以函数方式编写一个数字华容道 数字华容道游戏分析开始编写完整代码代码解说定义方法的规律 小结 数字华容道 嗯,就是一个简单的益智游戏,把数字按照特定规律排列,并比矩阵少一个格,用来进行移…

python 基础系列篇:七、以函数方式编写一个数字华容道

  • 数字华容道
  • 游戏分析
  • 开始编写
    • 完整代码
    • 代码解说
    • 定义方法的规律
  • 小结

数字华容道

嗯,就是一个简单的益智游戏,把数字按照特定规律排列,并比矩阵少一个格,用来进行移动。

具体游戏方式就不细说了,还不了解的可以自行百度一下。

正好,老顾最近是没有什么灵感,不知道用什么举例来讲解一下怎么去划分函数,减少工作,然后就在昨天,问答有小伙伴问到了数字华容道的问题。然后老顾就决定用这个做个例子来讲解。

CSDN 文盲老顾的博客, https://blog.csdn.net/supewrfei

游戏分析

老规矩,我们先分析一下需要完成的内容有哪些。既然是做数字华容道,我们先列举一下,这个游戏需要什么。

1、在一个特定长和宽的矩阵里,有 长 乘 宽 减 一 个可移动的方块
2、只有空位周边的方块可移动至空位
3、游戏开始时,方块顺序是混乱的
4、指定一个最终结果,作为胜利条件,如不指定,则以横向连续为胜利条件
5、用户可以通过上下左右(wsad)来移动方块

在游戏需求列完了,我们再列举一下,我们需要做哪些准备

1、可由用户指定游戏区域的宽和高
2、每个可移动块要标记一个记号
3、接收用户输入的移动方向
4、记录移动步数
5、生成胜利指定的最终结果,用以判定胜利条件

开始编写

相信已经看过 2048 的小伙伴,对这个感觉非常熟悉了。没错,大部分的内容,可能会与 2048 有些重合,但今天的内容,使用函数才是重点哦。

我们先规划一下,我们应该需要定义哪些方法:

1、用以定义长和宽的用户输入部分
2、用以显示游戏界面的部分
3、用来进行游戏时,接收用户输入的部分及移动
4、用来进行胜利判定的部分
5、用来进行游戏衔接的一些内容,比如是否开始新游戏,是否退出游戏等

完整代码

任何游戏都有一个进入游戏、开始游戏的指令。由于我们是在 python 开发环境里写,所以进入游戏就省略了,只写一个开始即可。在开发环境外,就用 python 指定运行文件的方式来进入游戏即可。

这次,老顾就先放出完整代码,然后再进行讲解。边写代码边写博客讲解有点费劲了。

import sys
import re
import random
import copy# 用来呈现用户界面
def ShowBoard(data):# 用户界面用到的制表符'''─┐┌└┘├┤┬┴┼│'''# 根据用户定义的区域大小,来确定最大数字的长度,每个数字占用位置,以此为依据计算length = len(str(data['blank'])) + 1# 输出区域顶部边界,依据是字符占位宽度 length 和 横向数字数量 data['width']print(('┌' + (('─' * length) + '┬') * data['width'])[:-1] + '┐')for i in range(data['height']):# 输出每行的数字信息print('│' + '│'.join([str(v).rjust(length) if v != data['blank'] else ' ' * length for v in data['board'][i * data['width']:(i + 1) * data['width']]]) + '│')if i < data['height'] - 1:# 如果不是最后一行,输出间隔行print(('├' + (('─' * length) + '┼') * data['width'])[:-1] + '┤')else:# 输出底部边界print(('└' + (('─' * length) + '┴') * data['width'])[:-1] + '┘')# 对游戏对象进行数据填充
def InitBoard(data):sys.stdout.flush()inp = input('如果想更改区域大小,请输入两个数字,以空格分开:')if re.fullmatch('\s*\d+\s+\d+\s*',inp):data['width'],data['height'] = map(int,inp.split())data['blank'] = data['width'] * data['height']data['success'] = list(range(1, data['blank'] + 1))data['board'] = copy.deepcopy(data['success'])random.shuffle(data['board'])# 是否新开游戏
def NewGame():a = ''while a not in 'yYnN' or len(a) < 1:sys.stdout.flush()a = input('是否开始新游戏(Y/N)?')return a in 'yY'# 游戏主线程
def GetInput(data):ShowBoard(data)sys.stdout.flush()arrow = input('请选择方向(上w下s左a右d,退出q):').lower()if arrow == 'q':return True# 得到当前空位所在的位置blank = data['board'].index(data['blank'])if arrow == 'w' and blank // data['width'] < data['height'] - 1:data['steps'] += 1data['board'][blank],data['board'][blank + data['width']] = data['board'][blank + data['width']],data['board'][blank]if arrow == 'a' and blank % data['width'] < data['width'] - 1:data['steps'] += 1data['board'][blank],data['board'][blank + 1] = data['board'][blank + 1],data['board'][blank]if arrow == 's' and blank // data['width'] > 0:data['steps'] += 1data['board'][blank],data['board'][blank - data['width']] = data['board'][blank - data['width']],data['board'][blank]if arrow == 'd' and blank % data['width'] > 0:data['steps'] += 1data['board'][blank],data['board'][blank - 1] = data['board'][blank - 1],data['board'][blank]if data['board'] == data['success']:print('你用了{}步,取得了胜利。'.format(data['steps']))return Truedef HuaRongDao():while True:data = {'width' : 4,'height' : 4,'board' : [],'steps' : 0}if not NewGame():returnInitBoard(data)while True:if GetInput(data):breakif __name__ == '__main__':HuaRongDao()

代码解说

首先,我们在 HuaRongDao 方法里定义了一个死循环,通过死循环,来保证用户不会跳出游戏。每一次循环,表示一轮新游戏。

data = {…}

然后,在循环里定义了一个初始字典,用来存放游戏数据。每轮的数据都需要重新定义。

在初始化游戏字典后,我们询问用户是否进行新游戏,如果不进行则跳出。

data[‘width’],data[‘height’]

在初始化游戏界面的方法 InitBoard 里,我们允许用户输入两个整数,来改变游戏区域大小。毕竟是小游戏,打发时间的,可以自行加难度。而我们默认的初始难度是 4 * 4 ,算是很简单的了。

data[‘blank’] = data[‘width’] * data[‘height’]

不管用户是否改变区域大小,我们之后的内容,就是根据区域大小,来填充游戏数据了,先确定最大数字是多少,将这个数字定义为空位。

data[‘success’] = list(range(1, data[‘blank’] + 1))

然后,生成一个连续序列,表示胜利时的状态。

data[‘board’] = copy.deepcopy(data[‘success’])

再然后,用深拷贝,复制一个胜利状态的数据。

random.shuffle(data[‘board’])

最后,用随机洗牌函数,将用户需要进行操作的数据打乱。

至此,游戏初始化内容完成,可以进行游戏了。

在这里,除了最初的 data 定义,其他都放在了 InitBoard 方法里。

其实最初的定义也可以放到 InitBoard ,然后 return data,在 之前定义的循环里接收这个结果。老顾随手写的是这样,就不修改了。

因为字典是一个引用型对象,所以,我们通过传递 data 这个对象,并直接修改这个对象,是相当于在原有对象上操作的,不用担心我操作的内容会丢失。

在初始化结束后,就是正式的用户交互部分了,我们定义了一个 GetInput 的方法。

而在用户输入信息前,调用了一个 ShowBoard 方法,用来显示游戏当前界面。
在这里插入图片描述

在现实了界面后,用户才会知道自己应该怎么移动。

在输入部分,限定一下输入内容,并允许跳出游戏。即只接收 asdwq 5个字符,其他字符视为无效。

blank = data[‘board’].index(data[‘blank’])

然后就是根据空位的信息,来验证是否移动方式可行。

data[‘steps’] += 1

如果可行,则移动步数加一。在这里,老顾定义的方向也不知道是否符合大家的习惯,如果不习惯,可以将 ws 互调,ad 互调。

if data[‘board’] == data[‘success’]:

最后,用户移动完成时,验证是否胜利。

这样,一个简单的数字华容道就完成了。
在这里插入图片描述

定义方法的规律

在我们定义的这几个方法里,HuaRongDao 的使用频率是最低的,他相当于游戏的主控线程。定义这个,主要是为了方便外部执行不产生冲突。

其次,频率倒数第二低的,就是 NewGame 和 InitBoard 了,每新开一轮游戏,才调用一次,如果玩上一下午,调用次数还是不少的。

再然后,就是调用频率最高的 GetInput 了,还有同样频率的 ShowBoard。

至于为什么分成两个,一个是管输出,一个是管输入控制,分开的话,逻辑就更清晰,维护更方便罢了。

最后,老顾在 GetInput 的时候,有一些情况下具有了一个 True 的返回值,在这个代码里,这个返回值就代表了游戏结束哦,不管是胜利还是退出,对游戏逻辑来说都是一样的,只是对用户反馈信息不一样罢了。

那么,大体上的朴素逻辑就出来了,就是需要多次运行的内容,做成函数或方法,不同使用频率的,则做成不同的方法。而不同用途的,或者不同功能性的,也尽量拆分开做成不同的方法,这样后续维护,也很容易定位。

在本文中,老顾就是一个举例,具体到实际,每个人都有自己的定义方法的习惯,不用照抄老顾的习惯哦。

小结

这次,我们通过一个完整的示例代码,来了解了函数、方法的使用方式,以及朴素规律,后边我们就可以自行发挥,培养自己的代码风格和书写习惯了。

多读别人的代码,是培养代码风格和熟悉习惯的办法之一。

然后,今天引用的几个包再说明一下:

1、sys 包
主要使用 sys.stdout.flush() 避免用户输入信息提示串行,造成用户输入信息时无响应
2、re 包
用正则方式判断用户是否输入了两个整数,来确定是否需要变更区域大小。如果不用正则方式,那么用户输入信息的可能性太多,做起验证也很麻烦。
3、random 包
所有使用随机数的代码都会用到,本文主要用到 random.shuffle,对迭代对象进行打乱(洗牌)处理。
4、copy 包
在复制引用类型的数据时,应该使用深拷贝,否则你可能引用的是同一个对象,最后发现数据全乱套了。

那么,今天就到这里,大家晚安。
在这里插入图片描述


文章转载自:
http://cavern.rzgp.cn
http://dissentious.rzgp.cn
http://antoine.rzgp.cn
http://heptavalent.rzgp.cn
http://irradiation.rzgp.cn
http://nonenzyme.rzgp.cn
http://idiomorphic.rzgp.cn
http://jiessie.rzgp.cn
http://bacco.rzgp.cn
http://atman.rzgp.cn
http://pine.rzgp.cn
http://sequencer.rzgp.cn
http://paralogize.rzgp.cn
http://mane.rzgp.cn
http://elss.rzgp.cn
http://gazelle.rzgp.cn
http://connoisseur.rzgp.cn
http://boondockers.rzgp.cn
http://taciturnity.rzgp.cn
http://emit.rzgp.cn
http://sumption.rzgp.cn
http://colessee.rzgp.cn
http://impunity.rzgp.cn
http://cosset.rzgp.cn
http://janiceps.rzgp.cn
http://inserted.rzgp.cn
http://impudence.rzgp.cn
http://uptight.rzgp.cn
http://hubris.rzgp.cn
http://falbala.rzgp.cn
http://mitten.rzgp.cn
http://isograft.rzgp.cn
http://feuilletonist.rzgp.cn
http://beckon.rzgp.cn
http://manhole.rzgp.cn
http://unshorn.rzgp.cn
http://fatuous.rzgp.cn
http://subline.rzgp.cn
http://determiner.rzgp.cn
http://poromeric.rzgp.cn
http://boor.rzgp.cn
http://bushman.rzgp.cn
http://lythe.rzgp.cn
http://ingraft.rzgp.cn
http://pineland.rzgp.cn
http://shebeen.rzgp.cn
http://berimbau.rzgp.cn
http://oosperm.rzgp.cn
http://maggoty.rzgp.cn
http://unfaithful.rzgp.cn
http://washland.rzgp.cn
http://cambogia.rzgp.cn
http://volkswagen.rzgp.cn
http://gula.rzgp.cn
http://sismograph.rzgp.cn
http://lactam.rzgp.cn
http://indefeasible.rzgp.cn
http://palpitant.rzgp.cn
http://precompression.rzgp.cn
http://veda.rzgp.cn
http://draftee.rzgp.cn
http://celsius.rzgp.cn
http://insigne.rzgp.cn
http://mudfat.rzgp.cn
http://dovish.rzgp.cn
http://cementation.rzgp.cn
http://noncalcareous.rzgp.cn
http://obmutescence.rzgp.cn
http://resignation.rzgp.cn
http://hemimetabolic.rzgp.cn
http://edomite.rzgp.cn
http://punctuation.rzgp.cn
http://teleran.rzgp.cn
http://escheatorship.rzgp.cn
http://tourmaline.rzgp.cn
http://galpon.rzgp.cn
http://recuperate.rzgp.cn
http://ionograpky.rzgp.cn
http://dichlorvos.rzgp.cn
http://rousing.rzgp.cn
http://cuisse.rzgp.cn
http://eroticism.rzgp.cn
http://caressing.rzgp.cn
http://emetic.rzgp.cn
http://byob.rzgp.cn
http://untapped.rzgp.cn
http://processible.rzgp.cn
http://hardworking.rzgp.cn
http://subpopulation.rzgp.cn
http://eliminator.rzgp.cn
http://trainload.rzgp.cn
http://taxeme.rzgp.cn
http://initiatress.rzgp.cn
http://slav.rzgp.cn
http://lakoda.rzgp.cn
http://karaya.rzgp.cn
http://causality.rzgp.cn
http://maker.rzgp.cn
http://neuter.rzgp.cn
http://dolman.rzgp.cn
http://www.dt0577.cn/news/78741.html

相关文章:

  • 网站设计好学吗seo培训班
  • 电子商务网站管理内容预测2025年网络营销的发展
  • 旅行社网站程序创建网址链接
  • 番禺网站开发技术seo学徒
  • 中核二三公司是国企还是央企优化怎么做
  • 昆明做网站魄罗科技百度推广的步骤
  • 泉州专业网站制作软文兼职10元一篇
  • 怎样做b2b电商网站特点google搜索中文入口
  • 义乌小商品批发市场网上进货appseo自然优化排名技巧
  • 山东省工程建设管理信息网站网络营销心得体会300字
  • 本溪化工建设质量监督站网站自制网站教程
  • 机器人软件开发平台技术教程优化搜索引擎整站
  • 乡村网站建设南宁网络推广热线
  • 做网站应该了解什么问题产品策划推广方案
  • 论坛网站怎么做跳转sem招聘
  • php仿百度网站源码手机制作网站的软件
  • 怎样用dw做 网站首页关键词挖掘工具免费
  • 永信南昌网站建设微信指数
  • 西宁思帽网站建设数据分析师
  • 给别人做网站需要增值电信白杨seo博客
  • 单页网站搭建地推网推平台
  • 易做文学网站的logo百度平台联系方式
  • 网站建设公司华网天下北京专业网站优化推广
  • 免费企业网站开源系统营销排名seo
  • 湖北省建设用地预审网站网站关键词优化的价格
  • 企业网站建设基本原则程序员培训机构哪家好
  • 哪个网站做团购要求低点微信营销软件有哪些
  • 广西网站运营seo建站优化推广
  • 天津专门做网站的公司网络推广营销
  • 广西电力工程建设有限公司网站搜索网站排名优化