如何使用Python编写小游戏?

news2025/4/7 9:46:12

在这里插入图片描述

大家好,我是沐尘而生,如果你是一个热爱编程的小伙伴,又想尝试游戏开发,那么这篇文章一定能满足你的好奇心。不废话,让我们马上进入Python游戏开发的精彩世界吧!

Python游戏开发的魅力
编写小游戏不仅仅是锻炼编程技能的好方法,更是展现创意和享受成果的绝佳途径。Python作为一门易学易用的编程语言,为游戏开发提供了丰富的可能性。

游戏举例一:经典猜数字游戏

让我们先来玩一个经典的猜数字游戏。玩家需要猜测一个随机生成的数字,通过与计算机的互动,体验成就感和乐趣。

import random

target_number = random.randint(1, 100)
attempts = 0
guess = 0

print("欢迎来到“沐尘而生的猜数字游戏”!")
while guess != target_number:
    guess = int(input("请输入你猜的数字:"))
    attempts += 1
    if guess < target_number:
        print("猜小了,再试试!")
    elif guess > target_number:
        print("猜大了,再试试!")
    else:
        print(f"恭喜你,猜对了!你用了{attempts}次。")

在这里插入图片描述

游戏举例二:经典贪吃蛇游戏

接下来,我们来编写一个经典的贪吃蛇游戏。玩家将控制一条小蛇在屏幕上移动,吃掉食物,逐渐变长。游戏不仅考验反应速度,还充满了策略性。

import pygame
import random

# 初始化
pygame.init()

# 设置游戏窗口
WINDOW_SIZE = (640, 480)
window = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("Snake Game by Muchen")

# 颜色定义
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)

# 蛇和食物定义
snake_pos = [100, 50]
snake_body = [[100, 50], [90, 50], [80, 50]]
food_pos = [random.randrange(1, 64) * 10, random.randrange(1, 48) * 10]

# 游戏逻辑函数
def update_snake():
    global food_pos, snake_pos, snake_body
    
    # 移动蛇头
    snake_pos[0] += direction[0]
    snake_pos[1] += direction[1]
    
    # 判断是否吃到食物
    if snake_pos == food_pos:
        food_pos = [random.randrange(1, 64) * 10, random.randrange(1, 48) * 10]
    else:
        snake_body.pop()

    # 将新的蛇头添加到蛇身上
    snake_body.insert(0, list(snake_pos))

def update_food():
    global food_pos

    # 绘制食物
    pygame.draw.rect(window, WHITE, pygame.Rect(food_pos[0], food_pos[1], 10, 10))

    # 判断食物是否被吃掉
    if snake_pos == food_pos:
        food_pos = [random.randrange(1, 64) * 10, random.randrange(1, 48) * 10]
        snake_body.append([0, 0])

def draw_snake():
    # 绘制贪吃蛇
    for pos in snake_body:
        pygame.draw.rect(window, GREEN, pygame.Rect(pos[0], pos[1], 10, 10))

# 初始化方向
direction = [0, -10]

# 游戏主循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    
    # 获取键盘输入
    keys = pygame.key.get_pressed()

    # 判断方向
    if keys[pygame.K_LEFT] and direction != [10, 0]:
        direction = [-10, 0]
    elif keys[pygame.K_RIGHT] and direction != [-10, 0]:
        direction = [10, 0]
    elif keys[pygame.K_UP] and direction != [0, 10]:
        direction = [0, -10]
    elif keys[pygame.K_DOWN] and direction != [0, -10]:
        direction = [0, 10]

    # 更新蛇和食物
    update_snake()
    update_food()

    # 清空屏幕,绘制蛇和食物
    window.fill(BLACK)
    draw_snake()

    # 更新窗口
    pygame.display.update()

在这里插入图片描述

游戏举例三:飞机大战游戏

我们来编写一个飞机大战游戏。玩家将操控一架飞机,躲避敌人的子弹,同时射击敌人,体验刺激和挑战。

import pygame

# 初始化
pygame.init()

# 设置游戏窗口
window_size = (640, 480)
window = pygame.display.set_mode(window_size)
pygame.display.set_caption("沐尘而生的飞机大战游戏")

# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

# 飞机和子弹定义
plane_width, plane_height = 40, 40
plane = pygame.Rect(window_size[0]/2-plane_width/2, window_size[1]-plane_height-20, plane_width, plane_height)
bullet_width, bullet_height = 5, 15
bullet = pygame.Rect(0, 0, bullet_width, bullet_height)
bullet_state = "ready"

# 游戏主循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # 飞机的移动逻辑
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        plane.x -= 5
    if keys[pygame.K_RIGHT]:
        plane.x += 5
    if keys[pygame.K_SPACE] and bullet_state == "ready":
        bullet_state = "fire"
        bullet.centerx = plane.centerx
        bullet.y = plane.y

    # 子弹的移动逻辑
    if bullet_state == "fire":
        bullet.y -= 10
    if bullet.y <= 0:
        bullet_state = "ready"

    # 绘制飞机和子弹
    window.fill(black)
    pygame.draw.rect(window, white, plane)
    pygame.draw.rect(window, red, bullet)
    
    # 更新窗口
    pygame.display.update() 

在这里插入图片描述

举例四:打砖块游戏

最后,我们来使用Python和Pygame库编写一个打砖块游戏:

import pygame
import random

# 初始化
pygame.init()

# 设置游戏窗口
window_size = (640, 480)
window = pygame.display.set_mode(window_size)
pygame.display.set_caption("沐尘而生的打砖块游戏")

# 颜色定义
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)

# 砖块的定义
brick_width = 60
brick_height = 20
brick_margin = 5
bricks = []

for row in range(5):
    for column in range(10):
        rect = pygame.Rect(column * (brick_width + brick_margin), row * (brick_height + brick_margin), brick_width, brick_height)
        bricks.append(rect)

# 球的定义
ball_size = 20
ball = pygame.Rect(window_size[0] // 2 - ball_size // 2, window_size[1] // 2 - ball_size // 2, ball_size, ball_size)
ball_speed = [5, 5]

# 板子的定义
paddle_width = 100
paddle_height = 10
paddle = pygame.Rect(window_size[0] // 2 - paddle_width // 2, window_size[1] - paddle_height * 2, paddle_width, paddle_height)

# 游戏主循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # 球的移动逻辑
    ball.x += ball_speed[0]
    ball.y += ball_speed[1]

    # 球与窗口边界的碰撞检测
    if ball.left <= 0 or ball.right >= window_size[0]:
        ball_speed[0] = -ball_speed[0]
    if ball.top <= 0:
        ball_speed[1] = -ball_speed[1]

    # 球与板子的碰撞检测
    if ball.colliderect(paddle):
        ball_speed[1] = -ball_speed[1]

    # 球与砖块的碰撞检测
    for brick in bricks:
        if ball.colliderect(brick):
            bricks.remove(brick)
            ball_speed[1] = -ball_speed[1]
            break

    # 板子移动逻辑
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        paddle.x -= 5
    if keys[pygame.K_RIGHT]:
        paddle.x += 5

    # 确保板子不会移出窗口
    if paddle.left < 0:
        paddle.left = 0
    if paddle.right > window_size[0]:
        paddle.right = window_size[0]

    # 更新窗口
    window.fill(BLACK)
    pygame.draw.rect(window, WHITE, paddle)
    pygame.draw.ellipse(window, BLUE, ball)
    for brick in bricks:
        pygame.draw.rect(window, GREEN, brick)
    pygame.display.update()

在这里插入图片描述

通过以上几个精彩的小游戏示例,我们深入了解了如何使用Python进行游戏开发。从猜数字、贪吃蛇,到飞机大战、打砖块游戏,每个游戏都散发着独特的魅力。无论你是Python新手还是有一定经验的开发者,都可以从编写小游戏中获得乐趣和成就感。希望这篇文章能够激发你的创意,开启你的游戏编程之旅。如果你对这些小游戏有任何问题或想法,欢迎在评论区与我交流。感谢大家的阅读!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统管理:虚拟机ESXi安装

目录 一、理论 1.VMware Workstation 2.VMware vSphere Client 3.ESXi 二、实验 1.ESXi 7安装 一、理论 1.VMware Workstation 它是一款专业的虚拟机软件&#xff0c;可以在一台物理机上运行多个操作系统&#xff0c;支持Windows、Linux等操作系统&#xff0c;可以模拟…

opencv-进阶05 手写数字识别原理及示例

前面我们仅仅取了两个特征维度进行说明。在实际应用中&#xff0c;可能存在着更多特征维度需要计算。 下面以手写数字识别为例进行简单的介绍。 假设我们要让程序识别图 20-2 中上方的数字&#xff08;当然&#xff0c;你一眼就知道是“8”&#xff0c;但是现在要让计算机识别…

lvs负载均衡集群(NAT模式)

lvs负载均衡集群&#xff1a; 1.什么是集群&#xff08;含义&#xff09;&#xff1a;就是将多台主机作为一个整体&#xff0c;对外提供相同的服务 2.集群使用在哪一个场景&#xff1a;高并发 并发量过大时候加服务器的方式就是向外扩展(横向扩展)&#xff0c;就是集群。 3…

HoudiniVex笔记_P24_ForceBasics力基础

原视频&#xff1a;https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili&#xff1a;Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本&#xff1a;19.5 1、什么是Force 本章主要讲重力、弹力、速度与质量、…

强训第33天

选择 C A ping是TCP/IP协议族的一部分&#xff0c;使用ICMP协议&#xff0c;ICMP底层使用IP协议。如果要ping其他网段&#xff0c;则需要设置网关。 如果是二层交换机故障&#xff0c;则ping同网段的也会不通。 C Dos攻击被称之为“拒绝服务攻击”&#xff0c;其目的是使计算机…

网页设计详解(一)-HTML简介

本文作为博主学习笔记&#xff1a;2023-05-04星期四 一、网页介绍 网页是构成网站的基本元素&#xff0c;它是一个包含HTML标签的纯文本文件&#xff0c;是超文本标记语言格式(文件扩展名为.html或.htm)。网页通常用图像档来提供图画&#xff0c;通过浏览器来阅读。 超文本介…

C#__Action和Func委托的基本用法

// 类 class DelegateC{// Action&#xff0c;内置的委托类型&#xff0c;引用了一个void返回值类型的方法&#xff0c;T表示方法参数public static void AText1(){Console.WriteLine("Atext1");}public static void AText2(int x){Console.WriteLine("Atext2&…

【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )

目录 一、问题背景二、修改方法2.1 修改种子2.2 使用linux中的 /dev/urandom 生成随机数 三、/dev/random 和 /dev/urandom 的原理3.1 参考连接3.2 重难点总结3.2.1 生成随机数的原理3.2.2 随机数生成器的结构3.2.3 二者的区别和选择 四、在代码的使用方法 一、问题背景 在一个…

2023一建各科考点归纳

一级建造师《建设工程项目管理》高频考点 1Z201000建设工程项目的组织与管理 1Z201010建设工程管理的内涵和任务 系统的目标决定了系统的组织&#xff0c;而组织是目标能否实现的决定性因素。 建设工程管理涉及工程项目全过程&#xff0c;包括: 决策阶段-开发管理: 实施阶…

《零基础7天入门Arduino物联网-01》学前必看

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 学前须知 注意事项 本系列课程主要针对零基础的物联网爱好者群体开发&#xff0c;非系统性讲解…

Java 中操作 Redis

文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…

6.4 恶意代码

数据参考&#xff1a;CISP官方 目录 恶意代码概念及发展历程恶意代码的传播方式恶意代码防护 一、恶意代码概念及发展历程 1、什么是恶意代码 什么是恶意代码 《中华人民共和国计算机信息系统安全保护条例》第二十八条&#xff1a;“计算机病毒&#xff0c;是指编制或者…

VMware虚拟机下载与安装

VMware虚拟机下载与安装 目录 VMware虚拟机下载与安装[TOC](目录) 概述 1. 下载虚拟机1.1 访问官网1.2 点击产品菜单&#xff0c;然后选择产品 VMware Workstation Pro1.3 选择试用版下载 2.安装虚拟机2.1 右键点击安装包&#xff0c;选择以管理员身份运行2.2 按照说明进行安装…

玩转VS code 之 C/C++ 环境配置篇

PS&#xff1a;俺是菜鸟&#xff0c;整理和踩坑试错花了不少时间&#xff0c;如果这篇文章对您有用的话&#xff0c;请麻烦您留下免费的赞赞&#xff0c;赠人玫瑰&#xff0c;手留余香&#xff0c;码字踩坑不易&#xff0c;望三连支持 上一篇&#xff1a;玩转 VS code 之下载篇…

数字人如何赋能汽车品牌营销线下实时交互?

为了进一步巩固和拓展消费群体&#xff0c;扩大品牌影响力&#xff0c;别克汽车在线下开展了新品体验日活动&#xff0c;在品鉴会现场数字人影萱作为神秘嘉宾惊喜亮相&#xff0c;与现场嘉宾和众多媒体同屏实时互动&#xff0c;这虚拟与现实的碰撞互动形式&#xff0c;让现场嘉…

复合 类型

字符串和切片 切片 切片的作用是允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 例如&#xff1a; let s String::from("hello world");let hello &s[0..5]; // 切片 [0,5) 等效于&s[..5] let world &s[6..11]; // 切片…

Puppeteer vs Selenium的主要区别

Puppeteer vs. Selenium&#xff1a;他们来自哪里&#xff1f; Google Puppeteer是一个 Node.js 库和浏览器测试框架。该技术旨在提供高级应用程序编程接口&#xff0c;以通过 DevTools 协议控制无头 Chrome。Selenium 支持多种浏览器和语言&#xff0c;而 Puppeteer 只专注于 …

Leetcode-每日一题【剑指 Offer 32 - III. 从上到下打印二叉树 III】

题目 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20…

清风数学建模——拟合算法

拟合算法 文章目录 拟合算法概念 确定拟合曲线最小二乘法的几何解释求解最小二乘法matlab求解最小二乘法如何评价拟合的好坏计算拟合优度的代码 概念 在前面的篇幅中提到可以使用插值算法&#xff0c;通过给定的样本点推算出一定的曲线从而推算出一些想要的值。但存在一些问题…

设计模式之原型模式详解

前言 在设计模式的系列文章中&#xff0c;我们前面已经写了工厂模式、单列模式、建造者模式&#xff0c;在针对创建型模式中&#xff0c;今天想跟大家分享的是原型模式&#xff0c;我觉的这种模式叫克隆模式会更佳恰当。原型模式的目的就是通过复制一个现有的对象来生成一个新…