0

ワールド生成コードに少し問題があります。以下のコードを投稿します:

    #region generate world
    private void genworld()
    {
        string world = tb_value1.Text;
        int worldID = 9999;
        int size = 0;

        int col = 0;
        int row = 0;

        string sql = "SELECT * FROM " + variables.tbl_worlds + " WHERE worlds_name='" + world + "'";
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        MySqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            worldID = int.Parse(reader["worlds_ID"].ToString());
            size = int.Parse(reader["worlds_x"].ToString());
        }
        reader.Dispose();

        if (worldID != 9999)
        {
            addtolog("server", "World " + world + " exists!");

            while (row < size)
            {
                while (col < size)
                {
                    int above = row - 1;
                    int nextto = col - 1;
                    int tileabove = 9999;
                    int tilenextto = 9999;
                    int tile = 9999;


                    if (above >= 0)
                    {
                        string sql2 = "SELECT * FROM " + variables.tbl_tiles + "WHERE tiles_col='" + col + "' AND tiles_row='" + above + "' AND tiles_world='" + worldID + "'";
                        MySqlCommand cmd2 = new MySqlCommand(sql2,connection2);
                        MySqlDataReader reader2 = cmd.ExecuteReader();

                        while (reader2.Read())
                        {
                            if (reader2.IsDBNull(1))
                            {
                                tileabove = int.Parse(reader["tiles_type"].ToString());
                            }
                        }

                        reader2.Dispose();
                    }

                    if (nextto >= 0)
                    {
                        string sql2 = "SELECT * FROM " + variables.tbl_tiles + "WHERE tiles_col='" + nextto + "' AND tiles_row='" + row + "' AND tiles_world='" + worldID + "'";
                        MySqlCommand cmd2 = new MySqlCommand(sql2, connection2);
                        MySqlDataReader reader2 = cmd.ExecuteReader();

                        while (reader2.Read())
                        {
                            if (reader2.IsDBNull(1))
                            {
                                tilenextto = int.Parse(reader["tiles_type"].ToString());
                            }
                        }
                        reader2.Dispose();
                    }

                    if (tile == 9999 && (tileabove == 9999 || tilenextto == 9999))
                    {
                        tile = gentile(10, 10);
                    }
                    if (tile == 9999 && tileabove == 0 && tilenextto == 0)
                    {
                        tile = gentile(200, 10);
                    }
                    if (tile == 9999 && tileabove == 1 && tilenextto == 1)
                    {
                        tile = gentile(10, 200);
                    }
                    if (tile == 9999 && tileabove == 1)
                    {
                        tile = gentile(10, 10000);
                    }
                    if (tile == 9999 && (tileabove == 1 || tilenextto == 1))
                    {
                        tile = gentile(20,80);
                    }


                    string sql4 = "INSERT INTO " + variables.tbl_tiles + " (tiles_ID,tiles_row,tiles_column,tiles_world,tiles_type) VALUES ('','" + row + "','" + col + "','" + worldID + "','" + tile + "')";
                    MySqlCommand cmd3 = new MySqlCommand(sql4, connection2);
                    cmd3.ExecuteNonQuery();

                    col++;
                }
                row++;
                col = 0;
            }

        }
        else
        {
            addtolog("server","World " + world + " does not exist!");
        }
    }
    #endregion

そして異邦人の方法

    #region generate tile
    private int gentile(int grass, int desert)
    {
        int totalchance = grass + desert;

        //addtolog("server","TEST");

        Random random = new Random();
        int number = random.Next(1,totalchance);

        if (number <= grass)
        {
            return 0;
        }
        else if (number <= grass + desert)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    #endregion
    #endregion

これに関する私の問題は、それがすべきではないのに次の行に続くように見えることです。この例:

私の生成コードの例

画像をよく見ると、緑(タイルタイプとして0)と黄色(タイルタイプとして1)が次の行に続いていることがわかりますが、私はそれが上の最後のタイルをチェックしていません前の行...

誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

2
MySqlCommand cmd2 = new MySqlCommand(sql2,connection2);
MySqlDataReader reader2 = cmd.ExecuteReader();

問題が発生しましたか? (コピー&ペーストも悪化させました)それがあなたの問題であると絶対に確信を持って言うことはできませんが、これで問題が解決しないとあなたが言うまで、これ以上掘り下げるつもりはありません.

MySqlCommand cmd2 = new MySqlCommand(sql2,connection2);
MySqlDataReader reader2 = cmd2.ExecuteReader();  //<-- using cmd2 instead

コードレビューの追加。

「世界」をメモリに保持し、最後まですべてのデータベースヒットを回避すると、デバッグがはるかに簡単になります。

このコードは、1 つのことをうまく行うのではなく、すべてのことをうまくやらないため、ReSharper が指摘していなかったら (それを取得してください)、これに気付かなかったでしょう。


簡略化されたコード:

[Test]
public void X()
{
    var tiles = genworld();

    for(int i = 0; i < tiles.Length; i++)
    {
        for(int j = 0; j < tiles[i].Length; j++)
        {
            Console.Write(tiles[i][j]);
        }

        Console.WriteLine();
    }
}

private int[][] genworld(int size = 25)
{
    /* the solution with the database "worked" because it was slow. 
       going in memory will cause this to run faster so you need to
       declare a Random first and use it later.  this approach avoids
       a class-level variable.
    */
    var r = new Random();
    Func<int, int, int> gentile = (grass, desert) =>
                                        {
                                            var number = r.Next(1, grass + desert);
                                            return number < desert ? 1 : 0;
                                        };

    var tiles = new int[size][];

    for (int i = 0; i < size; i++)
    {
        tiles[i] = new int[size];
    }

    for (var row = 0; row < size; row++)
    {
        for (var col = 0; col < size; col++ )
        {
            int tileabove = 9999;
            int tilenextto = 9999;
            int tile = 9999;

            if (row >= 1)
            {
                tileabove = tiles[row - 1][col];
            }

            if (col >= 1)
            {
                tilenextto = tiles[row][col - 1];
            }

            if (tile == 9999 && (tileabove == 9999 || tilenextto == 9999))
            {
                tile = gentile(10, 10);
            }
            if (tile == 9999 && tileabove == 0 && tilenextto == 0)
            {
                tile = gentile(200, 10);
            }
            if (tile == 9999 && tileabove == 1 && tilenextto == 1)
            {
                tile = gentile(10, 200);
            }
            if (tile == 9999 && tileabove == 1)
            {
                tile = gentile(10, 10000);
            }
            if (tile == 9999 && (tileabove == 1 || tilenextto == 1))
            {
                tile = gentile(20, 80);
            }

            tiles[row][col] = tile;
        }
    }

    return tiles;
}
于 2012-08-20T19:25:58.620 に答える