鱼C论坛

 找回密码
 立即注册
查看: 539|回复: 15

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

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

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

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

x
from random import randint, choice
import pygame

# CONSTANTS & VARIABLES #
SS = SW, SH = (1500, 1000) # SCREEN [SIZE / WIDTH / HEIGHT]
BW = BH = 20 # BLOCK [WIDTH / HEIGHT]
WW = 75 # WORLD WIDTH
WH = 72 # WORLD HEIGHT
BLOCKS = [
    # name, color
    ("air", (128, 192, 255)),
    ("grass_land", (128, 255, 192)),
    ("stone", (96, 96, 96)),
]
rx = 0 # render x
ry = 25 # render y
screen = None
world = []

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

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

# MAIN PROGRAM #

initalize()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    screen.fill((0, 0, 0))
    for x in range(0, SW // BW):
        for y in range(0, SH // BH):
            try:
                pygame.draw.rect(screen, BLOCKS[world[y + ry][x + rx]][1], (x * BW, SH - (y + 1) * BH, BW, BH))
            except:
                pass
    pygame.display.flip()
pygame.quit()

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

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

# CONSTANTS & VARIABLES #
SS = SW, SH = (1500, 1000)  # SCREEN [SIZE / WIDTH / HEIGHT]
BW = BH = 20  # BLOCK [WIDTH / HEIGHT]
WW = 75  # WORLD WIDTH
WH = 72  # WORLD HEIGHT
BLOCKS = [
    # name, color
    ("air", (128, 192, 255)),
    ("grass_land", (128, 255, 192)),
    ("stone", (96, 96, 96)),
]
rx = 0  # render x
ry = WH - SH // BH  # Adjusted to start rendering from the bottom of the world matrix
screen = None
world = []

# FUNCTIONS #
def generate_world():  # 生成世界
    world = [[0 for _ in range(WW)] for _ in range(WH)]  # 世界
    h = [0 for _ in range(WW)]  # 各个平面坐标的高度
    for x in range(WW):  # 生成 16 列的世界
        if x == 0:  # 第一列是随机高度
            h[x] = randint(40, 56)
        else:  # 上一列的高度 +1 / 0 / -1
            h[x] = h[x - 1] + choice([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
        for y in range(WH):  # 生成高度
            if y < h[x]:  # 高度低于需要生成的高度,设置为石头
                world[y][x] = 2
            elif y == h[x]:  # 高度等于需要生成的高度,设置为草地
                world[y][x] = 1
            else:  # 高度高于需要生成的高度,设置为空气
                world[y][x] = 0
    return world

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

# MAIN PROGRAM #
initialize()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    screen.fill((0, 0, 0))
    for x in range(SW // BW):
        for y in range(SH // BH):
            try:
                block_color = BLOCKS[world[y + ry][x + rx]][1]
                pygame.draw.rect(screen, block_color, (x * BW, SH - (y + 1) * BH, BW, BH))
            except IndexError:
                pass  # This pass handles cases where the block is out of the world's range
    pygame.display.flip()
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`,如下所示:
for x in range(0, SW // BW):
    for y in range(0, SH // BH):
        try:
            pygame.draw.rect(screen, BLOCKS[world[x][y]], (x * BW, SH - y * BH - BH, BW, BH))
        except:
            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 | 显示全部楼层    本楼为最佳答案   
from random import randint, choice
import pygame

# CONSTANTS & VARIABLES #
SS = SW, SH = (1500, 1000)  # SCREEN [SIZE / WIDTH / HEIGHT]
BW = BH = 20  # BLOCK [WIDTH / HEIGHT]
WW = 75  # WORLD WIDTH
WH = 72  # WORLD HEIGHT
BLOCKS = [
    # name, color
    ("air", (128, 192, 255)),
    ("grass_land", (128, 255, 192)),
    ("stone", (96, 96, 96)),
]
rx = 0  # render x
ry = WH - SH // BH  # Adjusted to start rendering from the bottom of the world matrix
screen = None
world = []

# FUNCTIONS #
def generate_world():  # 生成世界
    world = [[0 for _ in range(WW)] for _ in range(WH)]  # 世界
    h = [0 for _ in range(WW)]  # 各个平面坐标的高度
    for x in range(WW):  # 生成 16 列的世界
        if x == 0:  # 第一列是随机高度
            h[x] = randint(40, 56)
        else:  # 上一列的高度 +1 / 0 / -1
            h[x] = h[x - 1] + choice([-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
        for y in range(WH):  # 生成高度
            if y < h[x]:  # 高度低于需要生成的高度,设置为石头
                world[y][x] = 2
            elif y == h[x]:  # 高度等于需要生成的高度,设置为草地
                world[y][x] = 1
            else:  # 高度高于需要生成的高度,设置为空气
                world[y][x] = 0
    return world

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

# MAIN PROGRAM #
initialize()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    screen.fill((0, 0, 0))
    for x in range(SW // BW):
        for y in range(SH // BH):
            try:
                block_color = BLOCKS[world[y + ry][x + rx]][1]
                pygame.draw.rect(screen, block_color, (x * BW, SH - (y + 1) * BH, BW, BH))
            except IndexError:
                pass  # This pass handles cases where the block is out of the world's range
    pygame.display.flip()
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
回复 支持 反对

使用道具 举报

发表于 2024-6-3 22:33:26 From FishC Mobile | 显示全部楼层
同上,不过这么说确实很容易被误会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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