1 引言
这几天刚开始学习python,想要写一个有趣的程序。再加上以前学习C语言的时候就想写一个贪吃蛇的程序,但是C语言写好像泰国繁琐。就一直没有实施。python来写这个好像就没那么复杂了。当然对于我这样的小白直接自己写肯定写不出来这个代码。还是在我参考网上大佬的代码,加上自己多次学习以后才搞出来的。先看看效果图:
2 开发前准备
首先我们要借助一个python的第三方库pygame来实现。
Pygame是一个利用SDL库的游戏库, 是一组用来开发游戏软件的 Python 程序模块。
SDL(Simple DirectMedia Layer)是一个跨平台库,支持访问计算机多媒体硬件(声音、视频、输入等),SDL非常强大,但美中不足的是它是基于 C 语言的。
PyGame是 SDL 库的 Python 包装器(wrapper),Pygame 在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序。
既然要用到首先我们就要安装pygame库
方法很简单,直接在命令提示符(cmd)中输入以下代码就可以了
pip install pygame
3 代码
首先将pygame库和其它要使用的库导入
import random
import pygame
import sys
from pygame.locals import *
接着对一些全局变量进行初始化:
Snakespend = 10 #游戏速度
Window_Width = 800 #游戏范围宽度
Window_High = 500 #游戏窗口高度
Cell_Size = 20 #每一个的尺寸大小
Cell_W = Window_Width / Cell_Size #宽的格子数
Cell_H = Window_High / Cell_Size #高的格子数
#各种有可能用的的颜色
White = (255, 255, 255)
Black = (0, 0, 0)
Red = (255, 0, 0)
Green = (0, 255, 0)
DARKGreen = (0, 155, 0)
DARKGRAY = (40, 40, 40)
YELLOW = (255, 255, 0)
Red_DARK = (150, 0, 0)
BLUE = (0, 0, 255)
BLUE_DARK = (0, 0, 150)
BackGround = Black
#四个方向
UP = 'up'
DOWN = 'down'
RIGHT = 'right'
LEFT = 'left'
#蛇头
HEAD = 0
main函数的编写
def main():
global SnakespeedCLOCK, DISPLAYSURF, BASICFONT
pygame.init()
SnakespeedCLOCK = pygame.time.Clock() #定义一个变量来控制速度
DISPLAYSURF = pygame.display.set_mode((Window_Width,Window_High)) #设置窗口大小
BASICFONT = pygame.font.Font('freesansbold.ttf', 18) #设置游戏内字体
pygame.display.set_caption('Snake') #设置游戏窗口标题
while True :
RunGame() #调用参数
游戏运行RunGame函数
def RunGame() :
startX = random.randint(5,Cell_W-6) #初始化蛇的位置,且蛇的长度为3
startY = random.randint(5,Cell_H-6)
SnakeBody = [{'x': startX,'y' : startY},
{'x': startX-1,'y' : startY},
{'x': startX-2,'y' : startY}]
direCtion = RIGHT #蛇初始方向为向右
apple = {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)} #初始化食物的位置
while True :
#检测按键事件
for event in pygame.event.get():
if event.type == QUIT : #接收到退出时间时推出
pygame.quit()
sys.exit()
elif event.type == KEYDOWN : #判断按键事件,用WSAD和方向键判断方向
if (event.key == K_UP or event.key == K_w) and direCtion != DOWN :
direCtion = UP
elif (event.key == K_DOWN or event.key == K_s) and direCtion != UP :
direCtion = DOWN
elif (event.key == K_RIGHT or event.key == K_d) and direCtion != LEFT :
direCtion = RIGHT
elif (event.key == K_LEFT or event.key == K_a) and direCtion != RIGHT :
direCtion = LEFT
elif event.key == K_ESCAPE : #按下Esc时退出
pygame.quit()
sys.exit()
if SnakeBody[HEAD]['x'] == -1 or SnakeBody[HEAD]['x'] == Cell_W or SnakeBody[HEAD]['y'] == -1 or SnakeBody[HEAD]['y'] == Cell_H :
return #当前头的位置超出了窗口边界,退出
for Body in SnakeBody[1:] :
if Body['x'] == SnakeBody[HEAD]['x'] and Body['y'] == SnakeBody[HEAD]['y'] :
return #当前头的位置余身体碰到了,退出
if SnakeBody[HEAD]['x'] == apple['x'] and SnakeBody[HEAD]['y'] == apple['y'] : #如果头的位置和食物位置相同就再随机生成一个食物
apple = {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)}
else: #否则把蛇的尾巴删掉
del SnakeBody[-1]
#根据蛇的方向产生新的蛇头
if direCtion == UP :
newHeard = {'x':SnakeBody[HEAD]['x'],
'y':SnakeBody[HEAD]['y']-1}
elif direCtion == DOWN :
newHeard = {'x': SnakeBody[HEAD]['x'],
'y': SnakeBody[HEAD]['y'] + 1}
elif direCtion == RIGHT :
newHeard = {'x': SnakeBody[HEAD]['x'] + 1,
'y': SnakeBody[HEAD]['y']}
elif direCtion == LEFT :
newHeard = {'x': SnakeBody[HEAD]['x'] - 1,
'y': SnakeBody[HEAD]['y']}
SnakeBody.insert(0,newHeard) #将新的头插入到蛇的最前面
DISPLAYSURF.fill(BackGround) #将窗口填充为背景颜色
DrawSnakeBody(SnakeBody) #画蛇
DrawApple(apple) #画食物
DrawLine() #画网格线
DrawScreen(len(SnakeBody) - 3) #画分数
pygame.display.update() #将画的图形显示在窗面上
SnakespeedCLOCK.tick(Snakespend) #设置刷新速度
画各种东西的函数
def DrawScreen(Screen) : #显示分数
ScreenBuf = BASICFONT.render('Screen : %s' %(Screen),True,YELLOW)
ScreenRect = ScreenBuf.get_rect()
ScreenRect.topleft = (Window_Width - 120 , 0)
DISPLAYSURF.blit(ScreenBuf,ScreenRect)
def DrawSnakeBody(SnakeBody): #显示蛇
for body in SnakeBody :
x = body['x'] * Cell_Size #将每一节的具体左边求出来
y = body['y'] * Cell_Size
BodyRect = pygame.Rect(x,y,Cell_Size,Cell_Size) #将坐标转换为最小单位方格
pygame.draw.rect(DISPLAYSURF,DARKGreen,BodyRect) #在窗口画出来
BodyInnerRect = pygame.Rect(x + 4, y + 4, Cell_Size - 8, Cell_Size - 8) #将格子中间再选出来
pygame.draw.rect(DISPLAYSURF,Green,BodyInnerRect) #再画出来
def DrawApple(apple): #画食物,方法和画蛇一样
x = apple['x'] * Cell_Size
y = apple['y'] * Cell_Size
appleRect = pygame.Rect(x,y,Cell_Size,Cell_Size)
pygame.draw.rect(DISPLAYSURF,Red,appleRect)
def DrawLine(): #画线
for x in range(0, Window_Width, Cell_Size):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, Window_High))
for y in range(0, Window_High, Cell_Size):
pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (Window_Width, y))
最后运行
if __name__ == '__main__' :
try :
main()
except SystemExit :
pass
4 总结
感觉写出了一个小游戏还挺有意思的,虽然里面有很多是看了很久才搞懂的,而且感觉这个贪吃蛇还可以继续的优化。但是还是很满足了。