鱼C论坛

 找回密码
 立即注册
查看: 166|回复: 14

[已解决]黑色的玩意咋回事

[复制链接]
发表于 2024-4-14 14:49:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from random import randint, choice
  2. import pygame

  3. # CONSTANTS & VARIABLES #
  4. SS = SW, SH = (1500, 1000) # SCREEN [SIZE / WIDTH / HEIGHT]
  5. BW = BH = 20 # BLOCK [WIDTH / HEIGHT]
  6. WW = 75 # WORLD WIDTH
  7. WH = 72 # WORLD HEIGHT
  8. BLOCKS = [
  9.     # name, color
  10.     ("air", (128, 192, 255)),
  11.     ("grass_land", (128, 255, 192)),
  12.     ("stone", (96, 96, 96)),
  13. ]
  14. rx = 0 # render x
  15. ry = 25 # render y
  16. screen = None
  17. world = []

  18. # FUNCTIONS #
  19. def generate_world(): # 生成世界
  20.     world = [[0 for _ in range(WW)] for _ in range(WH)] # 世界
  21.     h = [0 for _ in range(WW)]  # 各个平面坐标的高度
  22.     for x in range(WW): # 生成 16 列的世界
  23.         if x == 0: # 第一列是随机高度
  24.             h[x] = randint(40, 56)
  25.         else: # 上一列的高度 +1 / 0 / -1
  26.             h[x] = h[x - 1] + choice([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
  27.         for y in range(0, 72): # 生成高度
  28.             if y < h[x]: # 高度低于需要生成的高度,设置为石头
  29.                 world[y][x] = 2
  30.             elif y == h[x]: # 高度等于需要生成的高度,设置为草地
  31.                 world[y][x] = 1
  32.             else: # 高度高于需要生成的高度,设置为空气
  33.                 world[y][x] = 0
  34.     return world

  35. def initalize(): # 初始化函数
  36.     global screen, world
  37.     pygame.init()
  38.     screen = pygame.display.set_mode(SS)
  39.     pygame.display.set_caption("GezheLand")
  40.     world = generate_world()

  41. # MAIN PROGRAM #

  42. initalize()

  43. running = True
  44. while running:
  45.     for event in pygame.event.get():
  46.         if event.type == pygame.QUIT:
  47.             running = False
  48.     screen.fill((0, 0, 0))
  49.     for x in range(0, SW // BW):
  50.         for y in range(0, SH // BH):
  51.             try:
  52.                 pygame.draw.rect(screen, BLOCKS[world[y + ry][x + rx]][1], (x * BW, SH - (y + 1) * BH, BW, BH))
  53.             except:
  54.                 pass
  55.     pygame.display.flip()
  56. pygame.quit()
复制代码


rt,ai 说 58 行应该是 SH - (y + 1) * BH(已经在代码里加上了),但这样造成的结果是少一行黑边,并没有让黑边消失

Snipaste_2024-04-14_14-48-02.png
最佳答案
2024-4-14 19:23:38
  1. from random import randint, choice
  2. import pygame

  3. # CONSTANTS & VARIABLES #
  4. SS = SW, SH = (1500, 1000)  # SCREEN [SIZE / WIDTH / HEIGHT]
  5. BW = BH = 20  # BLOCK [WIDTH / HEIGHT]
  6. WW = 75  # WORLD WIDTH
  7. WH = 72  # WORLD HEIGHT
  8. BLOCKS = [
  9.     # name, color
  10.     ("air", (128, 192, 255)),
  11.     ("grass_land", (128, 255, 192)),
  12.     ("stone", (96, 96, 96)),
  13. ]
  14. rx = 0  # render x
  15. ry = WH - SH // BH  # Adjusted to start rendering from the bottom of the world matrix
  16. screen = None
  17. world = []

  18. # FUNCTIONS #
  19. def generate_world():  # 生成世界
  20.     world = [[0 for _ in range(WW)] for _ in range(WH)]  # 世界
  21.     h = [0 for _ in range(WW)]  # 各个平面坐标的高度
  22.     for x in range(WW):  # 生成 16 列的世界
  23.         if x == 0:  # 第一列是随机高度
  24.             h[x] = randint(40, 56)
  25.         else:  # 上一列的高度 +1 / 0 / -1
  26.             h[x] = h[x - 1] + choice([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
  27.         for y in range(WH):  # 生成高度
  28.             if y < h[x]:  # 高度低于需要生成的高度,设置为石头
  29.                 world[y][x] = 2
  30.             elif y == h[x]:  # 高度等于需要生成的高度,设置为草地
  31.                 world[y][x] = 1
  32.             else:  # 高度高于需要生成的高度,设置为空气
  33.                 world[y][x] = 0
  34.     return world

  35. def initialize():  # 初始化函数
  36.     global screen, world
  37.     pygame.init()
  38.     screen = pygame.display.set_mode(SS)
  39.     pygame.display.set_caption("GezheLand")
  40.     world = generate_world()

  41. # MAIN PROGRAM #
  42. initialize()

  43. running = True
  44. while running:
  45.     for event in pygame.event.get():
  46.         if event.type == pygame.QUIT:
  47.             running = False
  48.     screen.fill((0, 0, 0))
  49.     for x in range(SW // BW):
  50.         for y in range(SH // BH):
  51.             try:
  52.                 block_color = BLOCKS[world[y + ry][x + rx]][1]
  53.                 pygame.draw.rect(screen, block_color, (x * BW, SH - (y + 1) * BH, BW, BH))
  54.             except IndexError:
  55.                 pass  # This pass handles cases where the block is out of the world's range
  56.     pygame.display.flip()
  57. pygame.quit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-14 14:49:30 | 显示全部楼层
你好!这是因为在绘制方块时,y 坐标的计算方式可能有误。现在的计算方式是 `SH - (y + 1) * BH`,但实际上应该是 `SH - y * BH - BH`,这样才能将方块完全绘制在屏幕上。

修改一下代码中的 `pygame.draw.rect` 部分,将 `SH - (y + 1) * BH` 改为 `SH - y * BH - BH`,如下所示:

  1. for x in range(0, SW // BW):
  2.     for y in range(0, SH // BH):
  3.         try:
  4.             pygame.draw.rect(screen, BLOCKS[world[x][y]], (x * BW, SH - y * BH - BH, BW, BH))
  5.         except:
  6.             pass
复制代码


这样就可以正确地绘制方块,并且不会出现黑边了。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-14 17:00:55 | 显示全部楼层
FishC 发表于 2024-4-14 14:49
你好!这是因为在绘制方块时,y 坐标的计算方式可能有误。现在的计算方式是 `SH - (y + 1) * BH`,但实际上 ...

没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-14 17:01:16 | 显示全部楼层


非常抱歉代码修改没有解决问题。那么我需要进一步了解你遇到的具体问题,以便更好地帮助你解决。你能提供更多关于"黑色的玩意"的问题描述吗?你是指在什么情况下出现的?是否有报错信息?请提供更多细节,我会尽力帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-14 19:23:38 | 显示全部楼层    本楼为最佳答案   
  1. from random import randint, choice
  2. import pygame

  3. # CONSTANTS & VARIABLES #
  4. SS = SW, SH = (1500, 1000)  # SCREEN [SIZE / WIDTH / HEIGHT]
  5. BW = BH = 20  # BLOCK [WIDTH / HEIGHT]
  6. WW = 75  # WORLD WIDTH
  7. WH = 72  # WORLD HEIGHT
  8. BLOCKS = [
  9.     # name, color
  10.     ("air", (128, 192, 255)),
  11.     ("grass_land", (128, 255, 192)),
  12.     ("stone", (96, 96, 96)),
  13. ]
  14. rx = 0  # render x
  15. ry = WH - SH // BH  # Adjusted to start rendering from the bottom of the world matrix
  16. screen = None
  17. world = []

  18. # FUNCTIONS #
  19. def generate_world():  # 生成世界
  20.     world = [[0 for _ in range(WW)] for _ in range(WH)]  # 世界
  21.     h = [0 for _ in range(WW)]  # 各个平面坐标的高度
  22.     for x in range(WW):  # 生成 16 列的世界
  23.         if x == 0:  # 第一列是随机高度
  24.             h[x] = randint(40, 56)
  25.         else:  # 上一列的高度 +1 / 0 / -1
  26.             h[x] = h[x - 1] + choice([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
  27.         for y in range(WH):  # 生成高度
  28.             if y < h[x]:  # 高度低于需要生成的高度,设置为石头
  29.                 world[y][x] = 2
  30.             elif y == h[x]:  # 高度等于需要生成的高度,设置为草地
  31.                 world[y][x] = 1
  32.             else:  # 高度高于需要生成的高度,设置为空气
  33.                 world[y][x] = 0
  34.     return world

  35. def initialize():  # 初始化函数
  36.     global screen, world
  37.     pygame.init()
  38.     screen = pygame.display.set_mode(SS)
  39.     pygame.display.set_caption("GezheLand")
  40.     world = generate_world()

  41. # MAIN PROGRAM #
  42. initialize()

  43. running = True
  44. while running:
  45.     for event in pygame.event.get():
  46.         if event.type == pygame.QUIT:
  47.             running = False
  48.     screen.fill((0, 0, 0))
  49.     for x in range(SW // BW):
  50.         for y in range(SH // BH):
  51.             try:
  52.                 block_color = BLOCKS[world[y + ry][x + rx]][1]
  53.                 pygame.draw.rect(screen, block_color, (x * BW, SH - (y + 1) * BH, BW, BH))
  54.             except IndexError:
  55.                 pass  # This pass handles cases where the block is out of the world's range
  56.     pygame.display.flip()
  57. pygame.quit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-14 20:52:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-15 03:32:14 | 显示全部楼层

ry = WH - SH // BH
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-15 17:29:57 | 显示全部楼层

所以有用吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-17 06:18:12 | 显示全部楼层

你是不会自己运行一下还是怎么回事?!!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-17 06:20:46 | 显示全部楼层

你真的是有点搞笑!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-17 06:23:42 | 显示全部楼层
本帖最后由 小甲鱼的二师兄 于 2024-4-17 06:26 编辑
rt,ai 说 58 行应该是 SH - (y + 1) * BH(已经在代码里加上了),但这样造成的结果是少一行黑边,并没有让黑边消失

告诉你把它改成 ry = WH - SH // BH 就可以了,还问什么 “所以有用吗?”

这不废话嘛?没用告诉你搞毛线?!

有没有用自己不会试一下吗?

这就是你求助的态度?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-17 06:25:18 | 显示全部楼层
本帖最后由 小甲鱼的二师兄 于 2024-4-17 06:26 编辑

1SsQ0vS5L2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-17 17:44:40 | 显示全部楼层
小甲鱼的二师兄 发表于 2024-4-17 06:23
告诉你把它改成 ry = WH - SH // BH 就可以了,还问什么 “所以有用吗?”

这不废话嘛?没用告诉你搞 ...


抱歉,我的意思是我只改了那一行问题还在,但全改就不在了

是我没搞清楚,没有实际运行,见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-17 19:28:16 | 显示全部楼层
歌者文明清理员 发表于 2024-4-17 17:44
抱歉,我的意思是我只改了那一行问题还在,但全改就不在了

是我没搞清楚,没有实际运行,见谅

我以为你自己试都不试,误会!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-21 21:31:21 | 显示全部楼层
看得出来楼上还挺暴躁的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 00:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表