前些日子被问了一下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. flower 时区设置

    celery 搭配flower使用,flower默认使用的是UTC时间,那么如何在flower中使用当前城市的时间呢 我的环境 celery 3.1.25 ,python 3.69 1.在 app设置 ...

  2. python-1:正则表达式(基础知识点)

    1.简单匹配: \d  →匹配一个数字 \w →匹配一个数字或字母 \s  →匹配一个空格(包括tab等空白符) .    →匹配任意字符 *   →匹配任意个字符(包括0个) +  →匹配至少一个字 ...

  3. JS中this的4种绑定规则

    this ES6中的箭头函数采用的是词法作用域. 为什么要使用this:使API设计得更简洁且易于复用. this即不指向自身,也不指向函数的词法作用域. this的指向只取决于函数的调用方式 thi ...

  4. 51nod 1251 Fox序列的数量 (容斥)

    枚举最多数字的出现次数$k$, 考虑其他数字的分配情况. 对至少$x$种数出现$\ge k$次的方案容斥, 有 $\sum (-1)^x\binom{m-1}{x}\binom{n-(x+1)k+m- ...

  5. AngularJS 在实际应用中优缺点

    AngularJS 在实际应用中优点:模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令:是一个比较完善的前端MV*框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所 ...

  6. 深入理解并使用python的模块与包

    模块 编写好的一个python文件可以有两种用途:1)脚本,一个文件就是整个程序,用来被执行2)模块,文件中存放着一堆功能,用来被导入使用 模块的分类 1)开发者编写的 .py文件2 ) 由C或C++ ...

  7. python-装饰器案例1

    python-装饰器案例1 高阶函数+嵌套函数=装饰器 例1: import time def timer(func): def deco(): start_time=time.time() func ...

  8. C++中写文件ofstream 的<< 操作符 与C风格的fwrite 的笔记

    在某次工作中,调用了某SDK接口,该接口通过一个回调函数返回需要的内容.我们需要的内容是H.264码流,该码流通过一个unsigned char* 变量带回,另外还有一个长度 int length.为 ...

  9. 代码报错--------EOFError: Compressed file ended before the end-of-stream marker was reached

    背景:运行LeNet识别CIFAR-10的图像的代码时,报错: EOFError: Compressed file ended before the end-of-stream marker was ...

  10. 自动化运维——MySQL备份脚本(二)

    使用if语句编写MySQL备份脚本 代码: #!/bin/bash #auro backup mysql db #by steve yu #define backup path BAK_DIR=/da ...