前言:
现在我们对“学完python基础语法后能干什么”都比较关注,咱们都需要学习一些“学完python基础语法后能干什么”的相关文章。那么小编也在网络上汇集了一些对于“学完python基础语法后能干什么””的相关知识,希望同学们能喜欢,你们快快来了解一下吧!刚学完python基础语法,想看下自己学到什么程度,上网找题刷测试一下。看到这道题,以为不难,谁知道用了整整一个下午。 = = 要是考试,早不及格了。记录下自己的思路,也方便自己以后看回来自己有多幼稚。各位看官老爷也可以给下意见。
分析题目
拿到题目首先分析一下,就是一个简单的拼数字游戏,空格旁边的数字可以和空格互换,按到1-8的顺序排序,空格放最后就完成游戏。然后询问是否继续,继续就开始,不继续就退出。
图像排列
首先这个拼图看起来是一个二维数组,元素包含1-8和一个空格。
用一个1-9的数组来实现就可以了,9在打印的时候用' '来代替就可以了。而位置则可以用 3*i+j 的形式记录下来,如下:
数组为[1,2,3,4,5,6,7,8,9],打印出来的图像和位置可以记录为:1 2 34 5 67 8-->0 1 23 4 56 7 8 -->3*0+0 3*0+1 3*0+23*1+0 3*1+1 3*1+23*2+0 3*2+1 3*2+2
打印的代码可以这样实现:
myList = [1,2,3,4,5,6,7,8,9]for i in range(0,3): for j in range(0,3): if myList[3*i+j] == 9: print(' ',end='') else: print (myList[3*i+j],end=' ') print()数字的移动
数字的移动就是空格位置的变化,因为其他数字是没有动的。每一次移动只有1个数字和空格发生了位置互换。如下:
这里会用8和空格互换。变换前:1 2 3 4 5 6 7 8 --> 3*0+0 3*0+1 3*0+23*1+0 3*1+1 3*1+23*2+0 3*2+1 3*2+2-->空格的位置在3*2+2,8的位置在3*2+1变换后:1 2 3 4 5 67 8 --> 3*0+0 3*0+1 3*0+23*1+0 3*1+1 3*1+23*2+0 3*2+1 3*2+2-->空格的位置在3*2+1,8的位置在3*2+2
所以打印出来之后只需要记录9的位置,数字移动也只需要记录9的位置。
然后就是怎么判断有哪些方向可以移动的问题了。因为移动的时候是和9互换的,所以只需要根据9的位置,就可以判断了。一样可以根据3*i+j来判断:
j=0时,都可以向左;j=1时,都可以向左向右;j=2时,都可以向右i=0时,都可以向上:i=1时,都可以向上向下;i=2时,都可以向下
然后还要判断怎么输入,和校验录入,朋友们自己想一下哈。
流程逻辑初始打印输出可以怎么移动,输入移动数字和空格替换检验是否达成游戏胜利条件循环2-4胜利后询问是否继续继续的话循环1-5不继续的话退出
思路就是这样。再往下就是代码,还是python新手学习,如果写得不够优雅,大神请高抬贵手,轻喷。
> 最近找到一个不错的学习交流群 78486745 ,大家一起来学习python哈。刚入群的小伙伴有python学习大礼包哦。
实现代码
import randomimport sys#num_index记录的是9的位置。#用全局变量是不是不好?写完之后懒得改了就没有动了num_index = 0myList = [i for i in range(1,10)]#初始化数组,记录下9的位置def init_puzzle(): global num_index , myList random.shuffle(myList) num_index = myList.index(9)#把列表按照3*3打印,数字9替代为空格def print_puzzle(): for i in range(0,3): for j in range(0,3): if myList[3*i+j] == 9: print(' ',end='') else: print (myList[3*i+j],end=' ') print()#传入x,y的坐标值,从0,0到2,2#y=0时,都可以向左;y=1时,都可以向左向右;y=2时,都可以向右#x=0时,都可以向上:x=1时,都可以向上向下;x=2时,都可以向下def new_print_move(x,y): #这里用字典是想看起来帅一点,不过好像没什么大用处 forwards = {'left':'false','right':'false','up':'false','down':'false'} if x==0: forwards['up'] = 'true' elif x==1: forwards['up'] = 'true';forwards['down'] = 'true' else: forwards['down'] = 'true' if y==0: forwards['left'] = 'true' elif y==1: forwards['left'] = 'true';forwards['right'] = 'true' else : forwards['right'] = 'true' temp_list = [] for i,j in forwards.items(): if j == 'true': temp_list.append(i) while 1 : action = input('please input '+str(temp_list)[1:-1].replace(',',' or')+': ') if action == 'w': if forwards['up'] == 'true': return action elif action == 's': if forwards['down'] == 'true': return action elif action == 'a': if forwards['left'] == 'true': return action elif action == 'd': if forwards['right'] == 'true': return action elif action == 'q': return action #执行互换操作,用'a,s,w,d'控制def move_puzzle(action,x,y): global myList , num_index if action == 'a': myList[3*x+y] , myList[3*x+y+1] = myList[3*x+y+1] , myList[3*x+y] num_index += 1 elif action == 'd': myList[3*x+y] , myList[3*x+y-1] = myList[3*x+y-1] , myList[3*x+y] num_index -= 1 elif action == 'w': myList[3*x+y] , myList[3*(x+1)+y] = myList[3*(x+1)+y] , myList[3*x+y] num_index += 3 elif action == 's': myList[3*x+y] , myList[3*(x-1)+y] = myList[3*(x-1)+y] , myList[3*x+y] num_index -= 3 #这里加个q是因为测试的时候太痛苦了,根本玩不出来 |= = elif action == 'q': sys.exit(1)#检查是否完成def check_puzzle(count): global myList check_list = [i for i in range(1,10)] if myList == check_list: print("win in {} steps".format(count)) return False else: return Truedef main(): init_puzzle() flag = True count = 0 while flag: print() print("use 'a,d,s,w' to move , enter q to exit") print(">>>>>>>>>>>>>>>>>>>>") print_puzzle() #取得上面分析说的3*i+j格式的i和j posotion_x,posotion_y = num_index // 3 , num_index % 3 action = new_print_move(posotion_x,posotion_y) move_puzzle(action,posotion_x,posotion_y) count += 1 flag = check_puzzle(count) while 1 : again = input("y or n :") if again == 'y': main() break elif again == "n": breakmain()总结
看起来挺简单的一道题,用到了函数的循环调用,循环结构的判断,数组的应用,最关键的是思路的养成。所以说学习不能光看知识,还要多找操作题才行。
今天就是这样了,有什么写得不好的地方,希望大佬可以指点一下。有一起学习的小伙伴的话,也可以在下面留言。
p.s. 小伙伴们可以想下办法扩展一下这个拼数字游戏,例如可以录入数字生成各种大小的棋盘。
标签: #学完python基础语法后能干什么