文档章节

Principle of Computing (Python)学习笔记(1) 2048

齐勇cn
 齐勇cn
发布于 2016/04/24 09:20
字数 998
阅读 34
收藏 1

 

Principle of Computing (Python)学习笔记(1) 2048

标签: Python

2014-06-27 06:44 2637人阅读 评论(1) 收藏 举报

 分类:

 

Scripts(49) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

这个Principle of Computing 是Rice U在coursera上的Python课系列的第二门课。这个课的每个mini-project都是有一些小小的挑战的。
第一个mini project是实现游戏2048。

1 合并的时候每个数字只能参加一次合并。
比如,图1使用了”—>“右方向键得到图2. 注意结果不是8,是4,4。
A given tile can only merge once on any given turn
You can slide the tiles in any direction (left, right, up, or down) to move them. When you do so, if two tiles of the same number end up next to each other, they combine to form a new tile with twice the value.

                                                                

                                      图1                                                                                                                                                       图2




2 准备工作
2.1. 矩阵
http://www.codeskulptor.org/#poc_indexed_grid.py


3 test模块
3.1  学校提供的简单的UnitTest模块poc_simpletest http://www.codeskulptor.org/#poc_simpletest.py
3.2  demo,通过poc_simpletest 测试模块去测试StopWatch
http://www.codeskulptor.org/#poc_format_testsuite.py
http://www.codeskulptor.org/#poc_format_student.py


4 import 
4.1 使用import https://class.coursera.org/principlescomputing-001/wiki/view?page=imports


5 我的代码

""" 
 
Clone of 2048 game. 
"""  
  
import poc_2048_gui          
import random  
  
# Directions, DO NOT MODIFY  
UP = 1  
DOWN = 2  
LEFT = 3  
RIGHT = 4  
  
# Offsets for computing tile indices in each direction.  
# DO NOT MODIFY this dictionary.      
OFFSETS = {UP: (1, 0),   
           DOWN: (-1, 0),   
           LEFT: (0, 1),   
           RIGHT: (0, -1)}   
  
def merge(line):  
    """ 
    Helper function that merges a single row or column in 2048 
    """  
    list_res = [0] * len(line)  
    bool_res = [1] * len(line)  
    var_j = 0  
    for var_i in range(len(line)):  
        if line[var_i] != 0:  
            if list_res[var_j-1] == line[var_i] and bool_res[var_j-1] == 1:  
                list_res[var_j-1] +=line[var_i]  
                bool_res[var_j-1] = 0;  
            else:  
                list_res[var_j] = line[var_i]  
                var_j += 1  
    return list_res  
  
class TwentyFortyEight:  
    """ 
    Class to run the game logic. 
    """  
  
    def __init__(self, grid_height, grid_width):  
        self._grid_height = grid_height  
        self._grid_width = grid_width    
        self._grid = [[ 0 for dummy_i in range(self._grid_width)] for dummy_j in range(self._grid_height)] #2D矩阵初始化  
        self._intial_tiles =  {  
                            UP: [ (0, i) for i in range(grid_width) ],  
                            DOWN: [ (grid_height-1, i) for i in range(grid_width) ],  
                            LEFT: [ (i, 0) for i in range(grid_height) ],  
                            RIGHT: [ (i, grid_width-1) for i in range(grid_height) ],  
                            }  
        self._move_helper_func = {  
                       UP:self.helper_merge_up,  
                       DOWN: self.helper_merge_down,  
                       LEFT: self.helper_merge_left,  
                       RIGHT: self.helper_merge_right,  
                       }  
        self._flag_changed = False;  
        self.reset()          
    def reset(self):  
        """ 
        Reset the game so the grid is empty. 
        """  
        for var_i in range(self._grid_height):  
            for var_j in range(self._grid_width):  
                self._grid[var_i][var_j]=0;  
              
    def __str__(self):  
        """ 
        Return a string representation of the grid for debugging. 
        """  
        res_str = "[\n"  
        for var_i in range(self._grid_height):  
            res_str += "["  
            for var_j in range(self._grid_width):  
                res_str += str(self._grid[var_i][var_j]) + ", "  
            res_str += "]\n"  
        res_str += "]"  
        return res_str  
  
    def get_grid_height(self):  
        """ 
        Get the height of the board. 
        """  
        return self._grid_height;  
      
    def get_grid_width(self):  
        """ 
        Get the width of the board. 
        """  
        return self._grid_width;  
                              
    def helper_merge_up(self,temp_list_new,ele):  
        """ 
        Move the merged list to the original grid, UP direction         
        """  
        for var_i in range(self.get_grid_height()):  
                if self._flag_changed == False and self._grid[var_i][ele[1]] != temp_list_new[var_i]:  
                    self._flag_changed  = True;  
                self.set_tile(var_i,ele[1],temp_list_new[var_i])  
  
    def helper_merge_down(self,temp_list_new,ele):  
        """ 
        Move the merged list to the original grid, DOWN direction         
        """  
        for var_i in range(self.get_grid_height()):  
                if self._flag_changed == False and self._grid[self.get_grid_height()-var_i-1][ele[1]] != temp_list_new[var_i]:  
                    self._flag_changed  = True;                  
                self.set_tile(self.get_grid_height()-var_i-1, ele[1], temp_list_new[var_i])  
          
    def helper_merge_left(self,temp_list_new,ele):  
        """ 
        Move the merged list to the original grid, LEFT direction         
        """          
        for var_i in range(self.get_grid_width()):  
                if self._flag_changed == False and self._grid[ele[0]][var_i] != temp_list_new[var_i]:  
                    self._flag_changed  = True;  
                self.set_tile(ele[0],var_i,temp_list_new[var_i])                      
                      
    def helper_merge_right(self,temp_list_new,ele):          
        """ 
        Move the merged list to the original grid, RIGHT direction         
        """          
        for var_i in range(self.get_grid_width()):  
                if self._flag_changed == False and self._grid[ele[0]][self.get_grid_width()-var_i-1] != temp_list_new[var_i]:  
                    self._flag_changed  = True;                  
                self.set_tile(ele[0], self.get_grid_width()-var_i-1, temp_list_new[var_i])                              
          
    def move(self, direction):  
        """ 
        Move all tiles in the given direction and add 
        a new tile if any tiles moved. 
        """  
        self._flag_changed = False;  
        for ele in self._intial_tiles[direction]:  
            temp_index_list = []  
            temp_list = []  
            temp_index_list.append(ele);  
            while temp_index_list[-1][0]>=0 and temp_index_list[-1][0]<self.get_grid_height() and temp_index_list[-1][1]>=0 and temp_index_list[-1][1]<self.get_grid_width():  
                temp_list.append(self.get_tile(temp_index_list[-1][0],temp_index_list[-1][1]))      
                temp_index_list.append((temp_index_list[-1][0]+OFFSETS[direction][0],temp_index_list[-1][1]+OFFSETS[direction][1]));  
            temp_list_new = merge(temp_list)  
            self._move_helper_func[direction](temp_list_new,ele)          
        if  self._flag_changed :  
            self.new_tile()  
              
          
    def new_tile(self):  
        """ 
        Create a new tile in a randomly selected empty  
        square.  The tile should be 2 90% of the time and 
        4 10% of the time. 
        """  
        non_zero_count = 0;  
        for var_i in range(self._grid_height):  
            for var_j in range(self._grid_width):  
                if self._grid[var_i][var_j] == 0:  
                    non_zero_count +=1;  
        random_choice = random.randrange(0,non_zero_count);  
        var_k = 0  
        generated_new_tile = False  
        for var_i in range(self._grid_height):  
            for var_j in range(self._grid_width):  
                if generated_new_tile==False and self._grid[var_i][var_j] == 0:  
                    if var_k != random_choice:  
                        var_k += 1     
                    else:  
                        random_2_4 = random.randrange(0,100)  
                        if random_2_4 <10:  
                            self.set_tile(var_i,var_j,4)  
                        else:  
                            self.set_tile(var_i,var_j,2)  
                        generated_new_tile = True;  
        
          
    def set_tile(self, row, col, value):  
        """ 
        Set the tile at position row, col to have the given value. 
        """          
        self._grid[row][col] = value;  
  
    def get_tile(self, row, col):  
        """ 
        Return the value of the tile at position row, col. 
        """                   
        return self._grid[row][col];  
poc_2048_gui.run_gui(TwentyFortyEight(4, 9))



本文转载自:http://blog.csdn.net/feliciafay/article/details/35175421

齐勇cn
粉丝 5
博文 20
码字总数 8610
作品 0
西安
技术主管
私信 提问
python!!等了好久吧,我来了。

先学习Python的哲学,这样可以让我知道是不是适合我去学。然后,学习一些Python的基本语法,网络上还是很多这类电子书的。了解后,就可以找些资料对比各各框架,选择出最适合自己需求的。初步...

倒逼live
2014/03/12
208
0
【opencv图像处理】图片的读取——cv2.imgread各种读取方式对比

以下实验基于python==3.6、opencv-python==4.1.0.25、imutils==0.5.2 ga288b8b3da0892bd651fce07b3bbd3a56 "cv2.imread")** 该方法第一个参数为文件名filename(文件路径+文件名) 第二个为读......

中年老俞
08/01
44
0
代码整洁之道-编写Pythonic代码

很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯。对此呢,我特意收集了一些适合所有学习...

陈祥安
06/13
0
0
ApacheCN 人工智能知识树 v1.0

Special Sponsors 贡献者:飞龙 版本:v1.0 最近总是有人问我,把 ApacheCN 这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间。但我觉得这是非常麻烦的,因为每本...

ApacheCN_飞龙
05/18
0
0
利用python函数的输入、输出定义与时序图相结合,让生活更有趣

写在前面 1. 重点是思路交流,利用python函数的输入、输出定义与时序图相结合,让流程更加的简洁、清晰。该方法不局限于工作,同样适用于学习笔记、恋爱心得...等等只要存在个体交互的活动。...

python达人
2018/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
220
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部