1. 程式人生 > >用Unity實現《隨機生成 Tile Based 地圖之——洞穴》中的演算法

用Unity實現《隨機生成 Tile Based 地圖之——洞穴》中的演算法

https://indienova.com/indie-game-development/procedural-content-generation-tile-based-random-cave-map/ 原文地址

只做了初始的部分,改進後由於周圍牆的檢測大了一圈,數組裡判定邊界太麻煩,也沒想到好的方法就懶得寫了。

把程式碼綁在場景中任意物體上,並手動指定cube1和cube2即可, R鍵初始化,F鍵迭代,可修改行數和列數。

僅供大家參考。

2016.8.12重新編輯:

用二維陣列重寫了程式碼,演算法也使用了改進後的,但生成的地圖四周有些不太平整。由於原文寫的比較精簡,經過我對原文以及原網頁JS程式碼的理解只能寫到這樣,供大家參考。


using UnityEngine;
using System.Collections;


public class Script : MonoBehaviour {
public int row = 30;
public int col = 35;
private bool[,] mapArray;
public GameObject cube1, cube2;
GameObject cubes;
    int times;
int a;


void Start () {
cubes = new GameObject ();
mapArray = InitMapArray ();
CreateMap (mapArray);
}


void Update()
{
        if (Input.GetKeyDown (KeyCode.R)) 
{
Button1 ();
}
if (Input.GetKeyDown (KeyCode.F))
{
Button2 ();
}
}


bool[,] InitMapArray()
{
bool[,] array = new bool[row , col];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++) 
{
array [i,j] = Random.Range (0, 100) < 60;
                if (i == 0 || i == row - 1 || j == 0 || j == col - 1)
                {
                    array[i, j] = false;
                }
            }
}


return array;
}


bool[,] SmoothMapArray(bool[,] array)
{
bool[,] newArray = new bool[row , col];
        int count1, count2;
 
for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                count1 = CheckNeighborWalls (array, i, j, 1);
                count2 = CheckNeighborWalls (array, i, j, 2);


if (count1 >= 5 || count2 <= 2) 
{
newArray [i, j] = false;
}
else
{
newArray [i, j] = true;
}


if (i == 0 || i == row - 1 || j == 0 || j == col - 1) 
{
newArray [i, j] = false;
}


               // newArray[i, j] = count1 >= 5 || count2 <= 2 ? true : false;
            }
}
return newArray;
}


int CheckNeighborWalls(bool[,] array, int i, int j ,int t)
{
        int count = 0;


for (int i2 = i - t; i2 < i + t + 1; i2++) 
{
for (int j2 = j - t; j2 < j + t + 1; j2++) 
{
                if (i2 > 0 && i2 < row && j2 >= 0 && j2 < col)
                {
                    if (!array[i2, j2])
                    {
                        count++;
                    }
                }    
            }
}
if (!array[i, j])
count--;
return count;
}


void CreateMap(bool[,] array)
{
for (int i = 0; i < row; i++) 
{
for (int j = 0; j < col; j++)
{
if (!array [i , j])
{
GameObject go = Instantiate (cube1, new Vector3 (i, 1, j), Quaternion.identity)as GameObject;
go.transform.SetParent (cubes.transform);

else
{
GameObject go = Instantiate (cube2, new Vector3 (i, 0, j), Quaternion.identity)as GameObject;
go.transform.SetParent (cubes.transform);
}
}
}
}


public void Button1()
{
        times = 0;
Destroy (cubes);
cubes = new GameObject ();
mapArray = InitMapArray ();
CreateMap (mapArray);
}


public void Button2()
{
if (times < 7) 
{
times++;
Destroy(cubes);
cubes = new GameObject();
mapArray = SmoothMapArray(mapArray);
CreateMap(mapArray);
}
}
}





Image title

相關推薦

Unity實現隨機生成 Tile Based 地圖——洞穴演算法

https://indienova.com/indie-game-development/procedural-content-generation-tile-based-random-cave-map/ 原文地址 只做了初始的部分,改進後由於周圍牆的檢測大了一圈,數組

遞歸隨機生成數字

gpo light com reat 調用 使用 ati log next public static string GetNewMemberCard() { #region 隨機生成數 //stri

C語言實現隨機生成0~100的數

%d http srand signed color span pan ret ios #include <iostream> #include <time.h> int main() { srand((unsigned)time(NUL

Shell腳本批量創建戶並隨機生成密碼

else 腳本 pass 批量創建 密碼 shell腳本 lis 活動 password Shell腳本批量創建用戶並隨機生成密碼 要求:批量創建10個系統賬號oldboy01-oldboy10,並設置生成密碼(密碼不同). 實現腳本: #!/bin/bash #Quest

python實現隨機生成頭像

今天遇到如何給使用者分配隨機頭像的問題,想著要在本地放很多圖片,有點無聊,就找了一些生成頭像的工具。發現gravatar生成影象還不錯,挺好玩的。 1、下面上程式碼 # -*- coding: utf-8 -*- # @Time : 18-11-23 上午10:27 # @Author

實戰:Python實現隨機森林

因為有Scikit-Learn這樣的庫,現在用Python實現任何機器學習演算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但瞭解模型如何訓練和預測對工作仍有幫助。比如:如果效能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們可以向他們解

神奇,幾行Python程式碼實現隨機生成生成優惠券

  生活中我們到處搶優惠券,到處用到優惠券,彷彿一輸入類似“yxune1uaqc5”一串代號的優惠券,立刻感覺撿到大便宜。商家這些優惠券的編碼都是怎麼生成的呢? 學習Python中有不明白推薦加入交流群         &n

實戰:Python實現隨機森林!

因為有 Scikit-Learn 這樣的庫,現在用Python實現任何機器學習演算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但瞭解模型如何訓練和預測對工作仍有幫助。比如:如果效能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們

(c語言版)一個完整的程式,實現隨機生成20個元素的連結串列,快速查詢中間結點的值並顯示

一、分清struct 與typedef struct 方法1: #include <stdio.h> typedef struct{     int a;     int b; }test; //使用typedef 將t

js實現隨機生成1到10的整數

閒話不多說,直接用程式碼解釋: <span style="font-size:18px;"><!DOCTYPE html> <html> <head>

Unity實現AR類爐石傳說遊戲——開發框架(一)

遊戲流程圖 玩家類 每場對戰中有兩個玩家例項 每個玩家擁有: 卡組 牌庫 手牌 場上的英雄 生命值,能量值等屬性 卡組 vector作為容器儲存 vector<Card> CardsCombination; 由

js實現隨機選取10–100之間的10個數字,存入一個數組,並排序

方法一: <!DOCTYPE html> <html><head><meta charset="utf-8"><title>好好學習天天向上</title><script type="text/j

實現四種顏色對地圖的染色

        數學上有個四色原理,對一個地圖而言,可以用四種顏色將地圖染色而且相鄰兩個國家顏色不同,下面使用C語言實現對一個簡單地圖的染色。程式碼如下: #include <stdio.h> char map[7][7]={-1,1,1,1,1,1,0,

R語言隨機生成AR,MA,ARMA,ARIMA模型的命令,畫出acf,pacf圖

set.seed(10);x=rnorm(150)par(mfrow=c(1,2))#一行兩列,兩個圖ts.plot(x);acf(x)set.seed(101);x=NULL;for(i in 1:200)x=c(x,0.5-0.3*i+rnorm(1))#隨機產生數par

JS實現隨機生成十六進位制顏色值的程式碼

                       function getColor(){                           //定義字串變數colorValue存放可以構成十六進位制顏色值的值                           var colorValue="0,1,2,3,

unity使用tiled檔案,將資料unity開啟,可以無限tiled地圖

做遊戲時,先實現遊戲的基本功能,最後可能會用到更多的地圖,對於建立地圖如果有方便的軟體,就更容易了,現在咱們展示一下如何用tiled製造地圖,生成資料庫,然後用unity顯示出地圖。首先會使用的軟體unity,tiled,不懂就先了解一下軟體去吧(不同電腦系統軟體可能有問題,

4.keras實現-->生成式深度學習DeepDream

DeepDream是一種藝術性的影象修改技術,它用到了卷積神經網路學到的表示,DeepDream由Google於2015年釋出。這個演算法與卷積神經網路過濾器視覺化技術幾乎相同,都是反向執行一個卷積神經網路:對卷積神經網路的輸入做梯度上升,以便將卷積神經網路靠頂部的某一層的某個過濾器啟用最大化。但有以下幾個簡

Bingo卡片案例筆記【三】、隨機生成數字並填寫到表格

在前面的步驟中,我們建立生成了html和css檔案。下面我們要通過javascript來隨機生成1~75中的數字並填寫到除“free”以外的所有表格中去。 window.onload=newCard; function newCard(){ //共有24個格子需要填

UnityShader實現圖片的區域遮罩,支援半透明,實現地圖動態上色功能

一個專案,做世界地圖時,希望未開啟的地塊是線稿,新地塊開啟時,做一個上色處理。 想到的方案就是:上了色的彩圖蓋線上稿上,然後用mask 控制彩圖的區域性顯隱。 網上找了一個,可以半透明遮罩的shader:https://www.jianshu.com/p/1d9d439c28fa 要控制不同區塊

Unity中用Cube隨機生成地圖

原文來自 https://blog.csdn.net/u010019717/article/details/72673225 1、通過程式碼來隨機生成地圖,簡單粗暴上程式碼,如果想看更全面的,點選上方連線看原文 // RandomMapMaker.cs using UnityEngi