(详细步骤)Python练手小项目-无敌贪吃蛇(新手必看!!!)

2019-02-10  本文已影响0人  牛i蛋
现在和大家一起来做一个Python练手的小项目,贪吃蛇,首先来看一看效果图: 无敌贪吃蛇游戏运行效果图

下面,我们就开始本次的编程之旅:
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)
上一篇下一篇

猜你喜欢

热点阅读