游戏2048的python实现

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

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

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

具体代码如下:

  1 #!/usr/bin/python
  2 # -*- coding:utf-8 -*-
  3 ‘‘‘
  4 @author: lianying
  5 ‘‘‘
  6 import random
  7
  8 class Game:
  9     #init
 10     def __init__(self, size):
 11         self.size = size
 12         self.matrix = [[0]*self.size for i in range(self.size)]
 13
 14     def start(self):
 15
 16         #shallow copy  error
 17         #self.matrix = [[0]*self.size]*self.size
 18         self.add_random_num()
 19         self.display()
 20         while True:
 21             input=raw_input("Left(A/a),Right(D/d),Up(W/w),Down(D/d),Quit(S/s):")
 22             if input.lower() == ‘a‘:
 23                 self.slip_left()
 24             elif input.lower() == ‘d‘:
 25                 self.slip_right()
 26             elif input.lower() == ‘w‘:
 27                 self.slip_up()
 28             elif input.lower() == ‘s‘:
 29                 self.slip_down()
 30             elif input.lower() == ‘q‘:
 31                 break
 32             else:
 33                 print ‘error input‘
 34                 continue
 35             if self.add_random_num():
 36                 self.display()
 37             else:
 38                 print ‘no place to generate new num‘
 39                 break
 40             #input=raw_input("Left(L/l),Right(R/d),Up(U/d),Down(D/d),Quit(Q/q):")
 41
 42         print ‘game over, the max num you get is %d‘ % self.get_max_num()
 43
 44     #slip left
 45     def slip_left(self):
 46         # move 0 to the tail
 47         for t_row in range(self.size):
 48             new_line = filter(lambda x:x != 0, self.matrix[t_row])
 49             new_line.extend([0] * (self.size - len(new_line)))
 50             self.matrix[t_row] = new_line
 51         #calculate
 52         for t_row in range(self.size):
 53             # list_b is a sign to the add action
 54             list_b = [0] * self.size
 55             for i in range(1, self.size):
 56                 if self.matrix[t_row][i - 1] == self.matrix[t_row][i] and list_b[i - 1] != 1:
 57                     self.matrix[t_row][i - 1] = self.matrix[t_row][i - 1] * 2
 58                     list_b[i - 1] = 1
 59                     # the first el to iter is i
 60                     for j in range(i + 1, self.size):
 61                         self.matrix[t_row][j - 1] = self.matrix[t_row][j]
 62                         list_b[j - 1] = list_b[j]
 63                     # the last one is set to 0
 64                     self.matrix[t_row][self.size - 1] = 0
 65                     list_b[self.size - 1] = 0
 66                 else:
 67                     pass
 68         return self.matrix
 69     #slip right
 70     def slip_right(self):
 71         # move 0 to the front
 72         for t_row in range(self.size):
 73             new_line = filter(lambda x:x != 0, self.matrix[t_row])
 74             zero = [0] * (self.size - len(new_line))
 75             zero.extend(new_line)
 76             self.matrix[t_row] = zero
 77         #calculate
 78         for t_row in range(self.size):
 79             # list_b is a sign to the add action
 80             list_b = [0] * self.size
 81             for i in range(self.size - 1, 0, -1):
 82                 if self.matrix[t_row][i - 1] == self.matrix[t_row][i] and list_b[i] != 1:
 83                     self.matrix[t_row][i] = self.matrix[t_row][i ] * 2
 84                     list_b[i] = 1
 85                     # the first el to iter is i
 86                     for j in range(i - 1, 0, -1):
 87                         self.matrix[t_row][j] = self.matrix[t_row][j - 1]
 88                         list_b[j] = list_b[j - 1]
 89                     self.matrix[t_row][0] = 0
 90                     list_b[0] = 0
 91                 else:
 92                     pass
 93         return self.matrix
 94     #slip up
 95     def slip_up(self):
 96         # move 0 to the bottom
 97         for t_col in range(self.size):
 98             col_line = [self.matrix[x][t_col] for x in range(self.size)]
 99             new_line = filter(lambda x:x != 0, col_line)
100             zero = [0] * (self.size - len(new_line))
101             new_line.extend(zero)
102             for x in range(self.size):
103                 self.matrix[x][t_col] = new_line[x]
104
105         for t_col in range(self.size):
106             # list_b is a sign to the add action
107             list_b = [0] * self.size
108             for i in range(1, self.size):
109                 if self.matrix[i - 1][t_col] == self.matrix[i][t_col] and list_b[i] != 1:
110                     self.matrix[i - 1][t_col] = self.matrix[i - 1][t_col] * 2
111                     list_b[i - 1] = 1
112                     # the first el to iter is i
113                     for j in range(i + 1, self.size):
114                         self.matrix[j - 1][t_col] = self.matrix[j][t_col]
115                         list_b[j - 1] = list_b[j]
116                     # the last one is set to 0
117                     self.matrix[self.size - 1][t_col] = 0
118                     list_b[self.size - 1] = 0
119                 else:
120                     pass
121         return self.matrix
122     #slip down
123     def slip_down(self):
124         # move 0 to the top
125         for t_col in range(self.size):
126             col_line = [self.matrix[x][t_col] for x in range(self.size)]
127             new_line = filter(lambda x:x != 0, col_line)
128             zero = [0] * (self.size - len(new_line))
129             zero.extend(new_line)
130             for x in range(self.size):
131                 self.matrix[x][t_col] = zero[x]
132
133         for t_col in range(self.size):
134             list_b = [0] * self.size
135             for i in range(self.size - 1, 0, -1):
136                 if self.matrix[i -1][t_col] == self.matrix[i][t_col] and list_b[i] != 1:
137                     self.matrix[i][t_col] = self.matrix[i][t_col] * 2
138                     list_b[i] = 1
139                     for j in range(i - 1, 0, -1):
140                         self.matrix[j][t_col] = self.matrix[j - 1][t_col]
141                         list_b[j] = list_b[j - 1]
142                     self.matrix[0][t_col] = 0
143                     list_b[0] = 0
144                 else:
145                     pass
146         return self.matrix
147     #add a new num in matrix where is 0
148     def add_random_num(self):
149         zero_list = []
150         for i in range(self.size):
151             for j in range(self.size):
152                 if self.matrix[i][j] == 0:
153                     zero_list.append(i*self.size +j)
154         if len(zero_list) > 0:
155             #get a random position--->random.choice(iterable)
156             pos = random.choice(zero_list)
157             num = random.choice([2,2,2,4])
158             self.matrix[pos / self.size][pos % self.size] = num
159             return True
160         else:
161             return False
162     #display the chess
163     def display(self):
164         print "The Chess is:\n"
165         for i in range(self.size):
166             for j in range(self.size):
167                 print ‘%4d‘ % self.matrix[i][j],
168             print ‘\n‘,
169     #get the max num in the chess
170     def get_max_num(self):
171         return max([max(self.matrix[i]) for i in range(self.size)])
172 def main():
173     print ‘Welcome to the 2048 game:‘
174     while True:
175         try:
176             size = int(raw_input(‘choose the size you want:‘))
177             if size > 2:
178                 game = Game(size)
179                 game.start()
180                 break
181             else:
182                 print ‘the num should greater than 2‘
183         except:
184             print ‘wrong input!‘
185
186
187 if __name__ == ‘__main__‘:
188     main()
189     

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

时间: 2024-11-05 19:01:17

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

【Qt点滴】游戏2048

看到了挺火的2048,就想用Qt实现一下,游戏逻辑倒是不复杂,稍微推敲就能搞定,倒是动画和各种细节前前后后参考了很多,也想了很久. 一个月前把功能都实现了,因为考试等各种琐事,这几天才想到整理下.真正编写的时间也并不久,一周左右吧. 这次是用Qt5开发,一个QWidget窗口,添加一个restart按钮,一个最高分label,一个当前分label.然后16宫格的游戏面板部分继承自QGLWidget类,面板监听鼠标按下和放开坐标来识别四个方向的移动. 逻辑部分不复杂,每次计算更新当前面板的分数后,

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

完整源代码如下,敬请读者批评指正: 1 /* 2 * Copyright (C) Judge Young 3 * E-mail: [email protected] 4 * Version: 1.0 5 */ 6 7 #include <stdio.h> 8 #include <time.h> /* 包含设定随机数种子所需要的time()函数 */ 9 #include <conio.h> /* 包含Windows平台上完成输入字符不带回显和回车确认的getch()函数

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

1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是 原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上下文,或者1.2.3.4,一篇包 你能玩happy~虽然我从来没有玩到过2048!!!其实大家也可以当作自定义控件来看~~~ 特别说明一下,游戏2048里面的方块各种颜色来源于:http://download.csdn.net/detail/qq1121674367/7155467,这个2048的

[小游戏]2048

益智小游戏2048    玩法:    该游戏使用方向键让方块上下左右移动.如果两个带有相同数字的方块在移动中碰撞,则它们会合并为一个方块,且所带数字变为两者之和.每次移动时,会有一个值为2或者4的新方块出现.    可能不好理解,你玩几下就知道了.    这款游戏玩起来会让你”根本停不下来“,很有意思的.通关截图: 游戏官网:http://gabrielecirulli.github.io/2048/ date:2014-10-26

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

1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上下文,或者1.2.3.4,一篇包你能玩happy~虽然我从来没有玩到过2048!!!其实大家也可以当作自定义控件来看~~~ 特别说明一下,游戏2048里面的方块各种颜色来源于:http://download.csdn.net/detail/qq1121674367/7155467,这个2048的代码

Andorid游戏2048开发(一)

最近有一款Android平台下的游戏很是火爆----2048.下面记录一下开发过程.由于笔者是Android开发的初学者,所以希望借以此文熟悉整个Android开发的流程. 首先创建Game2048的游戏项目.我们选择最低平台为Android4.0(API 14),最高支持平台Android4.4(API 19),然后一路Next,创建完成之后,我们修改activity_main.xml文件.修改默认的布局方式为LinearLayout布局方式.然后我们在嵌套一个Linearyout布局,用户游

180行ruby代码搞定游戏2048

最今在玩2048这款小游戏,游戏逻辑简单,非常适合我这种对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: require 'optparse' module Help HELP_TEXT =<<HELP press buttons for move l => move to left r => move to right t => move to top b => move to bo

简易游戏 2048 制作

// Matrix.h #ifndef MATRIX_H #define MATRIX_H #include<iostream> #include<time.h> #include<stdlib.h> #define rows 4 #define cols 4 #define L 6 using std::ostream; classMatrix{ friend ostream&operator<<(ostream& out,constMat

JavaScript小游戏--2048(PC端)

1.初始化棋局 $(document).ready(function() { prepare_for_mobile(); //适配移动端 new_game(); }); 2.开始新游戏 function new_game() { back = []; //初始化棋盘 init(); //在随机两个格子生成数字 generate_one_number(); generate_one_number(); } 3.初始化 function init() { for (var i = 0; i < 4;