首页 > 编程语言 >手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)

手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)

时间:2024-07-03 18:30:26浏览次数:17  
标签:10 score python window 小游戏 pygame position 100 snake

创作灵感

小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视野。也许是小时候对这些经典游戏的热爱,今天在此用python语言编写一个贪吃蛇小游戏。同时创建一个简单的Python小游戏是一个很好的学习项目,对于python语法的学习以及常见的函数认识很有帮助,下面是一个经典的“贪吃蛇”游戏的示例,使用pygame库来实现。

详细步骤

安装Pygame

首先,你需要安装pygame库。如果你还没有安装,可以使用以下命令:

pip install pygame

导入模块

导入模块的代码

import pygame
import time
import random

初始化pygame

pygame.init()

定义屏幕大小

window_x = 720
window_y = 480

定义颜色

black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)

初始化游戏窗口

pygame.display.set_caption('贪吃蛇游戏')
game_window = pygame.display.set_mode((window_x, window_y))

控制帧率

fps = pygame.time.Clock()

定义贪吃蛇的默认位置

snake_position = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]

食物的位置

food_position = [random.randrange(1, (window_x//10)) * 10,
                 random.randrange(1, (window_y//10)) * 10]
food_spawn = True

设置默认方向

direction = 'RIGHT'
change_to = direction

初始得分

score = 0

显示分数函数

def show_score(choice, color, font, size):
    score_font = pygame.font.SysFont(font, size)
    score_surface = score_font.render('Score : ' + str(score), True, color)
    score_rect = score_surface.get_rect()
    if choice == 1:
        score_rect.midtop = (window_x / 10, 15)
    else:
        score_rect.midtop = (window_x / 2, window_y / 1.25)
    game_window.blit(score_surface, score_rect)

游戏结束函数

def game_over():
    my_font = pygame.font.SysFont('times new roman', 50)
    game_over_surface = my_font.render(
        'Your Score is : ' + str(score), True, red)
    game_over_rect = game_over_surface.get_rect()
    game_over_rect.midtop = (window_x / 2, window_y / 4)
    game_window.blit(game_over_surface, game_over_rect)
    pygame.display.flip()
    time.sleep(2)
    pygame.quit()
    quit()

主函数

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != 'DOWN':
                    change_to = 'UP'
            elif event.key == pygame.K_DOWN:
                if direction != 'UP':
                    change_to = 'DOWN'
            elif event.key == pygame.K_LEFT:
                if direction != 'RIGHT':
                    change_to = 'LEFT'
            elif event.key == pygame.K_RIGHT:
                if direction != 'LEFT':
                    change_to = 'RIGHT'

如果方向改变,更新方向

direction = change_to

根据方向更新贪吃蛇的头部位置

if direction == 'UP':
        snake_position[1] -= 10
    if direction == 'DOWN':
        snake_position[1] += 10
    if direction == 'LEFT':
        snake_position[0] -= 10
    if direction == 'RIGHT':
        snake_position[0] += 10

贪吃蛇的头部移动到新的位置

snake_body.insert(0, list(snake_position))
    if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
        score += 10
        food_spawn = False
    else:
        snake_body.pop()

生成新的食物

if not food_spawn:
        food_position = [random.randrange(1, (window_x//10)) * 10,
                         random.randrange(1, (window_y//10)) * 10]
    food_spawn = True

更新游戏窗口

game_window.fill(black)
    for pos in snake_body:
        pygame.draw.rect(game_window, green, pygame.Rect(
            pos[0], pos[1], 10, 10))
    pygame.draw.rect(game_window, white, pygame.Rect(
        food_position[0], food_position[1], 10, 10))

检查是否撞到边界或自己

if snake_position[0] < 0 or snake_position[0] > window_x-10 or snake_position[1] < 0 or snake_position[1] > window_y-10:
        game_over()
    for block in snake_body[1:]:
        if snake_position[0] == block[0] and snake_position[1] == block[1]:
            game_over()

显示分数

show_score(1, white, 'times new roman', 20)

刷新游戏屏幕

pygame.display.update()

控制帧率

 fps.tick(25)

代码解释

  1. 导入必要的库

    • pygame:用于游戏开发。
    • timerandom:用于时间控制和随机生成食物位置。
  2. 初始化游戏

    • 初始化pygame,定义屏幕大小和颜色,设置游戏窗口标题。
  3. 定义贪吃蛇和食物的初始位置

    • snake_positionsnake_body定义贪吃蛇的位置和身体。
    • food_position定义食物的位置,并设置食物是否需要重新生成。
  4. 设置方向和分数

    • 初始方向设置为右,初始得分为0。
  5. 显示分数函数

    • 使用pygame.font.SysFont显示分数。
  6. 游戏结束函数

    • 显示游戏结束时的分数,并退出游戏。
  7. 主循环

    • 处理事件(方向键控制贪吃蛇移动方向)。
    • 更新贪吃蛇位置,检查是否吃到食物,更新食物位置。
    • 检查是否撞到边界或自己,结束游戏。
    • 更新游戏窗口,显示分数,并控制帧率。

这个示例展示了如何使用pygame构建一个简单的贪吃蛇游戏。你可以在此基础上进行扩展,通过改变某些函数的参数来满足自己对于游戏的特征修改,或者扩展某些模块,例如添加更复杂的关卡、计时功能等。

附录(完整代码)

import pygame
import time
import random

# 初始化pygame
pygame.init()

# 定义屏幕大小
window_x = 720
window_y = 480

# 定义颜色
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)

# 初始化游戏窗口
pygame.display.set_caption('贪吃蛇游戏')
game_window = pygame.display.set_mode((window_x, window_y))

# 控制帧率
fps = pygame.time.Clock()

# 定义贪吃蛇的默认位置
snake_position = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]

# 食物的位置
food_position = [random.randrange(1, (window_x//10)) * 10,
                 random.randrange(1, (window_y//10)) * 10]
food_spawn = True

# 设置默认方向
direction = 'RIGHT'
change_to = direction

# 初始得分
score = 0

# 显示分数函数
def show_score(choice, color, font, size):
    score_font = pygame.font.SysFont(font, size)
    score_surface = score_font.render('Score : ' + str(score), True, color)
    score_rect = score_surface.get_rect()
    if choice == 1:
        score_rect.midtop = (window_x / 10, 15)
    else:
        score_rect.midtop = (window_x / 2, window_y / 1.25)
    game_window.blit(score_surface, score_rect)

# 游戏结束函数
def game_over():
    my_font = pygame.font.SysFont('times new roman', 50)
    game_over_surface = my_font.render(
        'Your Score is : ' + str(score), True, red)
    game_over_rect = game_over_surface.get_rect()
    game_over_rect.midtop = (window_x / 2, window_y / 4)
    game_window.blit(game_over_surface, game_over_rect)
    pygame.display.flip()
    time.sleep(2)
    pygame.quit()
    quit()

# 主函数
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != 'DOWN':
                    change_to = 'UP'
            elif event.key == pygame.K_DOWN:
                if direction != 'UP':
                    change_to = 'DOWN'
            elif event.key == pygame.K_LEFT:
                if direction != 'RIGHT':
                    change_to = 'LEFT'
            elif event.key == pygame.K_RIGHT:
                if direction != 'LEFT':
                    change_to = 'RIGHT'

    # 如果方向改变,更新方向
    direction = change_to

    # 根据方向更新贪吃蛇的头部位置
    if direction == 'UP':
        snake_position[1] -= 10
    if direction == 'DOWN':
        snake_position[1] += 10
    if direction == 'LEFT':
        snake_position[0] -= 10
    if direction == 'RIGHT':
        snake_position[0] += 10

    # 贪吃蛇的头部移动到新的位置
    snake_body.insert(0, list(snake_position))
    if snake_position[0] == food_position[0] and snake_position[1] == food_position[1]:
        score += 10
        food_spawn = False
    else:
        snake_body.pop()

    # 生成新的食物
    if not food_spawn:
        food_position = [random.randrange(1, (window_x//10)) * 10,
                         random.randrange(1, (window_y//10)) * 10]
    food_spawn = True

    # 更新游戏窗口
    game_window.fill(black)
    for pos in snake_body:
        pygame.draw.rect(game_window, green, pygame.Rect(
            pos[0], pos[1], 10, 10))
    pygame.draw.rect(game_window, white, pygame.Rect(
        food_position[0], food_position[1], 10, 10))

    # 检查是否撞到边界或自己
    if snake_position[0] < 0 or snake_position[0] > window_x-10 or snake_position[1] < 0 or snake_position[1] > window_y-10:
        game_over()
    for block in snake_body[1:]:
        if snake_position[0] == block[0] and snake_position[1] == block[1]:
            game_over()

    # 显示分数
    show_score(1, white, 'times new roman', 20)

    # 刷新游戏屏幕
    pygame.display.update()

    # 控制帧率
    fps.tick(25)

标签:10,score,python,window,小游戏,pygame,position,100,snake
From: https://blog.csdn.net/2401_83155259/article/details/140154373

相关文章

  • 基于python语言的网页设计(手把手教你设计一个个人博客网站)
     总体的设计思路设计网页的思路涉及多个方面,从前端的页面结构和样式,到后端的数据处理和逻辑实现。1.确定网站的需求和功能首先要明确网站的功能需求,比如用户注册登录、博客文章发布和展示、评论系统等。2.选择技术栈选择适合的框架和工具。对于Python,常用的Web框架包括Fl......
  • python的String整理
    字符串常用方法方法描述参数说明使用示例capitalize()返回字符串的副本,将字符串的第一个字符转换为大写,其余字符转换为小写。无s='helloworld';s_capitalized=s.capitalize()casefold()返回字符串的副本,转换所有字符为小写,并且将所有特定于语言的大小写折叠为通用大......
  • 掌握 IPython 中的 %%bash 魔法命令:深入探索与实践
    IPython是一个强大的交互式Python解释器,它提供了丰富的功能来增强开发体验。其中一个非常实用的功能是IPython的“魔法命令”(magiccommands),这些命令以%%开头,用于执行特定的操作或改变IPython的行为。%%bash就是其中之一,它允许用户在IPython环境中执行Bash命......
  • VPX6U板卡:基于龙芯LS2K1000处理器的全国产板卡
       龙芯2K1000的6UVPX板卡是专为高性能计算和嵌入式应用设计的,这种类型的板卡采用了龙芯2K1000双核处理器,其主频范围在800MHz至1GHz之间。它支持高速串行总线,如PCIExpress(PCIe)和10GigabitEthernet,以及高密度I/O连接。以下是基于龙芯2K1000的6UVPX板卡的具体信息:......
  • 【Python&网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件
    ​    网盘对于大家的生活工作可以说是息息相关,但是如果每天都重复去上传下载文件就会很浪费时间,所以有没有什么办法可以解放双手?那就是网盘接口,本文通过Bypy库实现百度网盘的自动上传和下载文件。原创作者:RS迷途小书童博客地址:https://blog.csdn.net/m0_56729804?t......
  • Python(netCDF4库)读取.nc文件(NetCDF气象数据文件)
    importnetCDF4asncimportnumpyasnpimportmatplotlib.pyplotaspltimportcartopy.crsasccrsdefplot_currents(file_path,variable_name,lon_name,lat_name):"""绘制洋流并保存为JPEG图片。参数:file_path(str):NetCDF文件路径。v......
  • 【每日一练】python列表
    1、输入一个整数列表,将列表中的元素按照逆序输出。list1=[5,4,5,6]list1.reverse()print(list1)[6,5,4,5]2、输入一个字符串列表,输出其中长度大于等于5的字符串,并且将它们转换为大写形式。list1=['hello','lol','ak47','aliang']foriinlist1:iflen(i)......
  • python编写使用xmlrpc上传wordpress网站文章的程序
    1、安装库        pipinstallpython-wordpress-xmlrpc,tkinter,xmlrpc,json2、发布文章url="http://域名/xmlrpc.php"username=用户名password=密码title=标题content=内容tags=标签categories=分类client=C......
  • python钉钉告警脚本
    !/usr/bin/envpython3coding:utf-8importrequests,json,sys,os,datetimewebhook="https://oapi.dingtalk.com/robot/send?access_token=88bddd19055305c4fba1f9698cabe891de279254ed6e331bc6a3005274478b71"user=sys.argv[1]text=sys.argv[3]data={"m......
  • 掌握 Python 中 isinstance 的正确用法
    ......