一、前言
看了提问者在另一个回答的评论
/>真的觉得提问者应该试试pygame。"工欲善其事,必先利其器。”个人认为,python与其他编程语言相比,亮点在于它有丰富的第三方库。比如用python做爬虫,原生库urllib2和第三方库requests相比,哪个效率更高?
二、推荐
pygame顾名思义,python和game相结合,专注于2D游戏开发。pygame很容易入门。网上有一些不错的教程,在此推荐我的入门教程:-Daydayblog-第1页(貌似博客不见了?——2016.10.15)
博客提供了16个章节:
pygame游戏编程(1)--pygame简介及安装
pygame游戏编程(2)--第一个pygame程序
pygame游戏编程(3)--文本打印及字体
pygame游戏编程(4)--像素、颜色和图像
pygame游戏编程(5)--surface对象
pygame游戏编程(6)--窗口显示
pygame游戏编程(7)--绘制几何图像
pygame游戏编程(8)--event事件
pygame游戏编程(9)--动画之直线运动
pygame游戏编程(10)--动画之向量
pygame游戏编程(11)--人机交互
pygame游戏编程(12)--人工智能
pygame游戏编程(13)--声音
pygame游戏编程(14)--音乐播放器
pygame游戏编程(15)--贪吃蛇游戏
三、贪吃蛇
没错,博客作者提供了如何使用pygame开发贪吃蛇的教程,详见pygame游戏编程(16)--贪吃蛇游戏-pygame教程-Daydayblog,作者程序运行界面如下: />
贪吃蛇主要包括以下几个方面:物体表示:蛇和苹果如何存储和显示、蛇如何移动和吃苹果变长;
字体显示:提示玩家该如何操作,显示玩家的分数;
人机交互:使用键盘的方向键来控制蛇的移动;
矩形绘图:绘制各种基本的图形来组成图像。
使用pygame开发贪吃蛇,您只需要先学会:
pygame简介及安装
surface对象
窗口显示
绘制几何图形
event事件
人机交互
四、成果
pygame开发2D游戏简直不能太简单,我粗略看了教程之后,就自主完成两个游戏开发:
1、贪吃蛇
/> /> />
附上本人贪吃蛇游戏代码(很多细节没处理好,勿喷。)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys,pygame,random
from pygame.locals import *
windowWidth=600
windowHeight=600
cellSize=20
head = 0
def main():
#初始化
pygame.init()
global screen
screen=pygame.display.set_mode((windowWidth,windowHeight))
pygame.display.set_caption("Greedy Snake")
gameStart()
FPS=pygame.time.Clock()
startX=cellSize*random.randint(8,windowWidth/cellSize-8)
startY=cellSize*random.randint(8,windowHeight/cellSize-8)
snake=[{'x': startX , 'y': startY},
{'x': startX - 1 * cellSize, 'y': startY},
{'x': startX - 2 * cellSize, 'y': startY},
{'x': startX - 3 * cellSize, 'y': startY}]
appleX = cellSize * random.randint(0, windowWidth / cellSize)
appleY = cellSize * random.randint(0, windowHeight / cellSize)
while True:
FPS.tick(15)
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
turn(snake,event)
move(snake)
if snake[head]['x']==appleX and snake[head]['y']==appleY:
appleX = cellSize * random.randint(0, windowWidth / cellSize)
appleY = cellSize * random.randint(0, windowHeight / cellSize)
eat(snake)
if snake[head]['x']<0 or snake[head]['x']>windowWidth or snake[head]['y']<0 or snake[head]['y']>windowHeight:
gameOver(snake)
for body in snake[1:]:
if body==snake[head]:
gameOver(snake)
screen.fill((0, 150, 0))
drawgrid()
drawSnake(snake)
pygame.draw.rect(screen, (255, 0, 0), (appleX, appleY, cellSize, cellSize))
pygame.display.update()
#绘制网格
def drawgrid():
for i in xrange(cellSize,windowWidth,cellSize):
pygame.draw.line(screen,(0,255,0),(i,0),(i,windowHeight),1)
for j in xrange(cellSize,windowHeight,cellSize):
pygame.draw.line(screen,(0,255,0),(0,j),(windowWidth,j),1)
#绘制蛇
def drawSnake(snake):
for cood in snake:
pygame.draw.rect(screen,(150,150,0),(cood['x'],cood['y'],cellSize,cellSize))
pygame.draw.rect(screen, (250, 250, 0), (snake[head]['x'], snake[head]['y'], cellSize, cellSize))
def turn(snake,event):
# 上下转向
if snake[head]['y'] == snake[1]['y']:
if event.key == K_UP:
del snake[-1]
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] - cellSize}
snake.insert(0, newHead)
elif event.key == K_DOWN:
del snake[-1]
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] + cellSize}
snake.insert(0, newHead)
# 左右转向
if snake[head]['x'] == snake[1]['x']:
if event.key == K_LEFT:
del snake[-1]
newHead = {'x': snake[head]['x'] - cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
if event.key == K_RIGHT:
del snake[-1]
newHead = {'x': snake[head]['x'] + cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
def move(snake):
# 向左运动
if snake[head]['x'] < snake[1]['x']:
del snake[-1]
newHead = {'x': snake[head]['x'] - cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
# 向右运动
elif snake[head]['x'] > snake[1]['x']:
del snake[-1]
newHead = {'x': snake[head]['x'] + cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
# 向上运动
elif snake[head]['y'] < snake[1]['y']:
del snake[-1]
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] - cellSize}
snake.insert(0, newHead)
# 向下运动
elif snake[head]['y'] > snake[1]['y']:
del snake[-1]
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] + cellSize}
snake.insert(0, newHead)
def eat(snake):
# 向左运动
if snake[head]['x'] < snake[1]['x']:
newHead = {'x': snake[head]['x'] - cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
# 向右运动
elif snake[head]['x'] > snake[1]['x']:
newHead = {'x': snake[head]['x'] + cellSize, 'y': snake[head]['y']}
snake.insert(0, newHead)
# 向上运动
elif snake[head]['y'] < snake[1]['y']:
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] - cellSize}
snake.insert(0, newHead)
# 向下运动
elif snake[head]['y'] > snake[1]['y']:
newHead = {'x': snake[head]['x'], 'y': snake[head]['y'] + cellSize}
snake.insert(0, newHead)
def gameStart():
screen.fill((0, 150, 0))
drawgrid()
fontObj1 = pygame.font.Font('freesansbold.ttf', 60)
textSurfaceObj1 = fontObj1.render('Greedy Snake', True, (255,255,255))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (windowWidth/2, windowHeight/3)
screen.blit(textSurfaceObj1,textRectObj1)
fontObj2 =pygame.font.Font('freesansbold.ttf', 30)
textSurfaceObj2 = fontObj2.render('Devloper: JIE ', True,(0, 0, 0))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (windowWidth/2, windowHeight*2/3)
screen.blit(textSurfaceObj2,textRectObj2)
pygame.display.update()
flag=True
while(flag):
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
if event.key==K_SPACE:
flag=False
def gameOver(snake):
screen.fill((0, 150, 0))
drawgrid()
fontObj = pygame.font.Font('freesansbold.ttf', 60)
textSurfaceObj1 = fontObj.render('Game over!', True, (255,0,0))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (windowWidth/3, windowHeight/3)
screen.blit(textSurfaceObj1,textRectObj1)
textSurfaceObj2 = fontObj.render('Score: %s' % (len(snake)-4), True, (255, 0, 0))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (windowWidth*2/3, windowHeight*2/3)
screen.blit(textSurfaceObj2,textRectObj2)
pygame.display.update()
while(True):
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if __name__ == '__main__':
main()
2、打飞机
/> /> />附上本人打飞机游戏代码(很多细节没处理好,勿喷。)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys,pygame,random
from pygame.locals import *
windowWidth=420
windowHeight=600
cellSize=20
shots=[]#飞行的子弹
enemys=[]#飞行的敌机
def main():
#初始化
global shoted
shoted= 0
global enemyed
enemyed = 0
pygame.init()
pygame.key.set_repeat(10) #重复响应一个按键
global screen,guard
screen=pygame.display.set_mode((windowWidth,windowHeight))
pygame.display.set_caption("aircraft")
gamestart()
FPS=pygame.time.Clock()
guard=[{'x':windowWidth/2-cellSize/2,'y':windowHeight-cellSize},#中0
{'x':windowWidth/2-cellSize/2,'y':windowHeight-2*cellSize},#上1
{'x': windowWidth / 2-cellSize*3/2, 'y': windowHeight - cellSize},#左2
{'x': windowWidth / 2+cellSize/2, 'y': windowHeight - cellSize}]#右3
while True:
screen.fill((0, 0, 0))
FPS.tick(5)
gamemedium()
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
#飞机左移
if event.key==K_LEFT and guard[2]['x']>-1:
for body in guard:
body['x']-=cellSize
#飞机右移
if event.key == K_RIGHT and guard[3]['x'] < windowWidth:
for body in guard:
body['x'] += cellSize
#发射子弹
if event.key==K_UP:
shoted+=1
shot={'x':guard[1]['x'],'y':guard[1]['y']}
shots.insert(0,shot)
#子弹飞行
if shots != [] :
for s in shots:
s['y']-=2*cellSize
flag=True
while(flag and shots!=[]):
flag=False
if shots[-1]['y']<0:
del shots[-1]
flag=True
#产生敌机
if random.randint(0,1)==0:
newenemy={'x':cellSize*random.randint(0,windowWidth/cellSize-1),'y':0}
enemys.insert(0,newenemy)
if enemys!=[]:
for enemy in enemys:
enemy['y'] += 0.5*cellSize #敌机飞行速度
drawenemys()
delshots=[]
delenemys=[]
for i in xrange(len(shots)):
for j in xrange(len(enemys)):
if len(shots) != [] and len(enemys) != []:
if shots[i]['x']==enemys[j]['x'] and shots[i]['y']
delshots.insert(0,i)
delenemys.insert(0,j)
for i in delshots:
del shots[i]
for j in delenemys:
del enemys[j]
enemyed+=1
if len(enemys)!=0:
if enemys[len(enemys)-1]['y']>windowHeight-cellSize:
gameover()
drawshots()
#drawgrid()
drawguard()
pygame.display.update()
#绘制网格
def drawgrid():
for i in xrange(cellSize,windowWidth,cellSize):
pygame.draw.line(screen,(255,255,255),(i,0),(i,windowHeight),1)
for j in xrange(cellSize,windowHeight,cellSize):
pygame.draw.line(screen,(255,255,255),(0,j),(windowWidth,j),1)
#绘制自己的战机
def drawguard():
for body in guard:
pygame.draw.rect(screen, (255, 255, 255), (body['x'], body['y'], cellSize, cellSize))
#绘制子弹
def drawshots():
for s in shots:
pygame.draw.rect(screen, (255, 255, 255), (s['x']+cellSize/3, s['y']+cellSize/4, cellSize / 3, cellSize/2))
#绘制敌机
def drawenemys():
for e in enemys:
pygame.draw.rect(screen, (255, 255, 255), (e['x'], e['y'], cellSize, cellSize/2))
pygame.draw.rect(screen, (255, 255, 255), (e['x']+cellSize/4, e['y']+cellSize/2, cellSize/2, cellSize / 2))
#游戏开始界面
def gamestart():
#drawgrid()
fontObj1 = pygame.font.Font('freesansbold.ttf', 60)
textSurfaceObj1 = fontObj1.render('Aircraft', True, (255,255,255))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (windowWidth/2, windowHeight/3)
screen.blit(textSurfaceObj1,textRectObj1)
fontObj2 =pygame.font.Font('freesansbold.ttf', 30)
textSurfaceObj2 = fontObj2.render('Developer : JIE', True,(255, 255, 255))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (windowWidth/2, windowHeight*2/3)
screen.blit(textSurfaceObj2,textRectObj2)
pygame.display.update()
flag=True
while(flag):
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type==KEYDOWN:
if event.key==K_SPACE:
flag=False
#游戏显示界面
def gamemedium():
fontObj1 = pygame.font.Font('freesansbold.ttf', 20)
textSurfaceObj1 = fontObj1.render('enemy: %d'%enemyed , True, (255, 255, 0))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (windowWidth-3*cellSize, 2*cellSize)
screen.blit(textSurfaceObj1, textRectObj1)
fontObj2 = pygame.font.Font('freesansbold.ttf', 20)
textSurfaceObj2 = fontObj2.render('shot: %d' % shoted, True, (255, 255, 0))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (2*cellSize, 2*cellSize)
screen.blit(textSurfaceObj2, textRectObj2)
#游戏结束界面
def gameover():
#drawgrid()
fontObj1 = pygame.font.Font('freesansbold.ttf', 50)
textSurfaceObj1 = fontObj1.render('Game over!', True, (255, 0, 0))
textRectObj1 = textSurfaceObj1.get_rect()
textRectObj1.center = (windowWidth / 2, windowHeight*3 / 8)
screen.blit(textSurfaceObj1, textRectObj1)
fontObj2 = pygame.font.Font('freesansbold.ttf', 30)
textSurfaceObj2 = fontObj2.render('shot: %d'%shoted, True, (255, 255, 255))
textRectObj2 = textSurfaceObj2.get_rect()
textRectObj2.center = (windowWidth / 2, windowHeight * 8 / 16)
screen.blit(textSurfaceObj2, textRectObj2)
fontObj3 = pygame.font.Font('freesansbold.ttf', 30)
textSurfaceObj3 = fontObj3.render('enemy: %d' % enemyed, True, (255, 255, 255))
textRectObj3 = textSurfaceObj3.get_rect()
textRectObj3.center = (windowWidth / 2, windowHeight * 9 / 16)
screen.blit(textSurfaceObj3, textRectObj3)
pygame.display.update()
flag = True
while (flag):
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE:
flag = False
if __name__ == '__main__':
main()