游戏2048的python实现
前些日子被问了一下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实现的更多相关文章
- 开源游戏“2048”IOS移植版
简介: 这个游戏是我在今年(2014/05)课余时闲着无聊做的一个益智类小游戏,总共花了4个工作日才完成,为了游戏的效率,做了很多优化,目前在IE5以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)
1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...
- Andorid游戏2048开发(一)
最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的 ...
- HTML 网页游戏 2048
新手只会一点html和css,javascript基本不会,更别提jQuery了= = 跟着慕课网的教学视频(视频地址:http://www.imooc.com/learn/76)一点点做的,由于自己 ...
- 180行ruby代码搞定游戏2048
最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...
- 通过一个小游戏开始接触Python!
之前就一直嚷嚷着要找视频看学习Python,可是一直拖到今晚才开始....好好加油吧骚年,坚持不一定就能有好的结果,但是不坚持就一定是不好的!! 看着视频学习1: 首先,打开IDLE,在IDLE中新建 ...
- 游戏2048源代码 - C语言控制台界面版
一.游戏介绍 <2048>是最近比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇& ...
- c语言----<项目>_小游戏<2048>
2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...
随机推荐
- Luogu P1600[NOIP2016]day1 T2天天爱跑步
号称是noip2016最恶心的题 基本上用了一天来搞明白+给sy讲明白(可能还没讲明白 具体思路是真的不想写了(快吐了 如果要看,参见洛谷P1600 天天爱跑步--题解 虽然这样不好但我真的不想写了 ...
- vue项目中微信jssdk在ios签名失败
一.问题描述 1. vue项目中微信jssdk签名时,在安卓和ios是有差异的,签名时使用的url=window.location.href.split('#')[0],此时在安卓没问题,在ios会导 ...
- Qt表格导出图片
概述:qt中把某个控件导出保存为图片导出并不复杂,网上也有一堆方法.但是对于tableview中数据很多的情况下势必会出现滚动条,用传统的截屏抓图势会有滚动条,图片数据展示不全.在这我使用了一种折中方 ...
- Scala新版本学习(2):
1.本章要点; (1)if表达式有值: (2)块也有值,是它最后一个表达式的值 (3)Scala的for循环就像是"增强版的"Java for循环 (4)分号不是必须的 (5)vo ...
- css动画之旋转翻牌效果
1.我们先设置两个盒子大小,颜色等等,然后定位重叠在一起,最后再进行动画设置 例子如下: <style> .box { height: 300px; width: 300px; posit ...
- whistle 前端工具之抓包利器
一.业务场景 前端本地开发的场景中,我们需要频繁的改动代码,并需要实时看到效果,并且在一些开发场景中,我们需要将特定的请求代理到特定的IP.本地文件等,所以使用fiddler或whistle等本地.真 ...
- DedeAMPZ 网吧能安装却不能打开网站
只需把 监听IP的连接里的 LMHOSTS查询 禁用就行了. 方法: 连接属性-->TCP/IP 协议属性-->WINS 选项卡-->去掉 启用 LMHOSTS查询 前面的勾. by ...
- mongo启动报错问题处理
关键错误信息child process failed, exited with error number 100 这是服务器断电导致数据库意外关闭导致的问题,处理方法也比较简单 rm -rf /var ...
- Ansible安装部署和常用命令,及其主机清单inventory(二)
1.ansible的安装方式 1.1使用yum源安装 yum install ansible -y 1.2使用rpm包安装 https://dl.fedoraproject.org/pub/epel/ ...
- linux内核配置与编译
配置内核:配置硬件和软件需的部分. make config:基于文本模式的交互式配置.(一问一答) make menuconfig:基于文本模式菜单性配置.(直观简单高效) <*>会产生b ...