pygame8 扫雷游戏

news2024/9/22 3:54:58

一、游戏规则:

1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利

2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷

二、游戏主逻辑:

主要逻辑即调用run_game, 然后循环检测事件和更新屏幕

检测事件逻辑主要分两种,一种为是否退出,另一种是否有鼠标点击

更新屏幕主要分三部分,首先是刷白屏幕,然后是画出覆盖物,最后是将缓存更新到屏幕

至此游戏的主要逻辑就完成了

三、游戏细节

根据此主要逻辑我们可以设计一个游戏类Game,定义三个函数,

run_game()

_event_check()

_update_screen()

分别对应为运行游戏主逻辑,事件检测,更新屏幕

现在我们来看一下所谓的覆盖物是一个什么东西:

从图上可以看出是一个20*20的方格列表,我们可以定义一个类Cover 将关于怎样画这些小方格包在里面,

看起来是需要设计一个列表,其长度是20,宽度也是20,每一个方格都是一个25像素的正方形,画的时候可以用一个循环,将列表中的方格依次用draw.rect画出来

for cur in self.covers:
    pygame.draw.rect(self.screen, self.setting.cover_color, [cur[0] * 25, cur[1] * 25, 24, 24])

这儿注意的是方格是宽高都为25,但真正画的时候宽高应该少一个像素,原因是画满的话格子边界就会混在一起,看不出来了

self.covers在一开始需要定义:

    def __init__(self, setting, screen):  # 游戏参数设置和游戏主界面
        self.setting = setting
        self.screen = screen

        self.covers = []  # 存储未被点击过的方块的覆盖物的位置
        for i in range(20):
            for j in range(20):
                self.covers.append([i, j])  # 刚开始时整个界面都是被覆盖的

主程序的实现代码非常简单:

if __name__ == '__main__':
    my_game = Game()
    my_game.run_game()

Game的定义主要是为了实现前面定义的三个函数,初始化时需要将covers也一并引入:


class Game:
    def __init__(self):
        pygame.init()
        self.setting = setting()
        self.screen = pygame.display.set_mode(self.setting.screen_size)
        self.covers = Cover(self.setting, self.screen)  # 表面覆盖物

    def run_game(self):
        while True:
            self._event_check_()  # 检测事件
            self._update_screen_()  # 更新屏幕

    def _event_check_(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # 结束游戏
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                x, y = pygame.mouse.get_pos()  # 检测到单击鼠标事件,将鼠标的位置传入
                self.covers.delete(x, y)  # 删除对应方块上的覆盖物

    def _update_screen_(self):
        self.screen.fill(self.setting.background_color)  # 填充背景颜色
        self.covers.show()  # 将还没有被点击过的数字展现出来
        pygame.display.flip()  # 更新屏幕显示,将上面所做的工作展现在游戏界面上

最后附上本节课的全部代码:
 

import pygame
from settings import setting  # 游戏参数设置
from covers import Cover  # 未点击方块时表面的覆盖物
import sys


class Game:
    def __init__(self):
        pygame.init()
        self.setting = setting()
        self.screen = pygame.display.set_mode(self.setting.screen_size)
        self.covers = Cover(self.setting, self.screen)  # 表面覆盖物

    def run_game(self):
        while True:
            self._event_check_()  # 检测事件
            self._update_screen_()  # 更新屏幕

    def _event_check_(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # 结束游戏
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                x, y = pygame.mouse.get_pos()  # 检测到单击鼠标事件,将鼠标的位置传入
                self.covers.delete(x, y)  # 删除对应方块上的覆盖物

    def _update_screen_(self):
        self.screen.fill(self.setting.background_color)  # 填充背景颜色
        self.covers.show()  # 将还没有被点击过的数字展现出来
        self.covers.show_frame()

        pygame.display.flip()  # 更新屏幕显示,将上面所做的工作展现在游戏界面上


if __name__ == '__main__':
    my_game = Game()
    my_game.run_game()
"""
@funcs: 覆盖们
"""
import pygame


class Cover:
    """管理游戏覆盖物的类"""

    def __init__(self, setting, screen):  # 游戏参数设置和游戏主界面
        self.setting = setting
        self.screen = screen

        self.covers = []  # 存储未被点击过的方块的覆盖物的位置
        for i in range(20):
            for j in range(20):
                self.covers.append([i, j])  # 刚开始时整个界面都是被覆盖的

    def show_frame(self):
        for i in range(20):
            pygame.draw.line(self.screen, self.setting.frame_color, [0, i*25], [500, i*25])
            pygame.draw.line(self.screen, self.setting.frame_color, [i*25, 0], [i*25, 500])

    def show(self):  # 将所有未被点击过的方块展现出来
        for cur in self.covers:
            pygame.draw.rect(self.screen, self.setting.cover_color, [cur[0] * 25, cur[1] * 25, 24, 24])

    def delete(self, posx, posy):
        x = posx // 25
        y = posy // 25
        if [x, y] in self.covers:
            self.covers.remove([x, y])
class setting:
    """管理游戏中的参数的类"""

    def __init__(self):
        self.screen_size = [500, 500]  # 屏幕大小
        self.background_color = [255, 255, 255]  # 背景色
        self.frame_width = 1  # 线条粗细
        self.cover_color = [150, 150, 150]  # 展示界面的颜色
        self.frame_color = [120, 120, 120]

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

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

相关文章

云计算|OpenStack|社区版OpenStack---基本概念科普(kvm的驱动类别和安装)

前言: 云计算里基本都是基于kvm技术作为底层支撑,但,该技术是比较复杂的,首先,需要硬件的 支撑,表现在物理机上,就是需要在BIOS中调整设置虚拟化功能,这个虚拟机功能通常是interVT或…

Fastjson2基础使用以及底层序列化/反序列化实现探究

1 Fastjson2简介 Fastjson2是Fastjson的升级版,特征: 协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8/服务端其他特性支持&a…

python基础知识有哪些需要背(记住是基础知识)我是初学者

大家好,小编来为大家解答以下问题,一个有趣的事情,一个有趣的事情,今天让我们一起来看看吧! 1、python基础知识有哪些需要背(记住是基础知识)我是初学者 或看好Python的广阔前景,或…

RabbitMQ 入门到应用 ( 五 ) 应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…

python基于django微信小程序的适老化老人健康预警小程序

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…

Spring国际化实现

Java国际化 Java使用Unicode来处理所有字符。 Locales 国际化主要涉及的是数字、日期、金额等。 有若干个专门负责格式处理的类。为了对格式进行控制,可以使用Locale类。它描述了: 一种语言一个位置(通常包含)一段脚本(可选,自Java SE7开…

CMMI之需求开发流程

需求开发(Requirement Development, RD)的目的是通过调查与分析,获取用户需求并定义产品需求。需求开发过程域是SPP模型的重要组成部分。本规范阐述了需求开发过程域的两个主要规程: 需求调查 [SPP-PROC-RM-SURVEY] 需求定义 [SPP…

消失的数字【C语言】

题目&#xff1a; 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 解法&#xff1a; int missingNumber(int* nums, int numsSize){int val0;for(int i0;i<numsSize;i){val^nums[i];}fo…

Vue3之条件渲染

1.何为条件渲染 条件渲染就是在指定的条件下&#xff0c;渲染出指定的UI。比如当我们显示主页的时候&#xff0c;应该隐藏掉登录等一系列不相干的UI元素。即UI元素只在特定条件下进行显示。而在VUE3中&#xff0c;这种UI元素的显示和隐藏可以通过两个关键字&#xff0c;v-if 和…

Qt动画框架详解

目录1.前言2.原理3.属性动画4.并行执行的动画5.顺序执行的动画6.扩展属性动画支持的数据类型1.前言 为软件适当的添加一些动画&#xff0c;能够提高软件的用户体验。在使用Qt框架开发软件时&#xff0c;我们可以用Qt提供的动画框架来为QWidget等UI元素添加动画效果。本文从动画…

程序员和他的女朋友一起创建了价值 150,000,000 美元的网站

本篇文章讲述了Otis和Elizabeth Chandler创办Goodreads.com的故事。他们从小就爱读书&#xff0c;创办网站前他们的困惑是没有很多人在线分享书评。Otis和Elizabeth觉得如果有一个地方把所有人的评论和评价收集起来&#xff0c;那将会很有价值。奥蒂斯和伊丽莎白从小就喜欢读书…

MMKV与mmap:全方位解析

概述 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;性能高&#xff0c;稳定性强。从 2015 年中至今&#xff0c;在 iOS 微信上使用已有近 3 年&#xff0c;其性能和稳定性经过了时间的验证。近期已移植…

海量数据相似数据查询方法

1、海量文本常见 海量文本场景&#xff0c;如何寻找一个doc的topn相似doc&#xff0c;一般存在2个问题&#xff0c; 1)、两两对比时间o(n^2) 2)、高维向量比较比较耗时。 文本集可以看成(doc,word)稀疏矩阵&#xff0c;一般常见的方法是构建到排索引&#xff0c;然后进行归并…

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精读】DeepWalk: Online Learning of Social Representations

DeepWalk: Online Learning of Social Representations 本文是我参加Datawhale的CS224W图机器学习时的笔记&#xff0c;第一次学习图机器学习&#xff0c;对DeepWalk这篇开山之作的理解。 论文的三位作者均来自纽约州立大学石溪分校&#xff0c;杨振宁和丘成桐也曾在此教学。 …

JavaScript内存泄露和垃圾回收机制

1、是什么&#xff1f;内存泄露&#xff08;Memory leak&#xff09;是在计算机科学中&#xff0c;由于疏忽或错误造成程序未能释放已经不再使用的内存。并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内…

Spring Boot 项目介绍

Spring Boot 项目介绍 作为学习过 Java 的软件开发者&#xff0c;相信都知道 Spring 这一伟大的框架&#xff0c;它所拥有的强大功能之一就是可以集成各种开源软件。但随着互联网的高速发展&#xff0c;各种框架层出不穷&#xff0c;这就对系统架构的灵活性、扩展性、可伸缩性…

【项目精选】基于JSP物流信息网(论文+源码+视频)

点击下载源码 近年来&#xff0c;随着时代的进步&#xff0c;社会随之不断发展&#xff0c;经济也快速发展起来了&#xff0c;人民的消费水平在不断地提高&#xff0c;平常的实体店消费已经不能满足人们的需求&#xff1b;在者&#xff0c;互联网技术的不断发展也为电子商务的兴…

CSS Houdini

前言 最近看了几篇文章&#xff0c;是关于 CSS Houdini 的。作为一个前端搬砖的还真不知道这玩意&#xff0c;虽然不知道的东西挺多的&#xff0c;但是这玩意有点高大上啊。 Houdini 是一组底层 API&#xff0c;它们公开了 CSS 引擎的各个部分&#xff0c;从而使开发人员能够通…

Matlab搭建AlexNet实现手写数字识别

Matlab搭建AlexNet实现手写数字识别 个人博客地址 文章目录Matlab搭建AlexNet实现手写数字识别环境内容步骤准备MNIST数据集数据预处理定义网络模型定义训练超参数网络训练和预测代码下载环境 Matlab 2020aWindows10 内容 使用Matlab对MNIST数据集进行预处理&#xff0c;搭建…