在过去的两周,通过对python基础知识的学习以及通过一个具体的小游戏的练习,大概对Python有了一个初步的了解,在这里做一个总结,希望对今后的进一步学习有帮助。

之前学习过C语言,在学习了Python之后,给我最大的感觉就是Python更加简洁易学,语句更加易读,并且可以通过载入各种库来实现很多功能,因此功能也更加强大。而Python和C语言也有很多相似的地方,下面总结一些Python比较独特的地方。

1. 分号“;”的使用

C语言中分号是必须作为每句语句的结束标志,而在Python中,分号则没有那么重要了,Python一般通过换行来表示语句的结束,但要在一行中输入多条语句,也就是一行物理行中包括多个逻辑行,就必须使用分号来分隔语句,而Python一般不推荐使用分号,换行来区分每条语句更加简洁明了。

2. 缩进

缩进在Python中是非常重要的,Python中通过缩进来确定各个语句的分组,每一块语句必须要有相同的缩进,一般的编辑器会自动完成缩进,一般是四个空格。

3. 数据类型

数据类型大多和C语言相同,包括字符串、布尔类型、整数、浮点数、数字,比较特殊的有列表、元组、字典。Python在定义一个变量时不需要像C语言一样限定它的类型,变量会根据附给它的值自动决定它的类型,但是也可以强制转换类型,例如int(x)就是把x转型成整数。

(1)列表

列表list是一个是一个可变的有序表,是Python内置的一种数据类型,可以随时添加、删除、替换其中的元素。其用中方括号包围、逗号隔开的一组元素,且列表中的元素可以是不同的类型。

(2)元组

除了序列以外的另一种有序表称为元组tuple,但是元组一旦初始化便不能修改,在定义时,元组的元素就被确定了。这样能让代码更加安全。

(3)字典

字典Dict,能够快速查找信息。在字典中,名字叫做“键(key)”,对应的内容信息叫做“值(value)”。字典就是一个键值对的集合。键值对用冒号分割,每个对之间用逗号分割,整个字典包括在花括号中。

4. for...in...语句

Python中的for循环与C语言中的for循环完全不同,通过它可以遍历序列中的每一个项目。常见的有for i in range(1,5),表示i由1循环到4。

5. 模块

Python之所以功能强大,主要是因为它自带功能丰富的标准库,以及数量庞大的第三方库,使用这些功能的基本方法就是使用模块。通过函数,可以在程序里重用代码;通过模块,则可以重用别的程序中的代码。模块可以理解为是一个包含了函数和变量的py文件。在你的程序中引入了某个模块,就可以使用其中的函数和变量。通过import引入。

6. 类

类似常见的int类型,我们也可以通过类能够创建一个新的类型,其中的对象就是实例,类通过关键字class创建,一般都包含一个__init__()函数以及self参数,用来初始化对象。

同时我们也可以创建基类和子类,创建子类时类名后的括号里应包含基类类名。

在学习了Python的基本知识后,通过做一个俄罗斯方块小游戏进一步练习和学习Python。这里需要先安装一个pygame库,安装完成后,需要在开始时输入from pygame.locals import * 即引入pygame中的所有常量,之后便可以使用pygame了。下面总结一些比较重要的地方。

首先要创建一个游戏窗口,使用pygam.display.set_mode()方法创建,然后设置游戏中一个方块的的大小,也就是一个方块对应20个像素点,俄罗斯方块中每个砖块是由四个小方块组成,但在设计过程中,我用5*5的列表来表示砖块模板,是因为这样表示在之后为方块上色时将小方块坐标转换成像素坐标时更加方便。通过引入random模块来随机产生不同类型的小方块。

再一个就是在游戏窗口内显示文字:首先使用pygame.font.SysFont()创建几种字体font,再调用font.render()方法写字,可以设置要写的文字,文字颜色背景颜色,是否开启抗齿距。之后得到一个Surf,再通过get_rect()方法得到一个Rect,在Rect中设置要在窗口中显示的位置,最后通过bilt(Surf,Rect)方法在在游戏窗口显示文字。

游戏运行还有一个重要的的参数便是帧数,也就是一秒中循环的次数,通过pygame.time.Clock()得到一个对象,再通过tick()方法设置帧数。

循环过程中,要响应按下键盘的事件,通过pygame.event.get()来得到要处理的事件,event.type来处理事件是按下键盘还是键盘弹起,处理完成后,再通过event.key来判断具体是哪个按键。游戏过程中首先要判断是否按下退出键Esc或q,按下则立即退出。

然后响应是否按下方向键,为了能够响应连续按下按键时,方块仍能连续移动,先设置一个时间常量,表示每次持续按下该时间常量时会移动,采用time模块中的time()方法来获得当前时间,与之前按下键时的时间相减,得到的时间大于时间常量经处理便可以实现连续移动。这个处理过程很巧妙,方块每移动一格都会重新设置按下键时的时间,因此可以实现方块的连续移动。

除了要响应移动外,还要响应砖块的旋转,这个处理也十分巧妙,因为砖块的各个模型及其旋转之后的各种模型都储存在列表里,因此可以设置一个参数来表示,每按一次就加一,但如果单纯地这样加,可能会超过总的旋转模型,因此这里用加完的参数模除(%)总的旋转模型,这样一来便不必担心上述问题。

为了使用方便,将砖块的各种模型做成一个字典,用字符串当关键字,值为存着模型的列表。同时通过函数随机得到一个砖块,为了使用方便,同样将其设置为字典,其中包括,砖块的基本类型,各个旋转模型,横纵坐标,以及砖块的颜色。

之后便是在主函数中通过各种功能函数来实现俄罗斯方块游戏。

在编写游戏程序的过程中,由于对各种模块不是很熟悉,写起来很费力,参考了一个博主的程序,之后一个一个对模块和方法查找,即使写完程序,也会有各种错误需要慢慢调试,也正是这样,对Python的学习有很大的帮助。我觉得学习一门语言最好的方法就是多读多练程序代码,今后还需要阅读和实践更多程序代码,进一步熟悉使用Python这门语言。

import random, time, pygame, sys

from pygame.locals import *

FPS = 25

WINDOWWIDTH = 640#整个游戏屏幕的宽

WINDOWHEIGHT = 480#整个游戏屏幕的高

BOXSIZE = 20#每个小格子的宽和高

BOARDWIDTH = 10#游戏窗口本身有10个方块的宽度

BOARDHEIGHT = 20#游戏窗口本身有20个方块的高度

BLANK = '.'#表示空白

MOVESIDEWAYSFREQ = 0.1

MOVEDOWNFREQ = 0.1

XMARGIN = int((WINDOWWIDTH - BOARDWIDTH * BOXSIZE) / 2)#表示游戏界面两边剩余宽度

TOPMARGIN = WINDOWHEIGHT - (BOARDHEIGHT * BOXSIZE) - 5#表示游戏界面上面剩余宽度,-5是因为留出画线的地方

# R G B

WHITE = (255, 255, 255)#白色

GRAY = (185, 185, 185)#灰色

BLACK = ( 0, 0, 0)#黑色

RED = (155, 0, 0)#红色

GREEN = ( 0, 155, 0)#绿色

BLUE = ( 0, 0, 155)#蓝色

YELLOW = (155, 155, 0)#黄色

BORDERCOLOR = BLACK#边界颜色

BGCOLOR = WHITE#背景颜色

TEXTCOLOR = YELLOW#文字颜色

COLORS = (BLUE,GREEN,RED,YELLOW) #方块四种颜色,存于COLORS元组中

TEMPLATEWIDTH = 5#砖块模板宽

TEMPLATEHEIGHT = 5#砖块模板高

S_SHAPE_TEMPLATE = [['.....', #S形状的模板

'.....',

'..OO.',

'.OO..',

'.....'],

['.....',

'..O..',

'..OO.',

'...O.',

'.....']]

Z_SHAPE_TEMPLATE = [['.....', #Z形模板

'.....',

'.OO..',

'..OO.',

'.....'],

['.....',

'..O..',

'.OO..',

'.O...',

'.....']]

I_SHAPE_TEMPLATE = [['..O..', #I型模板

'..O..',

'..O..',

'..O..',

'.....'],

['.....',

'.....',

'OOOO.',

'.....',

'.....']]

O_SHAPE_TEMPLATE = [['.....', #O型模板

'.....',

'.OO..',

'.OO..',

'.....']]

J_SHAPE_TEMPLATE = [['.....', #J型模板

'.O...',

'.OOO.',

'.....',

'.....'],

['.....',

'..OO.',

'..O..',

'..O..',

'.....'],

['.....',

'.....',

'.OOO.',

'...O.',

'.....'],

['.....',

'..O..',

'..O..',

'.OO..',

'.....']]

L_SHAPE_TEMPLATE = [['.....', #L型模板

'...O.',

'.OOO.',

'.....',

'.....'],

['.....',

'..O..',

'..O..',

'..OO.',

'.....'],

['.....',

'.....',

'.OOO.',

'.O...',

'.....'],

['.....',

'.OO..',

'..O..',

'..O..',

'.....']]

T_SHAPE_TEMPLATE = [['.....', #T型模板

'..O..',

'.OOO.',

'.....',

'.....'],

['.....',

'..O..',

'..OO.',

'..O..',

'.....'],

['.....',

'.....',

'.OOO.',

'..O..',

'.....'],

['.....',

'..O..',

'.OO..',

'..O..',

'.....']]

PIECES = {'S': S_SHAPE_TEMPLATE,

'Z': Z_SHAPE_TEMPLATE,

'J': J_SHAPE_TEMPLATE,

'L': L_SHAPE_TEMPLATE,

'I': I_SHAPE_TEMPLATE,

'O': O_SHAPE_TEMPLATE,

'T': T_SHAPE_TEMPLATE}

def main():

global FPSCLOCK, DISPLAYSURF, BASICFONT, BIGFONT

pygame.init()#初始化

FPSCLOCK = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))

BASICFONT = pygame.font.SysFont('arial',18)#小字体

BIGFONT = pygame.font.SysFont('arial',70)#大字体

pygame.display.set_caption('Tetris')#设置窗口标题

showTextScreen('Game Tetris')

while True:

runGame()

showTextScreen('Game Over')

def runGame():

board = getBlankBoard()

lastMoveDownTime = time.time()

lastMoveSidewaysTime = time.time()

lastFallTime = time.time()

movingDown = False

movingLeft = False

movingRight = False

score = 0

level, fallFreq = calculateLevelAndFallFreq(score)

fallingPiece = getNewPiece()

nextPiece = getNewPiece()

while True:

if fallingPiece == None:

fallingPiece = nextPiece

nextPiece = getNewPiece()

lastFallTime = time.time()

if not isValidPosition(board, fallingPiece):

return

for event in pygame.event.get():

if event.type == KEYUP:#当按键弹起的时候响应KEYUP事件

if (event.key == K_LEFT):

movingLeft = False

elif (event.key == K_RIGHT):

movingRight = False

elif (event.key == K_DOWN):

movingDown = False

elif event.type == KEYDOWN:#响应按键

if(event.key == K_ESCAPE):

pygame.quit()

sys.exit()

elif (event.key == K_LEFT) and isValidPosition(board, fallingPiece, adjX=-1):

fallingPiece['x'] = fallingPiece['x'] -1

movingLeft = True

movingRight = False

lastMoveSidewaysTime = time.time()

elif (event.key == K_RIGHT ) and isValidPosition(board, fallingPiece, adjX=1):

fallingPiece['x'] =fallingPiece['x'] + 1

movingRight = True

movingLeft = False

lastMoveSidewaysTime = time.time()

elif event.key == K_UP :

fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(PIECES[fallingPiece['shape']])

if not isValidPosition(board, fallingPiece):

fallingPiece['rotation'] = (fallingPiece['rotation'] - 1) % len(PIECES[fallingPiece['shape']])

elif (event.key == K_DOWN ):

movingDown = True

if isValidPosition(board, fallingPiece, adjY=1):#下一个位置有效

fallingPiece['y'] = fallingPiece['y'] +1

lastMoveDownTime = time.time()

if (movingLeft or movingRight) and time.time() - lastMoveSidewaysTime > MOVESIDEWAYSFREQ:

if movingLeft and isValidPosition(board, fallingPiece, adjX=-1):

fallingPiece['x'] =fallingPiece['x'] - 1

elif movingRight and isValidPosition(board, fallingPiece, adjX=1):

fallingPiece['x'] =fallingPiece['x'] + 1#右移动一个位置

lastMoveSidewaysTime = time.time()

if movingDown and time.time() - lastMoveDownTime > MOVEDOWNFREQ and isValidPosition(board, fallingPiece, adjY=1):

fallingPiece['y'] = fallingPiece['y'] + 1

lastMoveDownTime = time.time()

if time.time() - lastFallTime > fallFreq:#fallFreq向下移动的速率

if not isValidPosition(board, fallingPiece, adjY=1):#当砖块下一个位置无效时,即表示砖块当前已经到底了。

addToBoard(board, fallingPiece)

score=score + removeCompleteLines(board)

level, fallFreq = calculateLevelAndFallFreq(score)

fallingPiece = None

else:

fallingPiece['y'] = fallingPiece['y'] +1

lastFallTime = time.time()

DISPLAYSURF.fill(BGCOLOR)

drawBoard(board)

drawStatus(score, level)

drawNextPiece(nextPiece)

if fallingPiece != None:#砖块没有下落到底部

drawPiece(fallingPiece)

pygame.display.update()

FPSCLOCK.tick(FPS)

def makeTextObjs(text, font, color):

surf = font.render(text, True, color)

return surf, surf.get_rect()

def checkForKeyPress():

for event in pygame.event.get([KEYDOWN, KEYUP]):

if event.type == KEYDOWN:

continue

return event.key

return None

def calculateLevelAndFallFreq(score):

level = int(score / 10) + 1

fallFreq = 0.32 - (level * 0.02)

return level, fallFreq

def getNewPiece():

shape = random.choice(list(PIECES.keys()))

newPiece = {'shape': shape,

'rotation': random.randint(0, len(PIECES[shape]) - 1),

'x': int(BOARDWIDTH / 2) - int(TEMPLATEWIDTH / 2),

'y': -2,

'color': random.randint(0, len(COLORS) - 1)

}

return newPiece

#给游戏板数据结构添加砖块

def addToBoard(board, piece):

for x in range(TEMPLATEWIDTH):

for y in range(TEMPLATEHEIGHT):

if PIECES[piece['shape']][piece['rotation']][y][x] != BLANK:

board[x + piece['x']][y + piece['y']] = piece['color']

def getBlankBoard():

board = []

for i in range(BOARDWIDTH):

board.append([BLANK] * BOARDHEIGHT)

return board

def isOnBoard(x, y):

return x >= 0 and x < BOARDWIDTH and y < BOARDHEIGHT

def isValidPosition(board, piece, adjX=0, adjY=0):

for x in range(TEMPLATEWIDTH):

for y in range(TEMPLATEHEIGHT):

isAboveBoard = y + piece['y'] + adjY < 0

if isAboveBoard or PIECES[piece['shape']][piece['rotation']][y][x] == BLANK:

continue

if not isOnBoard(x + piece['x'] + adjX, y + piece['y'] + adjY):

return False

if board[x + piece['x'] + adjX][y + piece['y'] + adjY] != BLANK:

return False

return True

def isCompleteLine(board, y):

for x in range(BOARDWIDTH):

if board[x][y] == BLANK:#如果存在空白,则没填满

return False

return True

def removeCompleteLines(board):

numLinesRemoved = 0

y = BOARDHEIGHT - 1

while y >= 0:

if isCompleteLine(board, y):

for pullDownY in range(y, 0, -1):

for x in range(BOARDWIDTH):

board[x][pullDownY] = board[x][pullDownY-1]

for x in range(BOARDWIDTH):

board[x][0]=BLANK

numLinesRemoved=numLinesRemoved+1

else:

y =y- 1

return numLinesRemoved

def convertToPixelCoords(boxx, boxy):

return (XMARGIN + (boxx * BOXSIZE)), (TOPMARGIN + (boxy * BOXSIZE))

def drawBoard(board):

pygame.draw.rect(DISPLAYSURF, BORDERCOLOR, (XMARGIN, TOPMARGIN, (BOARDWIDTH * BOXSIZE), (BOARDHEIGHT * BOXSIZE)), 5)

pygame.draw.rect(DISPLAYSURF, BGCOLOR, (XMARGIN, TOPMARGIN, BOXSIZE * BOARDWIDTH, BOXSIZE * BOARDHEIGHT))

for x in range(BOARDWIDTH):

for y in range(BOARDHEIGHT):

drawBox(x, y, board[x][y])

def drawBox(boxx, boxy, color, pixelx=None, pixely=None):

if color == BLANK:

return

if pixelx == None and pixely == None:

pixelx, pixely = convertToPixelCoords(boxx, boxy)

pygame.draw.rect(DISPLAYSURF, COLORS[color], (pixelx + 1, pixely + 1, BOXSIZE - 1, BOXSIZE - 1))

def drawPiece(piece, pixelx=None, pixely=None):

shapeToDraw = PIECES[piece['shape']][piece['rotation']]

if pixelx == None and pixely == None:

pixelx, pixely = convertToPixelCoords(piece['x'], piece['y'])

for x in range(TEMPLATEWIDTH):

for y in range(TEMPLATEHEIGHT):

if shapeToDraw[y][x] != BLANK:

drawBox(None, None, piece['color'], pixelx+(x * BOXSIZE), pixely + (y * BOXSIZE))

def drawNextPiece(piece):

nextSurf = BASICFONT.render('Next:', True, TEXTCOLOR)

nextRect = nextSurf.get_rect()

nextRect.topleft = (WINDOWWIDTH - 120, 80)

DISPLAYSURF.blit(nextSurf, nextRect)

drawPiece(piece, pixelx=WINDOWWIDTH-120, pixely=100)

def drawStatus(score, level):

scoreSurf = BASICFONT.render('Score:%s' % score, True, TEXTCOLOR)

scoreRect = scoreSurf.get_rect()

scoreRect.topleft = (WINDOWWIDTH - 150, 20)

DISPLAYSURF.blit(scoreSurf, scoreRect)

levelSurf = BASICFONT.render('Level:%s' % level, True, TEXTCOLOR)

levelRect = levelSurf.get_rect()

levelRect.topleft = (WINDOWWIDTH - 150, 50)

DISPLAYSURF.blit(levelSurf, levelRect)

def showTextScreen(text):

titleSurf, titleRect = makeTextObjs(text, BIGFONT, TEXTCOLOR)

titleRect.center = (int(WINDOWWIDTH / 2) - 3, int(WINDOWHEIGHT / 2) - 3)

DISPLAYSURF.blit(titleSurf, titleRect)

pressKeySurf, pressKeyRect = makeTextObjs('Press a key to play.', BASICFONT, TEXTCOLOR)

pressKeyRect.center = (int(WINDOWWIDTH / 2), int(WINDOWHEIGHT / 2) + 100)

DISPLAYSURF.blit(pressKeySurf, pressKeyRect)

while checkForKeyPress() == None:

pygame.display.update()

FPSCLOCK.tick()

if __name__ == '__main__':

main()

python论文结论_Python学习总结相关推荐

  1. 自学python困难吗_Python学习难不难?零基础好学吗?

    Python学习难不难?零基础好学吗?我想对于很多人来说,这都是非常关键的问题,也是很多人都在疑惑的问题.现在市场发展,行业的竞争压力是非常大的,转型的人也是非常多,对于不少人转型人才来说,Pytho ...

  2. python龟图_python学习turtle(龟图标状态)

    2019独角兽企业重金招聘Python工程师标准>>> 记录学习 turtle.hideturtle() turtle.ht(),隐藏龟图标. turtle.showturtle() ...

  3. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  4. 自学python如何就业_python学习:想要自学Python达到就业的水平,应该怎么去学习...

    点击蓝字"python教程"关注我们哟! 这篇文章主要给大家讲解学习Python技术应该如何学习才能达到企业要求 内容会涉及到Python的学习技巧以及系统的学习知识安排和学习方法 ...

  5. 有哪些免费自学python的网站_Python学习网站有哪些?Python基础教程网站推荐

    Python学习网站有哪些?Python基础教程网站推荐:菜鸟教程.PHP中文网.PHP中文网.W3C.Reddit.博学谷.python中文学习大本营.Python 3 Module of the ...

  6. python二进制移位_python学习特辑——二进制和位运算篇

    以前学习java的时候,二进制和位运算只停留在"懂"的程度,从来没有花时间去推导和总结,作为一个数学系的学生,一直想花点时间做推理证明 java和python关于二进制和位运算的规 ...

  7. python sorted下标_Python学习教程(Python学习路线):第七天-字符串和常用数据结构

    Python学习教程(Python学习路线):字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代 ...

  8. python控制流实例_python学习笔记系列----(二)控制流

    实际开始看这一章节的时候,觉得都不想看了,因为每种语言都会有控制流,感觉好像我不看就会了似的.快速预览的时候,发现了原来还包含了对函数定义的一些描述,重点讲了3种函数形参的定义方法,章节的最后讲述了P ...

  9. python处理图片文件_python 学习(二)处理图片、TXT文档

    一.尝试实现场景:将一个txt文档内容读到程序的数组内 1.新建一个文档 array.txt,写入内容 ,如: 2.使用命令行读取: 1)在上述新建文档位置相同目录下打开命令提示窗 2)打开文件,读入 ...

最新文章

  1. pythonchallenge_level9
  2. scikit-learn kmeans++
  3. linux 中php以及nginx的重启命令
  4. 页式存储管理程序模拟_ADAS/AD开发12 - 数据存储管理
  5. linux7.2 静态IP设置,Centos 7 学习之静态IP设置
  6. JAVA 操作系统已经来到第五个版本了 现陆续放出三个版本 这是第二个版本
  7. python 整数输出 d f_如何将数字(10,11,12,13,14,15)分配给Python 3中的字母(A,B,C,D,E,F)?...
  8. erp开发和java开发区别_Java程序员求职必学:Spring boot学习指南!
  9. java dataset类的方法,C#中DataSet转化为实体集合类的方法
  10. textview 背景变形_嘉兴海宁市家庭别墅背景墙装修供应——零度木门厂家
  11. 洛谷——P1597 语句解析(两种解法)
  12. 计算机主板维修自学视频教程(全套)
  13. 界面画好了如何开发软件_如何做儿童类APP?来看英语流利说的实战经验总结!...
  14. Tensorflow分布式机器学习平台
  15. ChatGPT指令大全(中文版)
  16. OC不可变字符串和可变字符串(1)
  17. 酒店数据泄露门后万豪会员计划遭重创
  18. 青云志 java_青云志手游纯手工架设含本地注册教程
  19. 【尚硅谷Java笔记+踩坑】Git(分布式版本控制工具)
  20. spring源码分析04-spring循环依赖底层源码解析

热门文章

  1. php使用redis缓存
  2. python 通达信自动下载收盘和财务数据
  3. Chapter 22 UDP and TCP 第二十二章UDP和TCP协议作业
  4. UDC分类号查询(转载)
  5. 非常简单的中英互译在线翻译操作方法
  6. java第一次作业_Java第一次作业
  7. 解决Windows提示缺少mfc140.dll文件的问题
  8. ArcGIS中的土地利用变化分析
  9. 相机标定与矫正(总结)
  10. Java基于opencv—矫正图像