简体   繁体   English

在Android中使用统一C#进行回合制游戏

[英]Turn Based Game in unity C# in android

Good Day! 美好的一天! I have this code but I have an error, for example (I set two players me, and 1 computer). 我有此代码,但有一个错误,例如(我设置了两个播放器,以及一台计算机)。 I take the first turn, and the dice respawn with a value of 4 (just an example), the game piece then move from 1st to 4th tile when I touch the screen, when computer turns, it also move from 1st to 4th tile (because I set the result to 4 just an example). 我先走一圈,然后骰子以4的值重生(仅作为示例),然后当我触摸屏幕时,游戏棋子从1st移到4th磁砖,当计算机转动时,它也从1st移到4th磁砖(因为我将结果设置为4仅作为示例)。 Now its my turn again, the dice never respawn and it doesn't wait to touch the screen if (Input.GetMouseButtonDown(0)) and move again by 4... 现在轮到我了,骰子再也不会重生, if (Input.GetMouseButtonDown(0))并再次移动4则它也不会等待触摸屏幕...

public class singlePlay : MonoBehaviour {
    //Player 
    public GameObject[] playerprefab;

    //Player Clone
    public GameObject[] playerprefabC;

    //Game Cards and Dice
    public GameObject[] situationCard;
    public GameObject dice;
    int diceresult;

    //Game Cards and Dice clone
    public GameObject diceclone;

    public int currentPlayer;
    public int compPlayer;
    public int playerTurn;
    public string compPlayerstring;
    public string playerTurnstring;

    //GUI Boolean
    bool play = false;

    //Game Boolean
    bool pieces = false;
    bool giveturn = false;
    bool myturn = false;
    bool diceSpawn = false;
    bool moving = false;
    bool routine = false;
    bool checking = false;  
    bool compturn = false;
    //icon1
    public GameObject[] icon;

    //population
    int[] population = new int[3];

    //Tile
    public GameObject[] Tile;
    int[] playerTile = new int[3]; //current location
    int[] playerTileUp = new int [3]; // updated location after dice roll

    bool endTurn = false;

    void Update () 
    {
        if (giveturn == true) {
            int h = 0;
            Giveturn(h);
            giveturn = false;
        }

        if (play == true) {

            if (pieces == true){
                SpawnPlayer();
                pieces = false;
            }

            if (myturn == true){
                compturn = false;
                if(diceSpawn == true) {
                    dice.transform.position = new Vector3(0,0,-1);
                    diceclone = Instantiate(dice, dice.transform.position, Quaternion.identity) as GameObject;
                    diceSpawn = false;
                }
                if (Input.GetMouseButtonDown(0))
                {
                    Debug.Log("click");
                    diceresult = 4;
                    Destroy(diceclone);
                    moving = true;
                    Updateposition(diceresult);
                }
            }
            else
            {
                Debug.Log("comp");
                myturn = false;
                diceresult = 4;
                moving = true;
                Updateposition(diceresult);
            }
        }
    }

    void Giveturn(int k) 
    {
        Debug.Log("" + k);
        currentPlayer = k;
        if (k == playerTurn) {
            Debug.Log("Yes");
            compturn = false;
            myturn = true;
            diceSpawn = true;
            moving = false;
        }
        else 
        {
            Debug.Log("No");
            compturn = true;
            myturn = false;
            moving = false;
        }
    }

    void Updateposition(int diceresult) 
    {
        if (moving == true) {
            playerTileUp[currentPlayer] = playerTile[currentPlayer] + diceresult;
            Debug.Log("" + playerTileUp[currentPlayer]+ " " +currentPlayer);
            routine = true;
            StartCoroutine(MyMethod()); 
        }
        moving = false;
    }

    IEnumerator MyMethod() 
    {
        if (routine == true) {
            if (myturn == true) {
                compturn = false;
            }
            else
            {
                myturn = false;
            }

            int f = playerTile[currentPlayer] + 1;
            Debug.Log(" " + currentPlayer );

            while (f <= playerTileUp[currentPlayer]) {
                Debug.Log("waiting");
                yield return new WaitForSeconds(1);
                Debug.Log(" " + Tile[f]);
                playerprefabC[currentPlayer].transform.position =  Tile[f].transform.position;
                Debug.Log(" " + currentPlayer);
                f++;
            }
            checking = true;
            TrapCheck();
        }
        routine = false;
    }

    void TrapCheck()
    {
        if (checking == true) {
            if (playerTileUp[currentPlayer] == 8) {
                Debug.Log("Trap spawning");
                Instantiate(situationCard[0], situationCard[0].transform.position, Quaternion.identity);
                population[currentPlayer] = population[currentPlayer] -1;
            }

            playerTile[currentPlayer] = playerTileUp[currentPlayer];
            Endturn();
            myturn = false;
            compturn = false;
            checking = false;
        }
    }

    void Endturn()
    {
        currentPlayer++;
        Debug.Log(" " + currentPlayer);
        if (currentPlayer > compPlayer) {
            currentPlayer = 0;
        }
        Giveturn(currentPlayer);
    }   
}

There are few things that I could see wrong there already. 在那儿我几乎看不到什么错了。 First while the coroutine is running, it seems you are not preventing the update from running since play remains true. 首先,协程正在运行时,由于播放仍为真,因此您似乎并没有阻止更新运行。 In TrapCheck, you call EndTurn which call GiveTurn and sets myTurn (true) and compTurn (false) booleans. 在TrapCheck中,您调用EndTurn,后者调用GiveTurn并设置myTurn(true)和compTurn(false)布尔值。 But those two are reset in TrapCheck, myTurn is set back to false. 但是在TrapCheck中将这两个重置,将myTurn设置回false。 You need to rethink the logic of your class. 您需要重新考虑班级的逻辑。

A solution would be to use delegate. 一种解决方案是使用委托。 This would remove many of your boolean that you set and reset. 这将删除您设置和重置的许多布尔值。 Here is a basic idea: 这是一个基本思路:

Action currentUpdate;
bool playerTurn = true;
void Start(){
    SetTurn();
}
void Update(){
    if(currentUpdate != null)currentUpdate();
}
void SetTurn(){
    // Prepare initial setting for moving
    if(playerTurn == true){ currentUpdate = PlayerTurn; } 
    else{ currentUpdate = CompTurn; } 
    playerTurn = !playerTurn;
}

void PlayerTurn(){
    // Check input
    // Get dice value
    currentUpdate = Move;
}

void CompTurn(){
    // Get dice value
    currentUpdate = Move;
}

void Move(){
    if(position != target){

    }else{
        SetTurn();
    }
}

This is fairly simplified but once you get the thing about delegate (maybe you already know), this will make it all so much more flexible. 这是相当简化的,但是一旦您掌握了委托的知识(也许您已经知道),这将使一切变得更加灵活。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM