如何检测网格单元格中的点击并更改其颜色?

2024-03-29

对 python 相当陌生,并试图重新创建我在学校玩的游戏。对于这个游戏,我需要随机产生这些炸弹,如果击中,这些炸弹会将您的银行帐户减少到零,并将方块的炸弹方块的颜色更改为红色(而安全的则变为绿色)。 我遇到的问题是:

  • 我想将炸弹方块的颜色改为红色,但他们不这样做,它们只是保持白色,但是,安全的确实会变成绿色
  • 另外对于炸弹的坐标,我想确保这些坐标都不相等,我想让它重新滚动重复的坐标

任何有关这些的帮助将不胜感激

#--------------------------------Pirate Game-----------------------------------------------------------------------------------------------------

#initilising
import pygame
import random
black = (0, 0, 0)
white = (255, 255, 255)
green = (0, 255, 0)
red = (255, 0, 0)
 

width = 20
height = 20
margin = 5#gap between 

current = 0
bank = 0
turnnumber = 0

grid = []
for row in range(10):
    # Add an empty array that will hold each cell
    # in this row
    grid.append([])
    for column in range(10):
        grid[row].append(0) 
 

pygame.init()
GameR = [600,600]
gameD = pygame.display.set_mode(GameR)
pygame.display.set_caption("Pirate Game")
 
done = False

clock = pygame.time.Clock()
#-------------------------------------------------------------------------------------------------------
#FUNCTIONS
def bombs():
    for i in range(5):
        row = random.randrange(10)
        column = random.randrange(10)
        grid[row][column] = 2
        print(row,column)



#---------------------------------------------------------------------------
#MAIN LOOP:

done = False

clock = pygame.time.Clock()
while not done:
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bombs()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                print("Dont Press that")
        elif event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            # Change the x/y screen coordinates to grid coordinates
            column = pos[0] // (width + margin)
            row = pos[1] // (height + margin)
            if grid[row][column] == 2:
                print('Boom')
            if grid[row][column] != 2:
                grid[row][column] = 1
                print("Click ", pos, "Grid coordinates: ", row, column)

                
    gameD.fill(black)
 
    #Draw the grid
    for row in range(10):
        for column in range(10):
            color = white
            if grid[row][column] == 1:
                color = green
            elif grid[row][column] == 2:
                colour = red
            pygame.draw.rect(gameD,
                             color,
                             [(margin +
                               width) * column + margin,
                              (margin + height) * row + margin,
                              width,
                              height])
 
    
    clock.tick(60)
    pygame.display.flip()
 
pygame.quit()

首先有一个错字:color = red而不是colour = red.

无论如何,你必须改变你的游戏逻辑。对于未单击的单元格使用值 0 和 2,对于已单击的单元格使用值 1 和 3。将网格的所有字段初始化为 0。通过将 2 分配给随机单元格,在网格上放置随机炸弹。
当单击值为 0 的单元格时,将其值更改为 1。当单击带有炸弹(值 2)的单元格时,将其值更改为 3:

while not done:
    # [...]

    for event in pygame.event.get():  
        # [...]

        elif event.type == pygame.MOUSEBUTTONDOWN:
            # Change the x/y screen coordinates to grid coordinates
            column = event.pos[0] // (width + margin)
            row = event.pos[1] // (height + margin)
            if grid[row][column] == 2:
                print('Boom')
                grid[row][column] = 3
            if grid[row][column] == 0:
                grid[row][column] = 1
                print("Click ", event.pos, "Grid coordinates: ", row, column)

当您绘制网格时,所有单元格都必须绘制为白色。除了单元格的值为 1 之外。在本例中,它的颜色为绿色。如果单元格的值为 3,则其颜色为红色:

while not done:
    # [...]

    #Draw the grid
    for row in range(10):
        for column in range(10):
            color = white
            if grid[row][column] == 1:
                color = green
            elif grid[row][column] == 3:
                color = red
            cell_rect = ((margin + width) * column + margin, (margin + height) * row + margin, width, height)
            pygame.draw.rect(gameD, color, cell_rect)

完整示例:

#initilising
import pygame
import random
black = (0, 0, 0)
white = (255, 255, 255)
green = (0, 255, 0)
red = (255, 0, 0)
 
width = 20
height = 20
margin = 5#gap between 

current = 0
bank = 0
turnnumber = 0

grid = []
for row in range(10):
    # Add an empty array that will hold each cell
    # in this row
    grid.append([])
    for column in range(10):
        grid[row].append(0) 
 
pygame.init()
GameR = [600,600]
gameD = pygame.display.set_mode(GameR)
pygame.display.set_caption("Pirate Game")
 
done = False
clock = pygame.time.Clock()
#-------------------------------------------------------------------------------------------------------
#FUNCTIONS
def bombs():
    for i in range(5):
        row = random.randrange(10)
        column = random.randrange(10)
        grid[row][column] = 2
        print(row,column)

bombs()

#---------------------------------------------------------------------------
#MAIN LOOP:

done = False

clock = pygame.time.Clock()
while not done:
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                bombs()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                print("Dont Press that")
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # Change the x/y screen coordinates to grid coordinates
            column = event.pos[0] // (width + margin)
            row = event.pos[1] // (height + margin)
            if grid[row][column] == 2:
                print('Boom')
                grid[row][column] = 3
            if grid[row][column] == 0:
                grid[row][column] = 1
                print("Click ", event.pos, "Grid coordinates: ", row, column)
           
    gameD.fill(black)
 
    #Draw the grid
    for row in range(10):
        for column in range(10):
            color = white
            if grid[row][column] == 1:
                color = green
            elif grid[row][column] == 3:
                color = red
            cell_rect = ((margin + width) * column + margin, (margin + height) * row + margin, width, height)
            pygame.draw.rect(gameD, color, cell_rect)
 
    clock.tick(60)
    pygame.display.flip()
 
pygame.quit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检测网格单元格中的点击并更改其颜色? 的相关文章

随机推荐

  • 有没有办法给某人打电话并在android中播放音频文件?

    我想创建一个紧急呼叫应用程序 如果触发 它会呼叫给定号码并播放音频文件 提供呼叫者无法提供的信息 为此 我需要拨打电话 但确保我可以用播放的音频文件替换扬声器中的任何声音 我可以在安卓中做到这一点吗 有什么办法呢 目前您无法使用 G1 执行
  • 自定义“AuthenticationStateProvider”身份验证失败

    我创建了一个自定义ApiAuthenticationStateProvider返回后AuthenticationState仍在说明 info Microsoft AspNetCore Authorization DefaultAuthori
  • Genymotion 中运行的虚拟设备会定期在 ADB 中离线

    我有一个在 Genymotion 2 4 中运行的 Android 设备 如果重要的话 带有 Lollipop 图像 并通过 ADB 版本 1 0 32 从本地网络中使用 Eclipse 的另一台开发人员 PC 连接到它 没有连接问题 一切
  • 如何使用 swift 3 通过 firebase 推送通知发送图像

    任何人都可以帮我发送这样的通知 我正在使用 Firebase 通知 当我发送通知时 我尝试将图像 URL 放入高级选项和键 1 的值中 图像 URL 显示在调试器中 但当我的设备中出现通知时 没有显示图像 这是我的代码 import UIK
  • 使用 Moq 进行 FormsAuthentication.SetAuthCookie 模拟

    您好 我正在对 ASP Net MVC2 项目进行一些单元测试 我正在使用起订量框架 在我的 LogOnController 中 HttpPost public ActionResult LogOn LogOnModel model str
  • SBT 未解决 Squeryl 依赖关系

    我最近开始了一个新项目 Play 框架和Scala 我习惯于使用 Squeryl 进行 ORM 但由于某种原因 这次它无法解决我的依赖关系 尽管它会解决其他问题 只是不能解决 squeryl 问题 我所做的唯一不同的是 我使用的计算机与以前
  • 是否可以查询ExpandoObject列表?

    我想知道是否可以使用常规 LINQ 查询 ExpandoObject 原因是我有动态 ExpandoObject 但我需要进行一些查询才能进一步传递 它有一些始终保留的属性 例如Id Notes还有一些我无法控制的动态属性 这是我的列表的样
  • 在 PowerPoint 中插入、裁剪和调整图像大小,每张现有幻灯片一张

    这是我创建的用于插入图像和调整图像大小的代码 每张幻灯片一个 我无法裁剪从文件位置插入的图像 过程应该是 将图像从文件位置插入到现有幻灯片中 将图像裁剪为所需的尺寸 将图像调整为所需的大小 注意 我的一个文件中有大约 40 张图像 我需要将
  • 什么是依赖类型?

    有人可以向我解释依赖类型吗 我对 Haskell Cayenne Epigram 或其他函数式语言缺乏经验 因此您可以使用的术语越简单 我就越感激 考虑一下 在所有像样的编程语言中 您都可以编写函数 例如 def f arg result
  • 在 Rails 查询中提取关联模型的属性

    在我的 Rails 应用程序中 收藏品有很多projects 并且项目有很多steps 我想获取集合项目中步骤的所有 id 我想知道是否可以在一个查询中完成这一切 例如 我知道我可以执行以下操作 step ids collection pr
  • Meteor 构建内存不足

    我正在尝试构建我的流星应用程序 并且不断遇到以下错误 这不是我第一次构建该应用程序 直到昨天的构建为止一切正常 我已经尝试过 正如 this SO post 1 中的一个答案中所建议的 但它没有帮助 usr bin env node max
  • SAPUI5:如何过滤具有2个或更多值的数据

    我目前正在 SAPUI5 中尝试一些东西 并且我已经实现了一个非常简单的搜索 如下所示 var filters var query evt getParameter query if query query length gt 0 var
  • Android:从服务中关闭屏幕

    我正在尝试找出如何从服务中关闭屏幕 我已经读过this https stackoverflow com questions 1875669 calling hidden api in android to turn screen off但我
  • 如何使用实体框架将存储过程的结果映射到具有不同命名参数的实体

    我正在尝试使用实体框架创建一个基本示例 以将 SQL Server 存储过程的输出映射到 C 中的实体 但该实体具有不同 友好 的名称参数 而不是更神秘的名称 我还尝试使用 Fluent 即非 edmx 语法来做到这一点 什么有效 存储过程
  • -XX:MaxPermSize 带或不带 -XX:PermSize

    我们遇到了一个Java lang OutOfMemoryError 永久代空间错误并查看 tomcat JVM 参数 除了 Xms and Xmx我们还指定了参数 XX MaxPermSize 128m 经过一些分析后 我可以看到 Perm
  • 将 Leaflet 与 Ionic2 typescript 一起使用

    我是新来的Ionic2 and Angular2 with 打字稿我想为 iOS 和 Android 构建一个移动应用程序 下一步我想包括一张地图并找到Leaflet 在 GoogleMaps 和 OSM 之间轻松更改 所以 我的问题从安装
  • MSBuild条件编译

    我有一个 Web 服务类 框架的其余部分依赖它来获取其数据 但是 Web 服务类需要根据其所处的环境具有不同的方法属性 例如 SoapDocumentMethodAttribute https example public string T
  • 在内存中运行 Docker?

    据我了解 Docker 使用内存映射文件从镜像启动 由于我可以一遍又一遍地执行此操作 并且据我记得并行启动同一图像的不同实例 我猜 docker 抽象了文件系统并将更改存储在其他地方 我想知道 docker 是否可以配置 或者默认情况下 以
  • 从一个 Visual Studio 实例调试程序的多个副本

    我有一个 pre alpha GUI 程序内部测试 http en wikipedia org wiki Eat one 27s own dog food并希望在调试器下运行 当出现问题时 但我不想为应用程序的每个实例启动 Visual S
  • 如何检测网格单元格中的点击并更改其颜色?

    对 python 相当陌生 并试图重新创建我在学校玩的游戏 对于这个游戏 我需要随机产生这些炸弹 如果击中 这些炸弹会将您的银行帐户减少到零 并将方块的炸弹方块的颜色更改为红色 而安全的则变为绿色 我遇到的问题是 我想将炸弹方块的颜色改为红