前些日子被问了一下2048是如何实现,说实话当时没有想的特别清晰,所以回答的也比较混乱,后来仔细想想这个问题还是挺有趣的,简单的实现了一下

这个问题里面主要有两个问题,一个是移动时的计算,二是移动前对空的格的处理(就是0的格子)。

最初的想法是按行/列,向左移动就从左向右去读,做计算,遇0做处理,后来发现这样是行不通的,应该在移动开始前先把0的格子处理好,例如向左移,要先把为0的放到一行的末尾,然后再平移计算。

具体代码如下:

 #!/usr/bin/python
# -*- coding:utf-8 -*-
'''
@author: lianying
'''
import random class Game:
#init
def __init__(self, size):
self.size = size
self.matrix = [[0]*self.size for i in range(self.size)] def start(self): #shallow copy error
#self.matrix = [[0]*self.size]*self.size
self.add_random_num()
self.display()
while True:
input=raw_input("Left(A/a),Right(D/d),Up(W/w),Down(D/d),Quit(S/s):")
if input.lower() == 'a':
self.slip_left()
elif input.lower() == 'd':
self.slip_right()
elif input.lower() == 'w':
self.slip_up()
elif input.lower() == 's':
self.slip_down()
elif input.lower() == 'q':
break
else:
print 'error input'
continue
if self.add_random_num():
self.display()
else:
print 'no place to generate new num'
break
#input=raw_input("Left(L/l),Right(R/d),Up(U/d),Down(D/d),Quit(Q/q):") print 'game over, the max num you get is %d' % self.get_max_num() #slip left
def slip_left(self):
# move 0 to the tail
for t_row in range(self.size):
new_line = filter(lambda x:x != 0, self.matrix[t_row])
new_line.extend([0] * (self.size - len(new_line)))
self.matrix[t_row] = new_line
#calculate
for t_row in range(self.size):
# list_b is a sign to the add action
list_b = [0] * self.size
for i in range(1, self.size):
if self.matrix[t_row][i - 1] == self.matrix[t_row][i] and list_b[i - 1] != 1:
self.matrix[t_row][i - 1] = self.matrix[t_row][i - 1] * 2
list_b[i - 1] = 1
# the first el to iter is i
for j in range(i + 1, self.size):
self.matrix[t_row][j - 1] = self.matrix[t_row][j]
list_b[j - 1] = list_b[j]
# the last one is set to 0
self.matrix[t_row][self.size - 1] = 0
list_b[self.size - 1] = 0
else:
pass
return self.matrix
#slip right
def slip_right(self):
# move 0 to the front
for t_row in range(self.size):
new_line = filter(lambda x:x != 0, self.matrix[t_row])
zero = [0] * (self.size - len(new_line))
zero.extend(new_line)
self.matrix[t_row] = zero
#calculate
for t_row in range(self.size):
# list_b is a sign to the add action
list_b = [0] * self.size
for i in range(self.size - 1, 0, -1):
if self.matrix[t_row][i - 1] == self.matrix[t_row][i] and list_b[i] != 1:
self.matrix[t_row][i] = self.matrix[t_row][i ] * 2
list_b[i] = 1
# the first el to iter is i
for j in range(i - 1, 0, -1):
self.matrix[t_row][j] = self.matrix[t_row][j - 1]
list_b[j] = list_b[j - 1]
self.matrix[t_row][0] = 0
list_b[0] = 0
else:
pass
return self.matrix
#slip up
def slip_up(self):
# move 0 to the bottom
for t_col in range(self.size):
col_line = [self.matrix[x][t_col] for x in range(self.size)]
new_line = filter(lambda x:x != 0, col_line)
zero = [0] * (self.size - len(new_line))
new_line.extend(zero)
for x in range(self.size):
self.matrix[x][t_col] = new_line[x] for t_col in range(self.size):
# list_b is a sign to the add action
list_b = [0] * self.size
for i in range(1, self.size):
if self.matrix[i - 1][t_col] == self.matrix[i][t_col] and list_b[i] != 1:
self.matrix[i - 1][t_col] = self.matrix[i - 1][t_col] * 2
list_b[i - 1] = 1
# the first el to iter is i
for j in range(i + 1, self.size):
self.matrix[j - 1][t_col] = self.matrix[j][t_col]
list_b[j - 1] = list_b[j]
# the last one is set to 0
self.matrix[self.size - 1][t_col] = 0
list_b[self.size - 1] = 0
else:
pass
return self.matrix
#slip down
def slip_down(self):
# move 0 to the top
for t_col in range(self.size):
col_line = [self.matrix[x][t_col] for x in range(self.size)]
new_line = filter(lambda x:x != 0, col_line)
zero = [0] * (self.size - len(new_line))
zero.extend(new_line)
for x in range(self.size):
self.matrix[x][t_col] = zero[x] for t_col in range(self.size):
list_b = [0] * self.size
for i in range(self.size - 1, 0, -1):
if self.matrix[i -1][t_col] == self.matrix[i][t_col] and list_b[i] != 1:
self.matrix[i][t_col] = self.matrix[i][t_col] * 2
list_b[i] = 1
for j in range(i - 1, 0, -1):
self.matrix[j][t_col] = self.matrix[j - 1][t_col]
list_b[j] = list_b[j - 1]
self.matrix[0][t_col] = 0
list_b[0] = 0
else:
pass
return self.matrix
#add a new num in matrix where is 0
def add_random_num(self):
zero_list = []
for i in range(self.size):
for j in range(self.size):
if self.matrix[i][j] == 0:
zero_list.append(i*self.size +j)
if len(zero_list) > 0:
#get a random position--->random.choice(iterable)
pos = random.choice(zero_list)
num = random.choice([2,2,2,4])
self.matrix[pos / self.size][pos % self.size] = num
return True
else:
return False
#display the chess
def display(self):
print "The Chess is:\n"
for i in range(self.size):
for j in range(self.size):
print '%4d' % self.matrix[i][j],
print '\n',
#get the max num in the chess
def get_max_num(self):
return max([max(self.matrix[i]) for i in range(self.size)])
def main():
print 'Welcome to the 2048 game:'
while True:
try:
size = int(raw_input('choose the size you want:'))
if size > 2:
game = Game(size)
game.start()
break
else:
print 'the num should greater than 2'
except:
print 'wrong input!' if __name__ == '__main__':
main()

然后,自己竟然无聊的玩了一会儿,哈哈哈

游戏2048的python实现的更多相关文章

  1. 开源游戏“2048”IOS移植版

    简介: 这个游戏是我在今年(2014/05)课余时闲着无聊做的一个益智类小游戏,总共花了4个工作日才完成,为了游戏的效率,做了很多优化,目前在IE5以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...

  2. Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)

    1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...

  3. Android 带你玩转实现游戏2048 其实2048只是个普通的控件

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...

  4. Andorid游戏2048开发(一)

    最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...

  5. HTML 网页游戏 2048

    新手只会一点html和css,javascript基本不会,更别提jQuery了= = 跟着慕课网的教学视频(视频地址:http://www.imooc.com/learn/76)一点点做的,由于自己 ...

  6. 180行ruby代码搞定游戏2048

    最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...

  7. 通过一个小游戏开始接触Python!

    之前就一直嚷嚷着要找视频看学习Python,可是一直拖到今晚才开始....好好加油吧骚年,坚持不一定就能有好的结果,但是不坚持就一定是不好的!! 看着视频学习1: 首先,打开IDLE,在IDLE中新建 ...

  8. 游戏2048源代码 - C语言控制台界面版

    一.游戏介绍 <2048>是最近比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇& ...

  9. c语言----<项目>_小游戏<2048>

    2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...

随机推荐

  1. Java代码执行顺序及多态体现

    /** * Description: * 基类的引用变量可以只想基类的实例对象也可指向其子类的事来对象 * 接口的引用变量也可以指向实现类的实例对象 * 程序调用的方法在运行期才动态绑定 * 绑定指将 ...

  2. # Clion复制提示信息

    Clion复制提示信息 windows: 按着alt 左键点击错误信息(按键点击同时进行) mac:按着option 左键点击错误信息 搞定

  3. python打印带颜色的字体

    在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...

  4. Echarts ajax异步

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. php过滤微信昵称中的表情

    function filterNickname($nickname) { $nickname = preg_replace('/[\x{1F600}-\x{1F64F}]/u', '', $nickn ...

  6. java实现spark常用算子之frist

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  7. 北上广Java开发月薪20K往上,该如何做,需要会写什么

    这个问题可能很多人会说这只是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为这方面除了北上广深杭 ...

  8. 转换byte(十进制)为图形(大小写字母,符号)

    /** * 转换byte(十进制)为字母 */ public static String ByteToLetter (byte[] chars) { String Letter = "&qu ...

  9. 第九篇 float浮动

    float浮动   首先老师要声明,浮动这一块,和边距.定位相比,它是比较难的,但是用它,页面排版会更好.   这节课就直接上代码,看着代码去学浮动. 我们先弄一个div,给它一个背景颜色: HTML ...

  10. Docker容器入门之一:部署SpringBoot项目

    一.环境准备:    1.vm虚拟机: Workstation 12 Pro 12.5.7 build-5813279 2.Centos 7 在虚拟机上安装好Centos7系统后,就可以开始准备安装D ...