下面,我们就开始本次的编程之旅:
1.初始化框架
首先安装pygame,在kali下直接在终端敲入pip install pygame,Windows系统可以直接下载安装,在这里对pygame的安装我们就不赘述了,首先初始化窗口框架:
# -*- coding: utf-8 -*-
import pygame
#初始化
pygame.init()
Wide = 800
Height = 600
size = (Wide,Height)
window = pygame.display.set_mode(size)
pygame.display.set_caption('无敌贪吃蛇')
bg_color = (249,204,226)
quit = False
clock = pygame.time.Clock()
while quit != True:
#处理事件
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
quit = True
pygame.draw.rect(window, bg_color, (0, 0, Wide, Height))
pygame.display.flip() #让出控制权,让系统执行一系列操作
#设置帧频
clock.tick(20)
现在我们的程序的骨架已经搭建好了,运行程序会出现如下截图:
框架窗口
下面绘制一条蛇和食物,我们定义一个Point类,用于表示坐标:
class Point:
row = 0
col = 0
def __init__(self,row,col):
self.row = row
self.col = col
def copy(self):
return Point(row=self.row,col=self.col)
下面声明蛇头和蛇身,为了方便我们将生成的窗口划分成一个一个格子,方便确定位置和移动:
#初始化
pygame.init()
Wide = 800
Height = 600
ROW = 80
COL = 60
然后对蛇头和蛇身进行声明:
#确定蛇头和蛇身的颜色和位置
head = Point(row=int(ROW/2),col=int(COL/2))
head_color = (255,0,0)
snakes=[
Point(row=head.row,col=head.col+1),
Point(row=head.row,col=head.col+2),
Point(row=head.row,col=head.col+3)
]
snake_color = (154,255,154)
然后将蛇头和蛇身绘制出来,我们单独把绘制的行为用函数来表示:
#绘制函数
def rect(point,color):
cell_width = Wide/COL
cell_height = Height/ROW
left = point.col*cell_width
top = point.row*cell_height
pygame.draw.rect(window,color,(left,top,cell_width,cell_height))
for snake in snakes:
rect(snake,snake_color)
rect(head,head_color)
运行程序,我们的小蛇蛇就出来了
绘制贪吃蛇
下面,我们在地图中随机(random包)生成食物:
#生成食物
def gen_food():
while 1:
pos=Point(row=random.randint(0,ROW-1),col=random.randint(0,COL-1))
is_coll = False
#是否同蛇头碰上了
if head.row==pos.row and head.col==pos.col:
is_coll = True
for snake in snakes:
if snake.row==pos.row and snake.col==pos.col:
is_coll = True
break
if not is_coll:
break
return pos
food = gen_food()
food_color = (255,255,0)
静态
下面我们让小蛇动起来,其实比较简单就是检测键盘按键事件,然后将上下左右对应的坐标加加减减的问题:
if event.type == pygame.QUIT:
quit = False
elif event.type == pygame.KEYDOWN: #判断键盘的按键来控制蛇头的移动
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'up'
elif event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'down'
elif event.key == 276 or event.key == 97:
if direct == 'up' or direct == 'down':
direct = 'left'
elif event.key == 275 or event.key == 100:
if direct == 'up' or direct == 'down':
direct = 'right'
#移动
if direct=='left':
head.col -= 1
elif direct=='right':
head.col += 1
elif direct=='up':
head.row -= 1
elif direct=='down':
head.row += 1
然后再添加一些游戏规则,比如撞到了墙或者自己的身体游戏就会结束:
#检测撞墙
dead = False
if head.col<0 or head.row<0 or head.col>=COL or head.row>=ROW :
dead = True
for snake in snakes :
if head.col== snake.col and head.row == snake.row:
dead = True
break
if dead:
print('游戏结束!')
quit = False
这样一个简单的贪吃蛇小游戏就完成了,但是有一些附加的功能没有进行添加,比如计分的功能等等,但是用于新手了解pygame的基础编程足够了,奉上源码,如果对您有所帮助,请点个赞,谢谢!
# -*- coding: utf-8 -*-
import pygame
import random
class Point:
row = 0
col = 0
def __init__(self,row,col):
self.row = row
self.col = col
def copy(self):
return Point(row=self.row,col=self.col)
#初始化
pygame.init()
W = 800
H = 600
ROW = 60
COL = 80
size = (W,H)
window = pygame.display.set_mode(size)
pygame.display.set_caption('无敌贪吃蛇')
bg_color = (249,204,226)
snake_color = (154,255,154)
#定义坐标
head = Point(row=int(ROW/2),col=int(COL/2))
head_color = (255,0,0)
snakes=[
Point(row=head.row,col=head.col+1),
Point(row=head.row,col=head.col+2),
Point(row=head.row,col=head.col+3)
]
#生成食物
def gen_food():
while 1:
pos=Point(row=random.randint(0,ROW-1),col=random.randint(0,COL-1))
is_coll = False
#是否同蛇头碰上了
if head.row==pos.row and head.col==pos.col:
is_coll = True
for snake in snakes:
if snake.row==pos.row and snake.col==pos.col:
is_coll = True
break
if not is_coll:
break
return pos
food = gen_food()
food_color = (255,255,0)
direct = 'left'
def rect(point,color):
cell_width = W/COL
cell_height = H/ROW
left = point.col*cell_width
top = point.row*cell_height
pygame.draw.rect(window,color,(left,top,cell_width,cell_height))
pass
#游戏循环
quit = False
clock = pygame.time.Clock()
while quit!=True:
#处理事件
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
quit = True
elif event.type == pygame.KEYDOWN: #判断键盘的按键来控制蛇头的移动
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'up'
elif event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'down'
elif event.key == 276 or event.key == 97:
if direct == 'up' or direct == 'down':
direct = 'left'
elif event.key == 275 or event.key == 100:
if direct == 'up' or direct == 'down':
direct = 'right'
#吃东西
eat = (head.row == food.row and head.col == food.col)
#产生新的食物
if eat:
food = gen_food()
#处理蛇的身子
snakes.insert(0,head.copy())
if not eat:
snakes.pop()
#移动
if direct=='left':
head.col -= 1
elif direct=='right':
head.col += 1
elif direct=='up':
head.row -= 1
elif direct=='down':
head.row += 1
#检测撞墙
dead = False
if head.col<0 or head.row<0 or head.col>=COL or head.row>=ROW :
dead = True
for snake in snakes :
if head.col== snake.col and head.row == snake.row:
dead = True
break
if dead:
print('游戏结束!')
quit = False
#渲染-画出来
pygame.draw.rect(window,bg_color,(0,0,W,H)) #rect画方块
#绘制蛇的头、身子以及食物
for snake in snakes:
rect(snake,snake_color)
rect(head,head_color)
rect(food,food_color)
pygame.display.flip() #让出控制权,让系统执行一系列操作
#设置帧频
clock.tick(20)
网友评论