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()函数,并且让其他的代码都处于全局作用域中,那么只要我们导入了它,整个程序就会自动运行,无法对
单个的函数进行测试和调用。
(注:在整个程序开发过程中,我们一定要增强游戏的可读性,变量声明最好见名知意,在必要的地方给予注释,
引用一个好友经常说的“不加注释的代码就是耍流氓”,那样的代码对程序员及其不友好,也不利于后期代码的维护。)