python游戏代码200行_python做贪吃蛇

python游戏代码200行_python做贪吃蛇python语言,总所周知是比较简单的,而且代码也不会像java那样多,下面就使用python的第三方库pygame进行开发一个贪吃蛇游戏。1.pygame的安装直接在cmd当中使用pipinstallpygame进行安装。或者在pycharm当中自动导入安装也OK2.全局变量的定义在代码当中会使用到很多这种变量的值,直接在最开始进行定义,后面获取变量即可W=600#屏幕宽H=400#高fps=12#帧率size=(W,H)ROW=

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

python,总所周知是比较简单的,而且代码也不会像java那样多,下面就使用python的第三方库pygame进行开发一个贪吃蛇游戏。

当然了,如果你对Java实现贪吃蛇游戏也可以看 Java实现贪吃蛇游戏 这篇文章。 Java实现大概在450行左右,但是只是一个蛇的移动与吃食物的功能。下面使用python编写的还包括了得分获取是否打破记录以及游戏的难易程度的选择。

1. 前提工作准备
  1. 安装好Python,直接在官网下载安装即可。
  2. 安装pygame第三方库,直接在cmd当中使用 pip install pygame 进行安装。或者在pycharm当中自动导入安装也OK。
2. 全局变量的定义与包的导入

在代码当中会使用到很多这种变量的值,直接在最开始进行定义,后面获取变量即可。这样子会比较方便,并且使得代码也会比较规范。

W = 600   #屏幕宽
H = 400    #高
fps = 12  # 帧率,也可以理解为蛇运动的速度
size = (W, H)  
ROW = 20  # 行
COL = 30   # 列
snake_color = (200, 200, 200)  #蛇的颜色
MSGCOLOR = (3, 54, 73)  # 背景色 
MSGBGCOLOR = (255, 255, 193)  #字体色
blue = (64, 160, 171)  # 蓝色
count = 0   #计分
pos = [160, 130]  #坐标
pos1 = [190, 200]  #坐标1

import pygame, sys
import random
import time
3. 游戏开始界面初始化

使用while True循环对界面次序刷新,绘制字体以及添加背景图片进入当中 (图片可直接选择600X 400 的图片即可),并且对按压的键进行监听,123 分别表示选中不同的难度,即蛇移动的速度。
绘制字体的使用使用了字体文件,也可以使用本机的字体:参考这篇文章,文字的绘制

# 初始化
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("贪吃蛇")
out = True
while out:
    FPSClock = pygame.time.Clock()
    img = pygame.image.load("bg.png")
    screen.blit(img, (0, 0))
    # 添加文字 使用到了字体文件 ,可使用默认
    font = pygame.font.Font("STKAITI.TTF", 24)
    fontRect = font.render("请选择游戏难度 (单击键盘)", True, MSGCOLOR, MSGBGCOLOR)
    fontRect1 = font.render("1:简单 2:中等 3:复杂 ", True, MSGCOLOR, MSGBGCOLOR)
    screen.blit(fontRect, pos)
    screen.blit(fontRect1, pos1)
    for event in pygame.event.get():  #接收单击事件,
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:   #键盘单击事件
            print(event.key)
            if event.key == 257:
                fps = 8
                out = False
            elif event.key == 258:
                fps = 16
                out = False
            elif event.key == 259:
                fps = 24
                out = False
    pygame.display.update()
    FPSClock.tick(fps)

效果图如下:绘制了文字,并且加入监听事件进入。
在这里插入图片描述

4. 游戏界面的设置

4.1 游戏界面,使用一个Point类进行划分
Point类可以对整个屏幕进行划分为多少个小格子,使用到python当中的类进行定义

class Point:
    row = 0
    col = 0

    def __init__(self, row=0, col=0):
        self.row = row
        self.col = col

    def copy(self):
        return Point(row=self.row, col=self.col)

4.2 预处理
给定初始化蛇头坐标,蛇头的颜色, 蛇的身体,在这里都是Point类的对象。
获取顶点坐标,返回的也是Point对象
随机食物的产生,不能出现在蛇头或者蛇的身体的位置。
食物产生调用这个方法即可
蛇的移动方向给定一个向左

# 坐标定义 蛇头
head = Point(row=int(ROW / 2), col=int(COL / 2))
head_color = (80, 80, 128)

# 蛇的身体,使用一个列表进行储存对应的值构成一个数组,新的蛇初始化给3个长度的身体
snakenodes = [
    Point(head.row, head.col),
    Point(head.row, head.col + 1),
    Point(head.row, head.col + 2)
]


# 求出这个顶点的坐标
def rect(Point, color):
    left = Point.col * (W / COL)
    top = Point.row * (H / ROW)
    pygame.draw.rect(screen, color, (left, top, W / COL, H / ROW))


# 随机产生食物
def gen_food():
    while True:
        pos = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1))
        # 判断产生的食物是否与蛇相撞
        is_coll = False
        # 1.与蛇头相撞
        if head.row == pos.row and head.col == pos.col:
            is_coll = True
        # 2.食物与蛇的身体相撞
        for node in snakenodes:
            if node.row == pos.row and node.col == pos.col:
                is_coll = True
                break
        if not is_coll:
            break
    return pos


# 食物坐标
food = gen_food()
food_color = (255, 255, 0)

# 移动方向
dir = 'left'

4.3 窗口实现
在窗口当中对实体进行绘制,并且加入逻辑,比如说,相撞之后就表示游戏结束,
蛇头经过食物,计分的相加,以及再一次的产生新的食物

# 初始化
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("贪吃蛇")
out = True
while out:
    FPSClock = pygame.time.Clock()
    img = pygame.image.load("bg.png")
    screen.blit(img, (0, 0))
    # 添加文字
    font = pygame.font.Font("STKAITI.TTF", 24)
    fontRect = font.render("请选择游戏难度 (单击键盘)", True, MSGCOLOR, MSGBGCOLOR)
    fontRect1 = font.render("1:简单 2:中等 3:复杂 ", True, MSGCOLOR, MSGBGCOLOR)
    screen.blit(fontRect, pos)
    screen.blit(fontRect1, pos1)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            print(event.key)
            if event.key == 257:
                fps = 8
                out = False
            elif event.key == 258:
                fps = 16
                out = False
            elif event.key == 259:
                fps = 24
                out = False
    pygame.display.update()
    FPSClock.tick(fps)

time.sleep(1)

quit = True
while quit:
    screen = pygame.display.set_mode((600, 460))
    FPSClock = pygame.time.Clock()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            # print(event.key)
            if event.key == 273 or event.key == pygame.K_UP:
                if dir == 'left' or dir == 'right':
                    dir = 'up'
            elif event.key == 274 or event.key == pygame.K_DOWN:
                if dir == 'left' or dir == 'right':
                    dir = 'down'
            if event.key == 276 or event.key == pygame.K_LEFT:
                if dir == 'up' or dir == 'down':
                    dir = 'left'
            if event.key == 275 or event.key == pygame.K_RIGHT:
                if dir == 'up' or dir == 'down':
                    dir = 'right'

    # 1. 画一个方块,也就是整个背景方块
    # pygame.draw.rect(screen, bg_color, (0, 0, W, H))
    # 2. 使用图片填入的方式
    img = pygame.image.load("bg.png")
    screen.blit(img, (0, 0))

    # 用一个白框进行分割开
    pygame.draw.rect(screen, (255, 255, 255), (0, H, W, 10))

    # 下方显示分数的方块
    pygame.draw.rect(screen, blue, (0, H + 10, W, 60))

    # 显示当前得分
    font = pygame.font.Font("STKAITI.TTF", 24)
    fontRect = font.render(" 当前得分 : " + str(count), True, MSGCOLOR, blue)
    screen.blit(fontRect, (420, 420))

    # 画出蛇头
    rect(head, head_color)

    # 画出食物
    rect(food, food_color)

    # 画出蛇身
    for node in snakenodes:
        rect(node, snake_color)

    # 吃食物,当蛇头与食物重合的时候吃掉食物,此时蛇的长度加一,在原先的删除蛇尾的时候加上一个判断即可
    eat = (head.row == food.row and head.col == food.col)

    # 食物重新产生,食物重新产生的时候,对计分进行增加
    if eat:
        food = gen_food()
        if fps == 8:
            count += 3
        elif fps == 16:
            count += 5
        elif fps == 24:
            count += 10

    # 处理蛇身
    # 1.把蛇头插入到数组列表当中
    snakenodes.insert(0, head.copy())

    # 2.删除最后一个蛇尾节点,表示没有吃到食物就删除尾节点
    if not eat:
        snakenodes.pop()

    # 移动头
    if dir == 'left':
        head.col -= 1
    elif dir == 'right':
        head.col += 1
    elif dir == 'up':
        head.row -= 1
    elif dir == 'down':
        head.row += 1

    # 与墙壁相撞
    dead = False
    if head.row < 0 or head.col < 0 or head.row >= ROW or head.col >= COL:
        dead = True
        print("撞墙")
    for snake in snakenodes:
        if head.col == snake.col and head.row == snake.row:
            dead = True
            print("撞到自己")
            break

    if dead:
        print("游戏结束")
        quit = False

    pygame.display.update()
    FPSClock.tick(fps)

运行效果:得分会在吃掉食物之后进行刷新的,并且在前面选择的不同的难度加的分也是不同的。123难度对应的是一个食物分别是 3、5、10 分。
在这里插入图片描述

5. 得分的记录

在前面选择不同的难度之后,每一次吃掉食物之后。分数加的也不同,在这里对最终得分记录下来,并且获取count文件进行比较,判断是否打破记录。打破记录,把新的记录写进文件当中。

# 记录最高分到count文件当中
f = open("count", "r")
counts = f.read()

if count > int(counts):
    file = open("count", "w")
    file.write(str(count))
    file.close()
f.close()
6. 游戏结束(是否打破记录)

得分已经获取到了,根据是否打破了记录来绘制不同的效果。同样的使用这个pygame进行初始化构造出一个新的窗口。

# 得分展示
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("贪吃蛇")
while True:
    FPSClock = pygame.time.Clock()
    pygame.draw.rect(screen, MSGBGCOLOR, (0, 0, W, H))
    # 添加文字
    font = pygame.font.Font("STKAITI.TTF", 24)
    if count <= int(counts):
        fontRect = font.render(" 你的得分是: " + str(count) + " 继续加油哦!", True, MSGCOLOR, MSGBGCOLOR)
    elif count > int(counts):
        fontRect = font.render(" 恭喜你打破了记录!你的得分是 : " + str(count), True, MSGCOLOR, MSGBGCOLOR)
    screen.blit(fontRect, (140, 140))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    pygame.display.update()
    FPSClock.tick(fps)

比如说这里,在得分没有超过count文件当中的得分记录的时候就会打印出继续加油,反之打印的是恭喜你打破记录。count得分进行输出的时候,count是一个int型的变量,要转换成string才能进行绘制,所以在上面使用到了 str() 函数,数据类型转换。
在这里插入图片描述

7. 项目运行

小萌新看过来,在获取到整个项目之后,运行Snake.py文件,之后会让你选择游戏难度,分别对应键盘上的123,可自己选择,难度选择之后,就会出现贪吃蛇的游戏界面了。虽然标题写的是250行开发一个贪吃蛇游戏,但是真的把多余的换行以及注释去掉之后,估计也就200行左右。而且很多代码也是大致相同的。

8. 项目获取

本来还说着用Github拉取项目,但是还是怕有些朋友不会用Git,所以说还是使用百度网盘进行项目获取把。所有代码都在上面有所展示,如果遇到一些bug,可在下方百度网盘进行获取源码
源码获取:链接:https://pan.baidu.com/s/1_66rlKQelO4CuSaH0__2ig
提取码:2nom

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197130.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • tcp和udp的区别_tcp和udp的区别和联系

    tcp和udp的区别_tcp和udp的区别和联系前言UDPTCPTCP的三次握手TCP四次挥手累计确认顺序问题和丢包问题流量控制的问题拥塞控制的问题总结及面试问题前言前端的面试中经常问的TCP和UDP的区别,网上也有好多内容,比如TCP和UDP的区别TCP是面向连接的,UDP是面向无连接的UDP程序结构较简单TCP是面向字节流的,UDP是基于…

  • jq js100vh做减法算法[通俗易懂]

    jq js100vh做减法算法[通俗易懂]functionviewportToPixels(value){varparts=value.match(/([0-9.]+)(vh|vw)/)varq=Number(parts[1])varside=window[[‘innerHeight’,‘innerWidth’][[‘vh’,‘vw’].indexOf(parts[2])]]returnside*(q/100)}//调用viewportToPixels()$(’#opps’).css(‘height’,

  • 瀑布式研发流程

    瀑布式研发流程

  • 如何从从官网下载各个版本的jquery「建议收藏」

    如何从从官网下载各个版本的jquery「建议收藏」许多前端的小伙伴们可能跟我一样有选择强迫症,对于一些工具、软件等都偏爱从官网下载,尽管许多非官方网站上已经有现成的,但还是从心理上感觉官网的更正规。如今的jquery版本已经是相当多了。在jquery官网的首页上只提供了为数不多的较为流行的版本供我们下载。但是出于各种情况的考虑,我们想要自己需要的某一版本该如何从官网获取呢?步骤也是相当简单,jquery官网虽然为了页面的简洁性并未在Downl…

  • bs与cs的区别_试比较CS与BS的工作模式

    bs与cs的区别_试比较CS与BS的工作模式提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、CS二、BS总结前言本文章记录BS和CS的区别和优缺点一、CSCS:客户端服务器架构模式优点:充分利用客户端机器的资源,减轻服务器的负荷(一部分安全要求不高的计算任务存储任务放在客户端执行,不需要把所有的计算和存储都在服务器端执行,从而能够减轻服务器的压力,也能够减轻网络负荷)缺点:需要安装;升级维护成本较高例如:就像平时玩游戏,假如它不是CS模式是BS模式,通过网页的方式展示的。如果你的网络有些卡,你正.

    2022年10月17日
  • Java面试题(3)

    Java面试题(3)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号