首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视觉棋盘游戏

视觉棋盘游戏
EN

Code Review用户
提问于 2016-11-02 10:11:24
回答 2查看 479关注 0票数 5

视觉棋盘游戏是一个统一的游戏,在这里我创建了一个地图和一个网格。可视化是这样的:

使这段代码显然需要嵌套在循环之类的代码中,但是开发它时,我的态度主要是“随心所欲”,这意味着我现在有了相当混乱的代码。

我已经创建了一个包含我所有代码的类,我相信我需要对我的变量进行一些清理,或者将一些方法转移到其他类中?

代码语言:javascript
复制
using UnityEngine;
using System.Collections;

public class gridInit : MonoBehaviour {

    static int mapWidth = 33;
    static int mapHeight = -27;
    static float tileSizeUnits = 0.333333333333333333333f; this float is cancer, I'm sorry
    public GameObject tile;
    // Use this for initialization
    void Start () {
        GenerateObjects();
        GenerateTileMap();
        Screen.fullScreen = true;  

    }

    void Awake()
    {

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

    }

    bool walkable = false;
    private void GenerateTileMap()
    {
        int tileNumber = 0;
        for (float y = 0; y > mapHeight; y--)
        {
            for (float x = 0; x < mapWidth; x++)
            {
                tile.GetComponent<Renderer>().enabled = false;
                GameObject go = Instantiate(tile, new Vector3(x/3, y/3, -2), Quaternion.identity) as GameObject;
                tileNumber++;
                go.name = "tile" + tileNumber;
                go.tag = "grid";

                RaycastHit2D hit;
                Vector3 fwd = go.transform.TransformDirection(Vector3.forward);
                Debug.DrawRay(go.transform.position, fwd * 50, Color.green);
                hit = Physics2D.Raycast(go.transform.position, fwd, 200);
                if (hit)
                {
                    go.tag = "walkableGrid";
                    Debug.Log("works");
                }         
            }
        }
    }

    public GameObject center;
    public GameObject stair;
    public GameObject corner;
    public GameObject straight;
    public GameObject empty;
    public GameObject stair90;
    public GameObject stair180;
    public GameObject stair270;
    public GameObject corner90;
    public GameObject corner180;
    public GameObject corner270;
    public GameObject straight90;
    public GameObject mainCenter;

    private void GenerateObjects()
    { 
        GameObject[,] map = new GameObject[9, 11] { { empty, center, corner180, stair180, stair180, stair180, stair180, stair180, corner270, center, empty }, { center, center, straight, center, stair270, stair180, stair90, center, straight, center, center }, { straight, corner270, center, corner180, center, center, center, corner270, center, corner180, straight }, { corner, center, straight, center, center, stair180, center, center, straight, center, corner90 }, { stair270, center, center, center, stair270, mainCenter, stair90, center, center, center, stair90 }, { corner270, center, straight, center, center, stair, center, center, straight, center, corner180 }, { straight, corner, center, corner90, center, center, center, corner, center, corner90, straight }, { center, center, straight, center, stair270, stair, stair90, center, straight, center, center }, { empty, center, corner90, stair, stair, stair, stair, stair, corner, center, empty } };
        int tileNumber = 0;

        for(int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 11; j++) 
            {
                GameObject go = Instantiate(map[i,j], new Vector3(j + tileSizeUnits, (i * -1) - tileSizeUnits, 0), map[i,j].transform.rotation) as GameObject;
                tileNumber++;
                go.name = "object" + tileNumber;
                go.tag = "path";
            }   
        }
    }
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2016-11-02 11:01:44

这不是强制性规则,但在camelCase中,类的C#有点奇怪。gridInit应该是GridInit。此外,您可能希望选择一个更好的名称。Init是明确的,但它无助于理解什么将被初始化(然后是这个类的责任)。类不是继承的,所以它也应该是sealed

一致性。有时使用私有来表示private方法,有时则不使用(因为它是默认的)。这样或那样,但不要混淆,否则读者将不得不理解,如果他错过了什么.

使用static int mapWidth = 33;声明一个读/写公共字段。这里没几样东西。您不应该有公共可写字段。公共字段应该是PascalCase。您不需要static,而需要const。对所有这些人来说都是如此。

声明tileSizeUnitsconst float TileSizeUnits = 1.0f / 3;不是更容易吗?

当您想公开类之外的对象时,应该使用只读属性:public GameObject Tile { get; private set; }。我强烈怀疑您是否需要所有这些公共对象(它们不只是实现细节吗?这仅仅是一个工厂的阶级吗?)但我没有看到周围的所有代码,所以我只是猜测。我认为更糟糕的是,您保存了很多对象,而这个类只处理一些初始化代码。对于一个类来说,做的还不够,对于一个方法也做得太多。我认为如果你把它合并成调用代码,你就会更容易读懂代码.

GenerateTileMap()有一些神奇的数字。从它们中生成常量,读者就不需要理解(猜测)它们是什么。

GenerateObjects()中,我不认为需要map对象。2D数组不是最容易读取的东西(特别是在以这种方式初始化时,至少不要让它变成一行)。一个单独的for (在需要时使用整数除法和模数来计算行/列)要容易得多(IMO)。问题(我认为)是,在这里,您正在接收一堆对象,但逻辑在其他地方。

票数 2
EN

Code Review用户

发布于 2016-11-02 11:09:38

@阿德里亚诺·雷佩蒂列出了许多问题,我只有一条简短的评论.

GameObject,

如果没有必要,就不应该使用多维数组。Linq不能和他们一起工作。最好使用交错数组GameObject[][]

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/145912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档