简单版开心消消乐(python实现)

文章目录

  • 一、pycharm 安装
    • 1.1 pycharm 下载
    • 1.2 pycharm 安装
  • 二、创建 python 项目
    • 2.1 创建项目
    • 2.2 配置项目环境
    • 2.3 编写项目代码
  • 三、撰写代码
    • 3.1 读取文件
    • 3.2 响应鼠标事件
      • 3.2.1 示例 1
      • 3.2.2 示例 2
    • 3.3 封装成类
      • 3.3.1 封装成类
      • 3.3.2 继续封装
    • 3.4 消除逻辑
  • 四、完整代码
    • 4.1 项目结构
    • 4.2 文件代码
      • 4.2.1 MagicBlock.py 文件
      • 4.2.2 main.py 文件

一、pycharm 安装

1.1 pycharm 下载

pycharm官网

点击上面官网链接,

在这里插入图片描述

点击 Download 按钮

在这里插入图片描述

【专业版只有30天试用期,所以我们下载社区版】
鼠标滚轮下滑,找到 PyCharm Community Edition,点击下载

在这里插入图片描述

下载完成后则进行安装

1.2 pycharm 安装

二、创建 python 项目

2.1 创建项目

2.2 配置项目环境

点击右上角设置

在这里插入图片描述

先点击 Project ,再点击 Python Interpreter ,然后点击 + 号

在这里插入图片描述

在搜索框输入 pygame ,选择第一个,点击 install Package

在这里插入图片描述

等待安装结束即可,可以发现多了一个 pygame 包,然后点击 ok 即可

在这里插入图片描述

2.3 编写项目代码

任务要求
画方块在屏幕上画出5行5列的方块,方块颜色随机

main.py 代码如下:

import random
import time
import pygame
import sysSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600def change_color():""" 产生随机颜色 """r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bdef draw_block(x, y, row, col, width, height):""" 在屏幕上画方块 """for i in range(0, row):for j in range(0, col):pygame.draw.rect(screen, change_color(), (x + i * width, y + j * height, width, height))if __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))while True:draw_block(50, 50, 5, 5, 50, 50)pygame.display.update()for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)time.sleep(0.3)

运行结果如下:

在这里插入图片描述

三、撰写代码

3.1 读取文件

任务要求
显示图片在2.3任务的基础上,把每一个方块替换为图片

在项目创建 image 文件夹,图片资源可以在文章顶部下载:

在这里插入图片描述

main.py 代码如下:

import random
import time
import pygame
import sys
import osSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600def change_color():""" 产生随机颜色 """r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bdef draw_block(x, y, row, col, width, height):""" 在屏幕上画方块 """for i in range(0, row):for j in range(0, col):r = random.randint(1, 7)pygame.draw.rect(screen, change_color(), (x + i * width, y + j * height, width, height))screen.blit(pygame.image.load(os.path.join('./image', ' (' + str(r) + ').png')),(x + i * width, y + j * height))if __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))while True:draw_block(50, 50, 10, 10, 50, 50)pygame.display.update()for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)time.sleep(0.3)

运行结果如下:

在这里插入图片描述

3.2 响应鼠标事件

3.2.1 示例 1

在这里插入图片描述
可以从 pygame 的 event 变量的 type 属性来确定事件类型,而 pygame 的 MOUSEBUTTONDOWN 常量则表示鼠标点击事件。

完整 main.py 代码如下:

import random
import time
import pygame
import sys
import osSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
DRAW_BLOCK = 111
DRAW_PIC = 222
DRAW_CIRCLE = 333def change_color():""" 产生随机颜色 """r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bdef draw_block(x, y, row, col, width, height, type):""" 在屏幕上画方块 """for i in range(0, row):for j in range(0, col):if type == DRAW_BLOCK:pygame.draw.rect(screen, change_color(), (x + i * width, y + j * height, width, height))elif type == DRAW_PIC:r = random.randint(1, 7)screen.blit(pygame.image.load(os.path.join('./image', ' (' + str(r) + ').png')),(x + i * width, y + j * height))else:continueif __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))while True:draw_block(50, 50, 10, 10, 50, 50, DRAW_PIC)pygame.display.update()for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint(x, y, y // 50, x // 50)time.sleep(0.3)

运行结果如下:

  点击方块时,终端会显示鼠标点击坐标和对应方块的行、列。

在这里插入图片描述

3.2.2 示例 2

在示例 1 的基础上,点击对应方块,对应方块就消除。

代码如下:

import random
import time
import pygame
import sys
import osSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
DRAW_BLOCK = 111
DRAW_PIC = 222
DRAW_CIRCLE = 333def change_color():""" 产生随机颜色 """r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bdef draw_block(x, y, row, col, width, height, type):""" 在屏幕上画方块 """for i in range(0, row):for j in range(0, col):if type == DRAW_BLOCK:pygame.draw.rect(screen, change_color(), (x + i * width, y + j * height, width, height))elif type == DRAW_PIC:r = random.randint(1, 6)screen.blit(pygame.image.load(os.path.join('./image', 'd (' + str(r) + ').png')),(x + i * width, y + j * height))else:continueif __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))draw_block(50, 50, 10, 10, 50, 50, DRAW_PIC)pygame.display.update()while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint(x, y, y // 50, x // 50)pygame.draw.rect(screen, (255, 255, 255), (x // 50 * 50, y // 50 * 50, 50, 50))pygame.display.update()time.sleep(0.3)

运行结果如下:

在这里插入图片描述

3.3 封装成类

3.3.1 封装成类

在这里插入图片描述

在目录下新建 MagicBlock.py 文件,文件代码如下:

import random
import pygameTYPE_RECT = 0
TYPE_IMAGE = 1
img_list = list()for i in range(1, 6):img_list.append(pygame.image.load('./image/d (' + str(i) + ').png'))class Block:def __init__(self, left, top):self.screen = Noneself.left = 50 + leftself.top = 50 + topself.type = TYPE_IMAGEself.random_index = random.randint(0, 4)def change_color(self):r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bdef draw(self, screen, width, height):position = self.left, self.top, width, heightself.screen = screenif self.type == TYPE_RECT:pygame.draw.rect(self.screen, self.change_color(), position)elif self.type == TYPE_IMAGE:screen.blit(img_list[self.random_index], (self.left, self.top))

更改 main.py 文件,更改后代码如下:

import random
import time
import pygame
import sys
import osfrom MagicBlock import BlockSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
DRAW_BLOCK = 111
DRAW_PIC = 222
DRAW_CIRCLE = 333if __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))for i in range(10):for j in range(10):block = Block(50 * i, 50 * j)block.draw(screen, 50, 50)pygame.display.update()while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint(x, y, y // 50, x // 50)pygame.draw.rect(screen, (255, 255, 255), (x // 50 * 50, y // 50 * 50, 50, 50))pygame.display.update()time.sleep(0.3)

运行结果如下:

在这里插入图片描述

3.3.2 继续封装

修改 MagicBlock.py 的代码为:

import random
import pygameTYPE_RECT = 0
TYPE_IMAGE = 1
img_list = list()for i in range(1, 6):img_list.append(pygame.image.load('./image/d (' + str(i) + ').png'))def change_color():r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bclass Block:def __init__(self, screen, block_type):self.screen = screenself.left = 0self.top = 0self.type = block_typeself.random_index = random.randint(0, 4)def draw(self, screen, width, height):position = self.left, self.top, width, heightself.screen = screenif self.type == TYPE_RECT:pygame.draw.rect(self.screen, change_color(), position)elif self.type == TYPE_IMAGE:screen.blit(img_list[self.random_index], (self.left, self.top))def mouse_clicked(self):pygame.draw.rect(self.screen, change_color(), (self.left, self.top, 50, 50))pygame.display.update()class MagicBlock:def __init__(self, start_x, start_y, row, col, screen, block_width, block_height, block_type):self.start_x = start_xself.start_y = start_yself.row = rowself.col = colself.screen = screenself.block_width = block_widthself.block_height = block_heightself.type = block_typeself.blocks = [[0] * self.col for _ in range(row)]self.init_blocks()def init_blocks(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j] = Block(self.screen, self.type)self.blocks[r][j].left = self.start_x + r * self.block_widthself.blocks[r][j].top = self.start_y + j * self.block_heightdef draw(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j].draw(self.screen, self.block_width, self.block_height)def mouse_clicked(self, x, y):if 0 < x - self.start_x < self.col * self.block_width and 0 < y-self.start_y < self.row * self.block_height:self.blocks[(x - self.start_x) // self.block_width][(y - self.start_y) // self.block_height].mouse_clicked()

修改 main.py 的代码为:

import random
import time
import pygame
import sys
import osfrom MagicBlock import MagicBlockSCREEN_WIDTH = 800
SCREEN_HEIGHT = 700
TYPE_RECT = 0
TYPE_IMAGE = 1if __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.blit(pygame.image.load('./image/background.png'), (0, 0))magic_block = MagicBlock(100, 50, 10, 10, screen, 50, 50, TYPE_IMAGE)magic_block.draw()pygame.display.update()while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posmagic_block.mouse_clicked(x, y)time.sleep(0.3)

运行结果如下:

在这里插入图片描述

3.4 消除逻辑

修改 magicBlock.py 文件代码如下:

import random
import queue
import pygameTYPE_RECT = 0
TYPE_IMAGE = 1
img_list = list()
block_queue = queue.Queue()for i in range(1, 6):img_list.append(pygame.image.load('./image/d (' + str(i) + ').png'))def change_color():r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bclass Block:def __init__(self, screen, block_type):self.screen = screenself.left = 0self.top = 0self.type = block_typeself.random_index = random.randint(0, 4)def draw(self, screen, width, height):position = self.left, self.top, width, heightself.screen = screenif self.type == TYPE_RECT:pygame.draw.rect(self.screen, change_color(), position)elif self.type == TYPE_IMAGE:screen.blit(img_list[self.random_index], (self.left, self.top))def mouse_clicked(self):if block_queue.qsize() < 2:block_queue.put(self)if block_queue.qsize() >= 2:t1 = block_queue.get()t2 = block_queue.get()if t1.random_index == t2.random_index:pygame.draw.rect(self.screen, change_color(), (t1.left, t1.top, 50, 50))pygame.draw.rect(self.screen, change_color(), (t2.left, t2.top, 50, 50))pygame.display.update()# class Blocks:
#     def __init__(self, row, col):
#         self.row = row
#         self.col = col
#         self.blocks = [[Block(50 * i, 50 * j) for i in range(row)] for j in range(col)]
#
#     def draw(self, screen, width, height):
#         for i in range(self.row):
#             for j in range(self.col):
#                 self.blocks[i][j].draw(screen, width, height)class MagicBlock:def __init__(self, start_x, start_y, row, col, screen, block_width, block_height, block_type):self.start_x = start_xself.start_y = start_yself.row = rowself.col = colself.screen = screenself.block_width = block_widthself.block_height = block_heightself.type = block_typeself.blocks = [[0] * self.col for _ in range(row)]self.init_blocks()def init_blocks(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j] = Block(self.screen, self.type)self.blocks[r][j].left = self.start_x + r * self.block_widthself.blocks[r][j].top = self.start_y + j * self.block_heightdef draw(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j].draw(self.screen, self.block_width, self.block_height)def mouse_clicked(self, x, y):if 0 < x - self.start_x < self.col * self.block_width and 0 < y - self.start_y < self.row * self.block_height:self.blocks[(x - self.start_x) // self.block_width][(y - self.start_y) // self.block_height].mouse_clicked()print((x - self.start_x) // self.block_width, (y - self.start_y) // self.block_height)else:print('f')

运行结果如下:

点击相同才可以消去,不同则不会
在这里插入图片描述

四、完整代码

4.1 项目结构

image 图片资源在文章顶部可以下载
MagicBlock.py 文件用于实现方块类
main.py 文件实现游戏流程
在这里插入图片描述

4.2 文件代码

4.2.1 MagicBlock.py 文件

import random
import queue
import pygameTYPE_RECT = 0
TYPE_IMAGE = 1
img_list = list()
block_queue = queue.Queue()for i in range(1, 6):img_list.append(pygame.image.load('./image/d (' + str(i) + ').png'))def change_color():r = random.randint(0, 255)g = random.randint(0, 255)b = random.randint(0, 255)return r, g, bclass Block:def __init__(self, screen, block_type):self.screen = screenself.left = 0self.top = 0self.type = block_typeself.random_index = random.randint(0, 4)def draw(self, screen, width, height):position = self.left, self.top, width, heightself.screen = screenif self.type == TYPE_RECT:pygame.draw.rect(self.screen, change_color(), position)elif self.type == TYPE_IMAGE:screen.blit(img_list[self.random_index], (self.left, self.top))def mouse_clicked(self):if block_queue.qsize() < 2:block_queue.put(self)if block_queue.qsize() >= 2:t1 = block_queue.get()t2 = block_queue.get()if t1.random_index == t2.random_index:pygame.draw.rect(self.screen, change_color(), (t1.left, t1.top, 50, 50))pygame.draw.rect(self.screen, change_color(), (t2.left, t2.top, 50, 50))pygame.display.update()# class Blocks:
#     def __init__(self, row, col):
#         self.row = row
#         self.col = col
#         self.blocks = [[Block(50 * i, 50 * j) for i in range(row)] for j in range(col)]
#
#     def draw(self, screen, width, height):
#         for i in range(self.row):
#             for j in range(self.col):
#                 self.blocks[i][j].draw(screen, width, height)class MagicBlock:def __init__(self, start_x, start_y, row, col, screen, block_width, block_height, block_type):self.start_x = start_xself.start_y = start_yself.row = rowself.col = colself.screen = screenself.block_width = block_widthself.block_height = block_heightself.type = block_typeself.blocks = [[0] * self.col for _ in range(row)]self.init_blocks()def init_blocks(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j] = Block(self.screen, self.type)self.blocks[r][j].left = self.start_x + r * self.block_widthself.blocks[r][j].top = self.start_y + j * self.block_heightdef draw(self):for r in range(self.row):for j in range(self.col):self.blocks[r][j].draw(self.screen, self.block_width, self.block_height)def mouse_clicked(self, x, y):if 0 < x - self.start_x < self.col * self.block_width and 0 < y - self.start_y < self.row * self.block_height:self.blocks[(x - self.start_x) // self.block_width][(y - self.start_y) // self.block_height].mouse_clicked()print((x - self.start_x) // self.block_width, (y - self.start_y) // self.block_height)else:print('f')

4.2.2 main.py 文件

import random
import time
import pygame
import sys
import osfrom MagicBlock import MagicBlockSCREEN_WIDTH = 800
SCREEN_HEIGHT = 700
TYPE_RECT = 0
TYPE_IMAGE = 1# def change_color():
#     """ 产生随机颜色 """
#     r = random.randint(0, 255)
#     g = random.randint(0, 255)
#     b = random.randint(0, 255)
#     return r, g, b
#
#
# def draw_block(x, y, row, col, width, height, type):
#     """ 在屏幕上画方块 """
#     for i in range(0, row):
#         for j in range(0, col):
#             if type == DRAW_BLOCK:
#                 pygame.draw.rect(screen, change_color(), (x + i * width, y + j * height, width, height))
#             elif type == DRAW_PIC:
#                 r = random.randint(1, 6)
#                 screen.blit(pygame.image.load(os.path.join('./image', 'd (' + str(r) + ').png')),
#                             (x + i * width, y + j * height))
#             else:
#                 continueif __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((SCREEN_HEIGHT, SCREEN_WIDTH))pygame.display.set_caption("happy remove")screen.blit(pygame.image.load('./image/background.png'), (0, 0))# blocks = Blocks(10, 10)# blocks.draw(screen, 50, 50)# for i in range(10):#     for j in range(10):#         block = Block(50 * i, 50 * j)#         block.draw(screen, 50, 50)# draw_block(50, 50, 10, 10, 50, 50, DRAW_PIC)magic_block = MagicBlock(100, 50, 10, 10, screen, 50, 50, TYPE_IMAGE)magic_block.draw()pygame.display.update()while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posmagic_block.mouse_clicked(x, y)time.sleep(0.3)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

改进YOLOv5,YOLOv5+CBAM注意力机制

目录 1. 目标检测模型 2. YOLOv5s 3. YOLOv5s融合注意力机制 4. 修改yolov5.yaml文件 5. ChannelAttentionModule.py 6. 修改yolo.py 1. 目标检测模型 目标检测算法现在已经在实际中广泛应用&#xff0c;其目的是找出图像中感兴趣的对象&#xff0c;并确定对象的类别和位…

计算机网络实验2:路由器常用协议配置

实验目的和要求 掌握路由器基本配置原理理解路由器路由算法原理理解路由器路由配置方法实验项目内容 路由器的基本配置 路由器单臂路由配置 路由器静态路由配置 路由器RIP动态路由配置 路由器OSPF动态路由配置实验环境 1. 硬件&#xff1a;PC机&#xff1b; 2. 软…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…

网安面经之文件上传漏洞

一、文件上传漏洞 1、文件上传漏洞的原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;⽂件上传漏洞是发⽣在有上传功能的应⽤中&#xff0c;如果应⽤程序对⽤户上传的⽂件没有控制或者存在缺陷&#xff0c;攻击者可以利⽤应⽤上传功能存在的缺陷&#xff…

2024年怎样提取小程序里的视频

在未来的2024年&#xff0c;我们亲眼目睹了科技的飞速发展和互联网的无限可能。在这个数字化世界中&#xff0c;小程序已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是购物、学习&#xff0c;还是娱乐&#xff0c;小程序都给我们带来了前所未有的便利。然而&#xf…

AI算法-高数4-偏导数(理解梯度下降算法基础)

宋浩老师&#xff1a;6.3 偏导数_哔哩哔哩_bilibili 示例&#xff1a; 几何意义&#xff1a;

springboot2.x集成Elasticsearch7.7.0

一、前言 elasticsearch安装就不做过多介绍了&#xff0c;网上一搜一大堆&#xff1b;最需要注意的就是Elasticsearch与spring版本&#xff0c;防止版本不兼容导致的后续的一系列问题。我这里springbootspring-data-elasticsearch&#xff0c;他们的版本对照关系可以参照sprin…

安全继电器的使用和作用

目录 一、什么是安全继电器 二、安全继电器的接线方式 三、注意事项 四、总结 一、什么是安全继电器 安全继电器是由多个继电器与硬件电路组合而成的一种模块&#xff0c;是一种电路组成单元&#xff0c;其目的是要提高安全因素。完整点说&#xff0c;应该叫成安全继电器模…

基于单片机的温度控制系统设计(51基础版)-设计说明书

本论文设计了一种基于51单片机的温度控制系统&#xff0c;该系统具备以下主要功能&#xff1a;首先&#xff0c;通过温度传感器实时检测环境温湿度&#xff0c;以获取准确的温度数值。其次&#xff0c;通过按键设置温度阈值&#xff0c;用户可以根据需求自行调整控制温度的上限…

重写muduo之Buffer

1、 Buffer.h Buffer封装 是一个缓冲区 prependable bytesreadable byteswritable bytes8字节长度&#xff08;解决粘包问题&#xff09;读数据写数据 根据下标进行读或者写 3个成员变量&#xff1a;数组&#xff0c;数据可读的下标&#xff0c;数据可写的下标 #pragma once#…

免费思维13招之六:功能型思维

免费思维13招之六&#xff1a;功能型思维 这节来学习一下免费思维的另一大思维——功能型思维。 这个思维通俗易懂。功能型思维是指将其他产品的功能在我们的产品上进行体现&#xff0c;让客户获得免费的使用。 也就是说&#xff0c;客户买了你的产品&#xff0c;却可以免费得…

常见算法策略

前言 算法策略是指在解决问题或完成任务时所采用的方法、技巧或步骤的总称。 在设计算法时&#xff0c;通常会考虑多种策略&#xff0c;并选择最适合特定问题的策略来实现算法的设计和优化。 算法策略比较 动态规划 动态规划介绍入口