前言:
Life is short ,you need python.
--Bruce Eckel
我与2048的缘,不是缘于一个玩家,而是一次,一次,又一次的ACM比赛.四月份校赛初赛,第一次碰到2048,两周后决赛再次遇到2048,后来五月份的广东省赛,又出现了2048。在这三次比赛过程中,我一次2048都没玩过..全靠队友的解释,直到昨天,我突然想起写个2048吧,于是下了个2048玩了几盘,之后就开始用python来写了,心想就不写界面了,为了简洁。
我对python并不熟悉,但是我在之前的博文就提过我希望成为一个python的玩家,所以我选择了python,同时,也希望大家也可以用非常简单的代码取实现2048。
首先,如果你没有玩过2048,没关系,你只要随便在网上或电子市场一搜索肯定会有各种版本,之后玩几把就会了。
来到这里,我假设大家都玩过2048了,于是我们先分析一下怎么来写一个简单的2048?回想一下,游戏的过程是很简单的:
开始===>( 进行操作(上下左右)===>矩阵移动===>数字合并===>计分 )===>退出
括号内就是游戏的进行过程了,我们退出大概就是两个:1.出现2048,胜利退出 2.无法合并同时无法出现新数(是且的关系)
懂得这个运行过程后,我们就一步步来写,整个过程也不会难,哪怕你跟我一样基本是新手。
先看看简略图,看起来虽然真的很朴素,但是爱美的你,可以在看完我的程序后自己美化。
储存结构:列表,其中包括二维矩阵列表,即所谓的mtr[4][4],以及栈,栈是用于退回,如果大家不想要这个功能可以直接忽略。
我们的变量定义:
declare = "←:a/h ↓: s/j ↑: w/k →: d/l ,q(uit),b(ack)"
illegal = "Illegal operation!"
noefficient = "This move has no efficient"
score = 0
step = 0
mtr = init() # init the matrix
mtr_stk = [] # use step for back
scr_stk = []
稍微解释一下: declare是解释操作提示,自己喜欢怎么写就怎么写~
illegal是我们输入非正常操作提示,,可以省略
noefficient是我们往这个方向没效果,也可以省略~
score是得分,step是走了多少步,
mtr是我们的二维方阵,
mtr_stk,scr_stk是储存栈,用于后退功能,如果不要后退,还是可以省略~
算法实现:
·「注:其实没有算法可言....更准确叫函数实现。」
(1).在我们这个没有界面的2048中,我们只能用制表符啦,所以我们需要一个display函数。
这是一个非常简单的事情,跟C语言的printf基本一致, 像如下代码,基本就能绘制出一个固定数字的表格了。
print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "└"+("─"*5+"┴")*3+"─"*5+"┘"
但是我们需要的是将固定的数字变成我们矩阵mtr的数字。
另外可以,注意到一点,数字输出的形式是固定的,表格边线,只有交叉点是不同,其他是0。而交叉点有五个,我们可以走循环(觉得麻烦可以直接忽略)
为了美观,我们不将0输出,所以我们输出时候选择的是字符串即%s,这样,我们遇到0,就可以输出' ',其他直接输出。
我们可以用python的三目运算符号
print "%4s " %(mtr[i][j] if mtr[i][j] else ' ')
所以我们的绘制表格写成这样子:
最直接的方法!