Python——制作小型游戏贪吃蛇

记得之前大二上过一门交叉学科,使用了python制作贪吃蛇小游戏(但是当时真的就是浪555大家大学的时候真的要好好学习呀),然后自己在b站学习网站跟着做了这个小游戏,整体还是很容易懂的,用pycharm的pygame制作,可以直接在终端使用

ping install pygame

等它下载完毕就好啦,这个游戏只有纯玩,没有计分的哦。下面是整体代码:

class Ponit:
    row=0
    col=0
    def __init__(self,row,col):
        self.row=row
        self.col=col
    def copy(self):
        return Ponit(row=self.row,col=self.col) #身子覆盖自己

#初始框架
import pygame
import random

#初始化
pygame.init()
W=800
H=600

#格子设计 可变 怎么画出来?
ROW=30
COL=40


size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption(('贪吃蛇')) #将窗口的名字改成游戏名

#背景颜色
bg_color=(255,255,255)
#蛇身颜色
snake_color=(128,128,128)


#定义坐标,将头和食物画出来
#核心 left=col*width top=row*height 就是左边的格子数等于所在所在列*格子长度,上边的格子数等于行数*长度
head=Ponit(row=int(ROW/2),col=int(COL/2))
head_color=(0,128,128)

#将蛇身建立成一个列表
snakes=[
    Ponit(row=head.row,col=head.col+1),
    Ponit(row=head.row,col=head.col+2),
    Ponit(row=head.row,col=head.col+3)
]

#生成食物
def gen_food():
    while 1:
        pos=Ponit(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_height
    top=point.row*cell_height

    pygame.draw.rect(
        window,color,
        (left,top,cell_width,cell_height)
    )
    pass


#游戏循环
quit=True
clock=pygame.time.Clock()
#处理事件
while quit:
    for event in pygame.event.get():  #这个事件可以感受到该控制屏内的鼠标动点等
        if event.type==pygame.QUIT:
            quit=False
        elif event.type==pygame.KEYDOWN: #移动蛇,控制上下左右,活动
            #print(event)
            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()

    #处理身子
    #1.把原来的头插入到snakes的头上
    snakes.insert(1,head.copy())
    #2.把snakes的最后一个删掉,只有吃到了才将身子最后搞掉
    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
    #1.撞墙
    if head.col<0 or head.row<0 or head.col>=COL or  head.row>=ROW:
        dead=True
    #2.撞自己
    for snake in snakes:
        if head.col==snake.col and head.row==snake.row:
            dead=True
            break
    if dead:
        print('游戏结束')
        quit=False

    #渲染 draw 颜色-RGB 将画面变成白色
    pygame.draw.rect(window,bg_color,(0,0,W,H))

    #蛇头和食物显示出来
    for snake in snakes:
        rect(snake,snake_color)
    rect(head,head_color)
    rect(food,food_color)

    #
    pygame.display.flip()

    #设置帧频 蛇跑出来的速度,这里是控制蛇的速度,越大就跑得越快
    clock.tick(10)

Python书写尤其要注意缩进问题!难点就是小蛇移动的时候坐标的变化。

思路就是:先把整体框架绘制出来,绘制场景,蛇头,如何移动蛇头,绘制蛇体,计分检测(这块没有做出来),等复试结束有空就来试试看。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值