Pygame学习(二)基本知识 & 2048游戏实战

1、声明和导入:在程序的顶部,会存在一些注释用于说明这游戏是什么,谁开发的它,用户可以从中获取必要的版本信息。

2、幻数:在开发过程中尽量使用常量变量,尽可能的避免在程序中出现数值信息。方便在后期进行修改时减少对程序的修改量。

所谓的幻数就是在程序中出现的非常量变量的数据,我们在开发过程中要尽量避免这种情况的出现。

3、assert语句进行检查:assert语句包括三个部分即assert关键字、一个逻辑表达式,第三部分是一个提示信息(字符串)

语法结构:assert 逻辑表达式,“提示信息”
例:assert number%2==0,"number不是偶数"

通过assert我们可以较早的检查出程序的逻辑错误,使得程序较早的崩溃并返回错误信息。

4、让代码更好看(简洁):将程序中所有用到的数据以常量变量的形式提前声明,便于后期直接使用。

5、元组与列表的区别与相互转换:

元组内的数据不可变,列表内的数据可变(元组不可变,列表可变),对于单项元组需要在数据末尾加一个逗号用于表示

这个元组,否则就会被解释称单个数据类型的数据。对于元组与列表可以进行相互转换,即直接通过 list tuple 方法即可;

6、判断全局变量和局部变量:(全局变量会使得程序便于调试)

1)用global声明的变量或者函数为全局的;

2)如果一个变量名称与全局变量相同,并且在使用过程中没有对其赋值,则其实全局的;

3)如果一个变量名称与任意全局变量都不同,则该变量是局部的;

Finally 实战(2048小游戏)

这个小游戏只是对pygame的简单实践,内部具体功能还没有全部实现(如最后的游戏检测,块与块之间的合并等)

还请大家多多包容,必要的注释已经全部在代码中,计算机小白^-^如果有什么问题希望大家指出!!!

import random,pygame,sys
from  pygame.locals  import *
#导入必要的库
list=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#4*4二维列表
checklist=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]#检测二维列表
global direction #1 2 3 4 分别指合并方向
def AddBlock(list):#加入新数据
    i=16#最多判断16个位置
    while i!=0:
        x = random.randint(0, 3)
        y = random.randint(0, 3)#随机获取加入块的坐标位置
        if(list[x][y]==0):
            list[x][y]=2
            break
        i=i-1
    return i

def Init(list):#初始化数据
    AddBlock(list)
    AddBlock(list)#初始化加入两个块

def GameCheck(list):
    return False

def UP(list,i,j):
    while j>=1:
        if(list[i][j]==list[i][j - 1] or list[i][j-1]==0):
            list[i][j - 1] = list[i][j - 1] + list[i][j]
            list[i][j] = 0
        j=j-1
    return False

def DOWN(list,i,j):#下侧移动
    while j<3:
        if(list[i][j]==list[i][j+1] or list[i][j+1]==0):
            list[i][j+1]=list[i][j+1]+list[i][j]
            list[i][j] = 0
        j=j+1
    return False

def RIGHT(list,i,j):#右侧移动
    while i < 3:
        if (list[i][j] == list[i+1][j] or list[i+1 ][j] == 0):
            list[i+1][j] = list[i +1][j] + list[i][j]
            list[i][j] = 0
        i = i + 1
    return False

def LEFT(list,i,j):#左侧移动
    while i>=1:
        if(list[i][j]==list[i-1][j] or list[i-1][j]==0):
            list[i-1 ][j] = list[i-1][j] + list[i][j]
            list[i][j] = 0
        i=i-1
    return False

def Move(direction):#移动和更新界面
        if (direction == 1):  # 上
            for i in range(0, 4):
                for j in range(0, 4):
                    UP(list,i,j)
        if (direction == 4):  # 右
            for i in range(3,-1, -1):
                for j in range(0,4):
                    RIGHT(list,i,j)
        if (direction == 2):  # 下
            for i in range(3,-1,-1):
                for j in range(0,4):
                    DOWN(list,i,j)
        if (direction==3):#左
            for i in range(1, 4):
                for j in range(0, 4):
                    LEFT(list,i,j)

def Draw(list,display):#绘制矩形块以及数字
    for i in range(0,4):
        for j in range(0,4):
            rect=pygame.Rect(2+120*i,4+120*j,115,115)#绘制矩形区域
            pygame.draw.rect(display,(255,218,185),rect)
            if(list[i][j]!=0):
                font=pygame.font.Font('freesansbold.ttf',36)#绘制数字文本信息
                text=font.render(str(list[i][j]),True,(255,255,255))
                display.blit(text,(rect.centerx-len(str(list[i][j]))*11,rect.centery-13))
    return 0

def main():
    WSize=480
    WHeight=482#游戏界面的长度和宽度
    pygame.init()#游戏初始化
    Display=pygame.display.set_mode((WSize,WHeight))
    pygame.display.set_caption("2048")
    Init(list)#初始化列表
    print(list)
    while True:#函数主体部分
        Draw(list,Display)
        for event in pygame.event.get():
            if event.type==QUIT:#游戏退出
                pygame.quit()
                sys.exit()
            elif event.type==KEYDOWN:#按键响应
                if event.key==K_UP:
                    direction = 1#向上移动
                elif event.key==K_DOWN:
                    direction = 2#向下移动
                elif event.key == K_LEFT:
                    direction = 3#向左移动
                elif event.key == K_RIGHT:
                    direction = 4#向右移动
                Move(direction)#块移动
                AddBlock(list)#增加新的块数据
        if GameCheck(list):
            break#游戏检测
        direction = 0 #移动方向重新初始化
        pygame.display.update()#界面更新

if __name__ == '__main__':
    main()#主函数

最后的最后,解释一下为什么要在程序末尾加一个这样的代码,你会发现几乎所有的程序都会这么书写 

if __name__ == '__main__':
    main()#主函数

这看似毫无意义,为什么不直接将所有代码写完反而要通过main来调用呢,加了这两行反而增加了代码的长度。

原因如下:

1、有main()函数,使得我们可以拥有局部变量,否则的话main()函数之内的变量将全部变为全局变量,任何人都可

以对其修改。而且限制全局变量的数目方便我们对代码进行调试。

2、这允许我们导入程序,可以调用和测试单个函数。当我们导入一个模块时,其中所有的代码都会运行。如果我们

没有main()函数,并且让其他的代码都处于全局作用域中,那么只要我们导入了它,整个程序就会自动运行,无法对

单个的函数进行测试和调用。

(注:在整个程序开发过程中,我们一定要增强游戏的可读性,变量声明最好见名知意,在必要的地方给予注释,

引用一个好友经常说的“不加注释的代码就是耍流氓”,那样的代码对程序员及其不友好,也不利于后期代码的维护。)

发布了79 篇原创文章 · 获赞 81 · 访问量 5713

猜你喜欢

转载自blog.csdn.net/weixin_44638960/article/details/103669463
今日推荐