编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
 随机地图生成器
指数 -> 编程,Python. -> Python提交
查看上一个主题 可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
raknarg.




邮政发布: 星期四2014年8月02日星期日8:35  帖子主题:随机地图生成器

我决定自己的新帖子。

它导致与我以前的程序相同,但现在它迭代而不是递归地执行任务。在小深度上,没有明显的差异。在9中,新版本大约是速度左右。在深度10时,它是快速的两倍。

使用新版本,它在数学上找到每个点,而无需每次生成新的阵列,并在数组中进行大量的值交换。

如前所述,使用pygame。也如以前,整洁的结果。


有没有人有关于在定制大小的地图上有想法?我可以制作一个巨大的地图,基本上是裁剪,但这似乎是不必要的。

Python:

__未来__ 进口 division
随机的 进口 Randint, 随机的
进口 数学
进口 pygame
进口 SYS.

#如果n +修饰符超出范围,它会生成它应该在的索引(否则它永远不会得到正确的号码).
def 摩擦 (n,修饰符,maxval):
    如果 n+modifier < 0:
        返回 修改器 - 1
    el n+modifier > maxVal:
        返回 modifier
    别的:
        返回 n + modifier
#生成随机实值
def randreal(迷你,maxval.):
    返回 (最大限度val-minval.) * 随机的() + minVal
#围绕着点围绕角落的平均值
"
X 。 X
。 Ø。
X 。 X
"

def 正方形 (i,j,minval,maxval,r,Currentsize,CurrentMap):
    返回 圆形的((最大限度val, 最大限度(小瓦, (当前图[I-Currentsize.][j-currentsize.] + currentMap[I-Currentsize.][j +快速化] + currentMap[我+快速化][j-currentsize.] + currentMap[我+快速化][j +快速化]) / 4 + (兰德利亚(-R,R.) * (最大限度val-minval.)))))
#围绕相邻点的平均值。
"
。 X 。
x o x
。 X 。
"

def 钻石 (i,j,minval,maxval,r,Currentsize,CurrentMap):
    返回 圆形的((最大限度val, 最大限度(小瓦, (当前图[i][摩擦(j,-currentsize, Len.(当前图)-1)] + currentMap[i][摩擦(j,快速化, Len.(当前图)-1)] + currentMap[摩擦(我, - 血统, Len.(当前图)-1)][j] + currentMap[摩擦(我,潮流, Len.(当前图)-1)][j]) / 4 + (兰德利亚(-R,R.) * (最大限度val-minval.)))))

#生成一个随机的(2**depth)+1 x (2**depth)+1 map
def generate_map. (小型,maxval,r,深度):
    size = (2**深度+ 1)
    newMap = [[“空的” 为了 j 范围(尺寸)] 为了 i 范围(尺寸)]

    #前四个角总是很难编码
    newMap[0][0] = randreal(迷你,maxval.)
    newMap[0][尺寸-1] = randreal(迷你,maxval.)
    newMap[尺寸-1][0] = randreal(迷你,maxval.)
    newMap[尺寸-1][尺寸-1] = randreal(迷你,maxval.)


    为了 n 范围(深度+1)[::-1]:
        如果 n == 0:
            休息

        #无法想到它的好名字
        currentSize = (2** n +1) // 2

        #需要在每个步骤进行钻石和方形算法
        为了 重复 范围(2):
            为了 i 范围(尺寸):
                为了 j 范围(尺寸):
                    #Square算法
                    如果 重复==. 0:
                        #this公式确保它总是得到一个谁的角落(at a range) are already filled
                        如果 ((一世%(2** n)+1) ==. currentSize+1 (j%(2** n)+1) ==. currentSize+1) 纽马图[i][j] ==. “空的”:
                            newMap[i][j] = square(i,j,minval,maxval,r,currentsize,newmap)
                    #钻石算法
                    如果 重复==. 1:
                        #this公式可确保它始终得到一个相邻点的点(at a range) are already filled
                        如果 (一世%(2** n) %Currentsize ==. 0 j%(2** n) %Currentsize ==. 0) 纽马图[i][j] ==. “空的”:
                            newMap[i][j] = diamond(i,j,minval,maxval,r,currentsize,newmap)
    返回纽马图

def scaler(, 最大限度,n):
    返回 (n)/(最大限度-)
#给出了一个数字和范围的颜色
def colour(n,r):
    scale = scaler(r[0],R.[1],n)
    # 火
    如果 scale <= 0.25:
        返回 (缩放者(0, 0.25, 规模)*255, 0, 0)
    el scale <= 0.5:
        返回 (255,scaler.(0.25, 0.5, 规模)*128, 0)
    el scale <= 0.75:
        返回 (255, 127 + scaler(0.5, 0.75, 规模)*128,0)
    el scale <= 1:
        返回 (255, 255,scaler.(0.75, 1, 规模)*255)
   

班级 MapGenerator(目的):
    def __在里面__(自己,小型,maxval,r,深度):
        # 显示设置
        自己.宽度 = 700
        自己.高度 = 700
        自己.屏幕 = pygame.展示.设置模式((自己.宽度, 自己.高度),pygame。双方)

        自己.范围 = (迷你,maxval.)
        自己.随机的map. = generate_map(小型,maxval,r,深度)

    def run(自己):

        scalex = 自己.宽度 / Len.(自己.随机的map.)
        scaley = 自己.高度 / Len.(自己.随机的map.)
       
        为了 i 范围(Len.(自己.随机的map.)):
            为了 j 范围(Len.(自己.随机的map.)):
                pygame..(自己.屏幕, 颜色(自己.随机的map.[i][j], 自己.范围),pygame。(数学.地面(我* scalex.), 数学.地面(j * scaley.), 数学.CEIL.(标准), 数学.CEIL.(scale)))
                #pygame.draw.line.line.(self.screen, colour(self.randommap [i] [j],self.range),[i * 2,j * 2],[i * 2,j * 2 + 1])
                #pygame.draw.line.line.(self.screen, colour(self.randommap [i] [j],self.range),[i * 2 + 1,j * 2],[i * 2 + 1,j * 2 + 1])
        pygame.展示.翻动()
       
        running = 真的
        尽管 running:
            event = pygame.事件.等待()
            如果 event.类型 ==. pygame.辞职:
                running = 错误的
            别的:
                经过
#min,max,随机性,深度级别(2**n-1 squares wide)。更高的R表示我分形图。
Mapgenerator.(1, 100, 0.25, 8).()
pygame.。辞职()
SYS..出口()
赞助
赞助
赞助
赞助





邮政发布: 2014年1月4日星期六10:43 AM  帖子主题:RE:随机地图生成器

很不错。我可以想象所有的数学和逻辑都令人讨厌
虫子




邮政发布: 2014年1月4日星期六11:49  帖子主题:RE:随机地图生成器

我一直意味着自己实施钻石广场一段时间,但像往常一样,我从来没有到过这件事。到目前为止,我最接近的是2D分形山剪影。
raknarg.




邮政发布: 2014年1月4日星期六8:41 PM  帖子主题:RE:随机地图生成器

@instectoid我一直在努力弄清楚如何长时间做这件事,另一个晚上我刚刚拿出一张纸并被侥幸弄清楚了它。你的意思是中点位移吗?

@smool是的,有点恼火的原因有一些例外情况,我不得不处理我不知道的,但大多数数学种类刚刚来到我身边
虫子




邮政发布: 2014年1月4日星期六晚上9:15  帖子主题:RE:随机地图生成器

http://en.wikipedia.org/wiki/Diamond-square_algorithm

“它是比中点位移算法的三维实现略有更好的算法”

我看到您的函数命名为Diamond和Square并假设,因为这是地图/地形发生器,这是该算法的实现。我不能打扰通过你的代码来了解它是如何相似的,但即使在这种情况下也会上升钻石和方形函数名称是一种令人印象深刻的巧合。
raknarg.




邮政发布: 2014年1月4日星期六9:27 PM  帖子主题:RE:随机地图生成器

不,它是钻石正方形算法,但你提到了“2D分形山剪影”所以我认为你的意思是山的中点位移渲染
虫子




邮政发布: 2014年1月4日星期六10:54 PM  帖子主题:RE:随机地图生成器

哦,是的,我做了其中一个。中点位移。是的。我留意将更多的程序内容添加到它以创建一个完整的场景,但我懒得实际完成它。
从上一个显示帖子:   
   指数 -> 编程,Python. -> Python提交
查看上一个主题 告诉一个朋友可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 7 Posts ]
跳到:   


Style:  
搜索: