使用瓷砖的随机城市街道生成

时间:2014-07-26 16:04:05

标签: c# unity3d procedural

我正在尝试建立一个由瓷砖制成的随机城市,到目前为止,我可以建立一个阵列,设置城市边缘,放置一个随机的建筑物,如教堂或工厂,并可以放置随机旋转的瓷砖区域。

但我需要的是某种算法或例程,通过选择合适的瓷砖并以正确的方式旋转它来创建一个互联的迷宫般的街道,以便不会以某种方式无法到达的区域。< / p>

我拥有的瓷砖是 - 特色瓷砖(如教堂或工厂) 直路 丁字路口 十字路口 左角 向右转 平方/迂回/庭院

我已经找到了大量基于地下城的例子,但是在使用固定的瓷砖和在设定区域内匹配/旋转时,没有任何内容可以说是10个瓷砖×10个瓷砖。

任何脚本提示都会非常受欢迎,因为我会绕圈子制作非常复杂的循环功能,但仍然无效

到目前为止的代码 -

public GameObject playerPrefab;
public GameObject cullGroup;
public GameObject cullPrefab;

//tile objects
public List<GameObject> _grid = new List<GameObject>();         //general buildings
public List<GameObject> _industrial = new List<GameObject>();   //industrial
public List<GameObject> _feature = new List<GameObject>();      //city feature
public List<GameObject> _largeSpecial = new List<GameObject>(); //large special building
public List<GameObject> _smallSpecial = new List<GameObject>(); //large special building
public List<GameObject> _docks = new List<GameObject>();        //docks
public List<GameObject> _roads = new List<GameObject>();        //outgoing roads
public List<GameObject> _edge = new List<GameObject>();         //city edge

public Vector2 citySize = new Vector2(10,10);       //how many tiles in total
private int[] tileRoatation = new int[5] {0,90,180,270,0};
private int[,,] _cityMap;
private int mapType = 0;

//ingress vars
public int[,] roadIngress;

//feature vars
private int _tmpFeature;
private Vector2 _tmpPlacement;

//special vars
private int _tmpFeature1;
private Vector2 _tmpPlacement1;

//docks vars
private Vector2 _tmpDock;
private string _strDock;
private float _xAdjustment;
private float _zAdjustment;

//industrial vars
private Vector2 _indSector;
private int _indTotal = 0;

// Use this for initialization
void Start () 
{
    _cityMap = new int[(int)citySize.x, (int)citySize.y, 2];

    CreateMap();
}

// Update is called once per frame
void Update () 
{

}

void CreateMap()
{
    //calc roads into city
    RoadIngress();

    //calc feature
    Features();

    //calculate tile adjustment from center
    _xAdjustment = (_grid[0].transform.localScale.x * (citySize.x / 2) - (_grid[0].transform.localScale.x)/2);
    _zAdjustment = (_grid[0].transform.localScale.z * (citySize.y / 2) - (_grid[0].transform.localScale.x)/2);

    //place tiles
    for(int z = 0; z < citySize.y; z++)
    {
        for(int x = 0; x < citySize.x; x++)
        {
            //instantiate tile
            int tmpRot = tileRoatation[Random.Range(0,5)];
            GameObject go = Instantiate(_grid[Random.Range(0, _grid.Count-1)], 
                                        new Vector3(
                        (x * _grid[0].transform.localScale.x) - _xAdjustment, 
                        0 , 
                        (z * _grid[0].transform.localScale.z) -  _zAdjustment), 
                        Quaternion.Euler(0,tmpRot, 0)
                ) as GameObject;

            _cityMap[x ,z ,1 ] = 1;;
            _cityMap[x ,z ,0 ] = tmpRot;;
            go.name = x +"/"+z;
            go.transform.parent = this.transform;

            //instantiate culling areas
            /*
            GameObject go2 = Instantiate(cullPrefab, 
                                         new Vector3(
                (x * _grid[0].transform.localScale.x) - _xAdjustment, 
                0 , 
                (z * _grid[0].transform.localScale.z) -  _zAdjustment), 
                                         Quaternion.Euler(0,0, 0)
                                         ) as GameObject;
            go2.name = x +"/"+z;
            go2.transform.parent = cullGroup.transform;
            go2.transform.localScale = new Vector3(51, 20, 51);
            */

            //set map edges
            if(x == 0 || z == 0 || x == citySize.x-1 || z == citySize.y-1 )
            {
                //does map have beach
                if(mapType == 1 && z == 0)
                {
                    go.GetComponent<MeshRenderer>().material.color = Color.blue;
                }else if(roadIngress[x,z] == 1){
                    //set exit roads
                        go.SetActive(false);
                        GameObject rp = Instantiate(_roads[0], new Vector3(go.transform.position.x, 0 ,go.transform.position.z), Quaternion.Euler(0, 0, 0)) as GameObject;
                        rp.name = go.name;
                        rp.transform.parent = this.transform;
                        //go.name = "disabled";

                        //extend road
                }else{
                    //go.GetComponent<MeshRenderer>().material.color = Color.green;
                    int tmpRot1 = tileRoatation[Random.Range(0,5)];
                    go.SetActive(false);
                    GameObject ep = Instantiate(_edge[Random.Range(0, _edge.Count-1)], new Vector3(go.transform.position.x, 0 ,go.transform.position.z), Quaternion.Euler(0, tmpRot, 0)) as GameObject;
                    ep.name = go.name;
                    ep.transform.parent = this.transform;

                    go.name = "disabled";
                }

            }
        }
    }

    Debug.Log((citySize.x * citySize.y) * 0.1f);
    Industrial();
    Industrial();
    Debug.Log(_indTotal);
    if(citySize.x <((citySize.x * citySize.y) * 0.2f))
        Industrial();

    PlaceFeature();
    PlaceLargeSpecial();

    //docks
    if(mapType == 1)
    {
        //go.GetComponent<MeshRenderer>().material.color = Color.red;
        _tmpDock = new Vector2(Random.Range(1,citySize.y-1),0);
        //_strDock = _tmpDock.x +"/"+_tmpDock.y;

    }

    PlaceDocks();

    // spawn player
    Instantiate(playerPrefab, new Vector3(0,2,0),Quaternion.identity);
}


//set roads leaving city
void RoadIngress()
{
    //set roads leaving city
    roadIngress = new int[(int)citySize.x, (int)citySize.y];
    roadIngress[(int)Random.Range(1,citySize.x-1), 0] = 1;                  //east road or dock
    roadIngress[0, (int)Random.Range(1,citySize.y-1)] = 1;                  //south road
    roadIngress[(int)Random.Range(1,citySize.x-1), (int)citySize.y-1] = 1;  //west road
    roadIngress[(int)citySize.x-1, (int)Random.Range(1,citySize.y-1)] = 1;  //north road
}

// choose main feature
void Features()
{
    //choose main feature and placement
    _tmpFeature = Random.Range(0,4);// 5x feature tiles
    _tmpPlacement = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2));

    //choose special large building and placement
    _tmpFeature1 = Random.Range(0,4);// 5x feature tiles
    _tmpPlacement1 = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2));
    if(_tmpPlacement1 == _tmpPlacement)
    {
        _tmpPlacement1.x = _tmpPlacement1.x + 4;
        if(_tmpPlacement1.x > citySize.x-2)
            _tmpPlacement1.x -= citySize.x;
        _tmpPlacement1.y = _tmpPlacement1.y + 4;
        if(_tmpPlacement1.y > citySize.y-2)
            _tmpPlacement1.y -= citySize.y;
    }
}

//place feature
void PlaceFeature()
{

    int tmpRot1 = tileRoatation[Random.Range(0,5)];
    GameObject go1 = Instantiate(_feature[Random.Range(0, _feature.Count-1)],
                                 new Vector3((_tmpPlacement.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x *.5f) - _xAdjustment),
                0,
                (_tmpPlacement.y * _grid[0].transform.localScale.z + (_grid[0].transform.localScale.z*.5f) - _zAdjustment)), 
                                 Quaternion.Euler(0,tmpRot1, 0)) as GameObject;

    //clear feature area
    GameObject tp = GameObject.Find(_tmpPlacement.x + "/" + _tmpPlacement.y);
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement.x + "/" + (_tmpPlacement.y+1));
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement.x-1 + "/" + _tmpPlacement.y);
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement.x-1 + "/" + (_tmpPlacement.y+1));
    tp.SetActive(false);
    tp.name = "disabled";
}

//place large special
void PlaceLargeSpecial()
{
    //check distance between feature and large special
    int dist = (int)Vector2.Distance(_tmpPlacement, _tmpPlacement1);

    //if to close move away
    if((int)Vector2.Distance(_tmpPlacement, _tmpPlacement1)<3)
    {
        _tmpPlacement1.x = _tmpPlacement1.x+3;
        if(_tmpPlacement1.x > citySize.x-2)
            _tmpPlacement1.x = 3;
        _tmpPlacement1.y = _tmpPlacement1.y+3;
        if(_tmpPlacement1.y > citySize.y-2)
            _tmpPlacement1.y = 3;
    }

    //Debug.Log(dist);
    int tmpRot2 = tileRoatation[Random.Range(0,5)];
    GameObject go2 = Instantiate(_largeSpecial[Random.Range(0, _largeSpecial.Count-1)],
                                 new Vector3((_tmpPlacement1.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x *.5f) - _xAdjustment),
                0,
                (_tmpPlacement1.y * _grid[0].transform.localScale.z + (_grid[0].transform.localScale.z*.5f)) - _zAdjustment), 
                                 Quaternion.Euler(0,tmpRot2, 0)) as GameObject;

    //clear large special area
    GameObject tp = GameObject.Find(_tmpPlacement1.x + "/" + _tmpPlacement1.y);
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement1.x + "/" + (_tmpPlacement1.y+1));
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement1.x-1 + "/" + _tmpPlacement1.y);
    tp.SetActive(false);
    tp.name = "disabled";
    tp = GameObject.Find(_tmpPlacement1.x-1 + "/" + (_tmpPlacement1.y+1));
    tp.SetActive(false);
    tp.name = "disabled";

}

//place docks
void PlaceDocks()
{
    if(mapType == 1)
    {
        GameObject go3 = Instantiate(_docks[Random.Range(0, _docks.Count-1)],
                                     new Vector3((_tmpDock.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x) - _xAdjustment),
                    0,
                    (_tmpDock.y * _grid[0].transform.localScale.z) - _zAdjustment), 
                                     Quaternion.Euler(0,0, 0)) as GameObject;

        //clear dock area
        /*
        string[] tmp = _strDock.Split("/"[0]);
        int t1 = int.Parse(tmp[0]);
        for(int a=0; a<3; a++)
        {
            GameObject.Find(t1-a + "/" + 0).SetActive(false);
        }
        for(int b=0; b<3; b++)
        {
            GameObject.Find(t1-b + "/" + 1).SetActive(false);
        }
        */
    }
}

//set out industrial area
void Industrial()
{
    //pick random spot industrial area
    _indSector = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2));

    int indSizeX = Random.Range(2,5);
    int indSizeY = Random.Range(2,4);
    _indTotal += (indSizeX*indSizeY);

    //create area
    for(int y = (int)_indSector.y; y < (int)_indSector.y+indSizeY; y++)
    {
        for(int x = (int)_indSector.x; x < (int)_indSector.x+indSizeX; x++)
        {
            //GameObject.Find(x + "/" + y).GetComponent<MeshRenderer>().material.color = Color.magenta;
            GameObject tp = GameObject.Find(x + "/" + y);
            //Debug.Log(x + "/" + y);
            GameObject go4 = Instantiate(_industrial[Random.Range(0, _industrial.Count-1)],
                                             new Vector3(tp.transform.position.x, 0, tp.transform.position.z), Quaternion.Euler(0,0, 0)) as GameObject;
            tp.SetActive(false);
            tp.name = "disabled";
            go4.name = x +"/"+y;
            go4.transform.parent = this.transform;
        }
    }
}

public GameObject playerPrefab; public GameObject cullGroup; public GameObject cullPrefab; //tile objects public List<GameObject> _grid = new List<GameObject>(); //general buildings public List<GameObject> _industrial = new List<GameObject>(); //industrial public List<GameObject> _feature = new List<GameObject>(); //city feature public List<GameObject> _largeSpecial = new List<GameObject>(); //large special building public List<GameObject> _smallSpecial = new List<GameObject>(); //large special building public List<GameObject> _docks = new List<GameObject>(); //docks public List<GameObject> _roads = new List<GameObject>(); //outgoing roads public List<GameObject> _edge = new List<GameObject>(); //city edge public Vector2 citySize = new Vector2(10,10); //how many tiles in total private int[] tileRoatation = new int[5] {0,90,180,270,0}; private int[,,] _cityMap; private int mapType = 0; //ingress vars public int[,] roadIngress; //feature vars private int _tmpFeature; private Vector2 _tmpPlacement; //special vars private int _tmpFeature1; private Vector2 _tmpPlacement1; //docks vars private Vector2 _tmpDock; private string _strDock; private float _xAdjustment; private float _zAdjustment; //industrial vars private Vector2 _indSector; private int _indTotal = 0; // Use this for initialization void Start () { _cityMap = new int[(int)citySize.x, (int)citySize.y, 2]; CreateMap(); } // Update is called once per frame void Update () { } void CreateMap() { //calc roads into city RoadIngress(); //calc feature Features(); //calculate tile adjustment from center _xAdjustment = (_grid[0].transform.localScale.x * (citySize.x / 2) - (_grid[0].transform.localScale.x)/2); _zAdjustment = (_grid[0].transform.localScale.z * (citySize.y / 2) - (_grid[0].transform.localScale.x)/2); //place tiles for(int z = 0; z < citySize.y; z++) { for(int x = 0; x < citySize.x; x++) { //instantiate tile int tmpRot = tileRoatation[Random.Range(0,5)]; GameObject go = Instantiate(_grid[Random.Range(0, _grid.Count-1)], new Vector3( (x * _grid[0].transform.localScale.x) - _xAdjustment, 0 , (z * _grid[0].transform.localScale.z) - _zAdjustment), Quaternion.Euler(0,tmpRot, 0) ) as GameObject; _cityMap[x ,z ,1 ] = 1;; _cityMap[x ,z ,0 ] = tmpRot;; go.name = x +"/"+z; go.transform.parent = this.transform; //instantiate culling areas /* GameObject go2 = Instantiate(cullPrefab, new Vector3( (x * _grid[0].transform.localScale.x) - _xAdjustment, 0 , (z * _grid[0].transform.localScale.z) - _zAdjustment), Quaternion.Euler(0,0, 0) ) as GameObject; go2.name = x +"/"+z; go2.transform.parent = cullGroup.transform; go2.transform.localScale = new Vector3(51, 20, 51); */ //set map edges if(x == 0 || z == 0 || x == citySize.x-1 || z == citySize.y-1 ) { //does map have beach if(mapType == 1 && z == 0) { go.GetComponent<MeshRenderer>().material.color = Color.blue; }else if(roadIngress[x,z] == 1){ //set exit roads go.SetActive(false); GameObject rp = Instantiate(_roads[0], new Vector3(go.transform.position.x, 0 ,go.transform.position.z), Quaternion.Euler(0, 0, 0)) as GameObject; rp.name = go.name; rp.transform.parent = this.transform; //go.name = "disabled"; //extend road }else{ //go.GetComponent<MeshRenderer>().material.color = Color.green; int tmpRot1 = tileRoatation[Random.Range(0,5)]; go.SetActive(false); GameObject ep = Instantiate(_edge[Random.Range(0, _edge.Count-1)], new Vector3(go.transform.position.x, 0 ,go.transform.position.z), Quaternion.Euler(0, tmpRot, 0)) as GameObject; ep.name = go.name; ep.transform.parent = this.transform; go.name = "disabled"; } } } } Debug.Log((citySize.x * citySize.y) * 0.1f); Industrial(); Industrial(); Debug.Log(_indTotal); if(citySize.x <((citySize.x * citySize.y) * 0.2f)) Industrial(); PlaceFeature(); PlaceLargeSpecial(); //docks if(mapType == 1) { //go.GetComponent<MeshRenderer>().material.color = Color.red; _tmpDock = new Vector2(Random.Range(1,citySize.y-1),0); //_strDock = _tmpDock.x +"/"+_tmpDock.y; } PlaceDocks(); // spawn player Instantiate(playerPrefab, new Vector3(0,2,0),Quaternion.identity); } //set roads leaving city void RoadIngress() { //set roads leaving city roadIngress = new int[(int)citySize.x, (int)citySize.y]; roadIngress[(int)Random.Range(1,citySize.x-1), 0] = 1; //east road or dock roadIngress[0, (int)Random.Range(1,citySize.y-1)] = 1; //south road roadIngress[(int)Random.Range(1,citySize.x-1), (int)citySize.y-1] = 1; //west road roadIngress[(int)citySize.x-1, (int)Random.Range(1,citySize.y-1)] = 1; //north road } // choose main feature void Features() { //choose main feature and placement _tmpFeature = Random.Range(0,4);// 5x feature tiles _tmpPlacement = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2)); //choose special large building and placement _tmpFeature1 = Random.Range(0,4);// 5x feature tiles _tmpPlacement1 = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2)); if(_tmpPlacement1 == _tmpPlacement) { _tmpPlacement1.x = _tmpPlacement1.x + 4; if(_tmpPlacement1.x > citySize.x-2) _tmpPlacement1.x -= citySize.x; _tmpPlacement1.y = _tmpPlacement1.y + 4; if(_tmpPlacement1.y > citySize.y-2) _tmpPlacement1.y -= citySize.y; } } //place feature void PlaceFeature() { int tmpRot1 = tileRoatation[Random.Range(0,5)]; GameObject go1 = Instantiate(_feature[Random.Range(0, _feature.Count-1)], new Vector3((_tmpPlacement.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x *.5f) - _xAdjustment), 0, (_tmpPlacement.y * _grid[0].transform.localScale.z + (_grid[0].transform.localScale.z*.5f) - _zAdjustment)), Quaternion.Euler(0,tmpRot1, 0)) as GameObject; //clear feature area GameObject tp = GameObject.Find(_tmpPlacement.x + "/" + _tmpPlacement.y); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement.x + "/" + (_tmpPlacement.y+1)); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement.x-1 + "/" + _tmpPlacement.y); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement.x-1 + "/" + (_tmpPlacement.y+1)); tp.SetActive(false); tp.name = "disabled"; } //place large special void PlaceLargeSpecial() { //check distance between feature and large special int dist = (int)Vector2.Distance(_tmpPlacement, _tmpPlacement1); //if to close move away if((int)Vector2.Distance(_tmpPlacement, _tmpPlacement1)<3) { _tmpPlacement1.x = _tmpPlacement1.x+3; if(_tmpPlacement1.x > citySize.x-2) _tmpPlacement1.x = 3; _tmpPlacement1.y = _tmpPlacement1.y+3; if(_tmpPlacement1.y > citySize.y-2) _tmpPlacement1.y = 3; } //Debug.Log(dist); int tmpRot2 = tileRoatation[Random.Range(0,5)]; GameObject go2 = Instantiate(_largeSpecial[Random.Range(0, _largeSpecial.Count-1)], new Vector3((_tmpPlacement1.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x *.5f) - _xAdjustment), 0, (_tmpPlacement1.y * _grid[0].transform.localScale.z + (_grid[0].transform.localScale.z*.5f)) - _zAdjustment), Quaternion.Euler(0,tmpRot2, 0)) as GameObject; //clear large special area GameObject tp = GameObject.Find(_tmpPlacement1.x + "/" + _tmpPlacement1.y); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement1.x + "/" + (_tmpPlacement1.y+1)); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement1.x-1 + "/" + _tmpPlacement1.y); tp.SetActive(false); tp.name = "disabled"; tp = GameObject.Find(_tmpPlacement1.x-1 + "/" + (_tmpPlacement1.y+1)); tp.SetActive(false); tp.name = "disabled"; } //place docks void PlaceDocks() { if(mapType == 1) { GameObject go3 = Instantiate(_docks[Random.Range(0, _docks.Count-1)], new Vector3((_tmpDock.x * _grid[0].transform.localScale.x - (_grid[0].transform.localScale.x) - _xAdjustment), 0, (_tmpDock.y * _grid[0].transform.localScale.z) - _zAdjustment), Quaternion.Euler(0,0, 0)) as GameObject; //clear dock area /* string[] tmp = _strDock.Split("/"[0]); int t1 = int.Parse(tmp[0]); for(int a=0; a<3; a++) { GameObject.Find(t1-a + "/" + 0).SetActive(false); } for(int b=0; b<3; b++) { GameObject.Find(t1-b + "/" + 1).SetActive(false); } */ } } //set out industrial area void Industrial() { //pick random spot industrial area _indSector = new Vector2((int)Random.Range(2,citySize.x-2),(int)Random.Range(2,citySize.y-2)); int indSizeX = Random.Range(2,5); int indSizeY = Random.Range(2,4); _indTotal += (indSizeX*indSizeY); //create area for(int y = (int)_indSector.y; y < (int)_indSector.y+indSizeY; y++) { for(int x = (int)_indSector.x; x < (int)_indSector.x+indSizeX; x++) { //GameObject.Find(x + "/" + y).GetComponent<MeshRenderer>().material.color = Color.magenta; GameObject tp = GameObject.Find(x + "/" + y); //Debug.Log(x + "/" + y); GameObject go4 = Instantiate(_industrial[Random.Range(0, _industrial.Count-1)], new Vector3(tp.transform.position.x, 0, tp.transform.position.z), Quaternion.Euler(0,0, 0)) as GameObject; tp.SetActive(false); tp.name = "disabled"; go4.name = x +"/"+y; go4.transform.parent = this.transform; } } }

1 个答案:

答案 0 :(得分:0)

您是否可以不使用数组(或多维数组,如果需要)并填充位置然后使用“随机”类从数组中提取这些位置?

像...

s
Random rnd = new Random();
int i;
i = rnd.next(1,5);

Random rnd = new Random();
int i;
i = rnd.next(1,5);

int Positions[] = new Positions[5] {100, 200, 300, 400, 500};
Tilepos1 = Positions[i];
Tilepos2 = Positions[i];
Tilepos3 = Positions[i];
Tilepos4 = Positions[i];
Tilepos5 = Positions[i]; 


//you would have to make up your own Tileposition and figure out how to implement it into your system

//then make sure that the Tilepositions (Tilepos) don´t land on the same place

if (Tilepos1 == Tilepos2)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos3)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos4)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos5)
    {
    Tilepos1 = Positions[i];
    }


 //then just repeat this process with Tilepos 2, 3, 4,`int i;
i = rnd.next(1,5);

int Positions[] = new Positions[5] {100, 200, 300, 400, 500};
Tilepos1 = Positions[i];
Tilepos2 = Positions[i];
Tilepos3 = Positions[i];
Tilepos4 = Positions[i];
Tilepos5 = Positions[i]; 


//you would have to make up your own Tileposition and figure out how to implement it into your system

//then make sure that the Tilepositions (Tilepos) don´t land on the same place

if (Tilepos1 == Tilepos2)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos3)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos4)
    {
    Tilepos1 = Positions[i];
    }
if (Tilepos1 == Tilepos5)
    {
    Tilepos1 = Positions[i];
    }


//then just repeat this process with Tilepos 2, 3, 4, 5

但这只有在瓷砖被平方时才有效,否则你可以用数组来调整一些东西。

我希望它有所帮助,并为您提供了如何做的基本想法:)