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

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

作者: 牛i蛋 | 来源:发表于2019-02-10 11:08 被阅读0次
    现在和大家一起来做一个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)
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/opvasqtx.html