Exemple #1
0
    void cpuTurn()
    {
        // 타일을 랜덤으로 하나 가져오는 경우
        if (d_gamescene.white_tile.Count() == 1 && d_gamescene.black_tile.Count() == 1)
        {
        }
        else if (d_gamescene.black_tile.Count() == 1)
        {
            d_gamescene.player_turn = 2;
            take_tile.w_take();
            d_gamescene.player_turn = 1;
        }
        else if (d_gamescene.white_tile.Count() == 1)
        {
            d_gamescene.player_turn = 2;
            take_tile.b_take();
            d_gamescene.player_turn = 1;
        }
        else
        {
            int rn = Random.Range(0, 2);
            d_gamescene.player_turn = 2;
            if (rn == 0)
            {
                take_tile.w_take();
            }
            else
            {
                take_tile.b_take();
            }
            d_gamescene.player_turn = 1;
        }
        // CPU의 AI를 만들어야 합니다.

        /* 대안 0
         * 그냥 무조건 1개 성공하고 턴넘기는지 안넘기는지만 체크하기
         */

        /*
         * while (true)
         * {
         *  while (true)
         *  {
         *      int oo = Random.Range(0, d_gamescene.p1_count + 1);
         *
         *      if (d_gamescene.p1_tile_state[oo] % 2 == 1)
         *      {
         *          d_gamescene.p1_tile_state[oo]++;
         *          break;
         *      }
         *  }
         *  d_gamescene.cpucnt = 1;
         *  }
         *  int over = Random.Range(0, 2);
         *
         *  if (over == 0)
         *  {
         *      d_gamescene.p2_tile_state[d_gamescene.turnidx]++;
         *      if (d_gamescene.turncolor == 3) d_gamescene.p2_bcount--;
         *      else d_gamescene.p2_wcount--;
         *      d_gamescene.cpu_oorc = false;
         *      break;
         *  }
         *  else
         *  {
         *      d_gamescene.cpu_oorc = true;
         *      break;
         *  }
         * }
         */

        /* 대안 1
         * 전체 타일 개수는 28개이며 그 중 자신의 타일 개수+상대의 밝혀진 타일 개수를 제외한 나머지 타일의 숫자를 체크합니다.
         * 전체 개수 - 자신의 타일 개수+상대의 밝혀진 타일 개수를 A라 칭하면,
         * 랜덤으로 1~28까지의 숫자를 내보낸 후, 그 숫자가 A보다 클 경우에는 CPU가 타일을 맞춘 것으로 체크하여 진행합니다.
         */
        /*
         * while (true)
         * {
         *  int ox = Random.Range(1, 29);
         *  int A = 28 - d_gamescene.p2_count - (d_gamescene.p1_count - d_gamescene.p1_wcount - d_gamescene.p1_bcount);
         *
         *  if (ox > A)
         *  {
         *      while (true)
         *      {
         *          int oo = Random.Range(0, d_gamescene.p1_count + 1);
         *
         *          if (d_gamescene.p1_tile_state[oo] % 2 == 1)
         *          {
         *              d_gamescene.p1_tile_state[oo]++;
         *              break;
         *          }
         *      }
         *      d_gamescene.cpucnt++;
         *  }
         *  else
         *  {
         *      d_gamescene.p2_tile_state[d_gamescene.turnidx]++;
         *      if (d_gamescene.turncolor == 3) d_gamescene.p2_bcount--;
         *      else d_gamescene.p2_wcount--;
         *      d_gamescene.cpu_oorc = false;
         *      break;
         *  }
         *
         *  if (ox % 2 == 0)
         *  {
         *      d_gamescene.cpu_oorc = true;
         *      break;
         *  }
         * }
         */

        /* 대안 2
         * 대안 1과 동일하나, 대안 1에서 CPU가 이길 확률이 꽤 낮다는 생각이 들어 CPU가 못 맞추고 턴을 종료한 턴의 횟수를 세어 그마다 CPU가 맞출 확률을 높여주었습니다.
         */


        int count_check = 0;

        while (true)
        {
            int ox = Random.Range(1, 29);
            int A  = 28 - d_gamescene.p2_count - (d_gamescene.p1_count - d_gamescene.p1_wcount - d_gamescene.p1_bcount) - (d_gamescene.cpu_notO * 2);


            if (ox > A)
            {
                while (true)
                {
                    int oo = Random.Range(0, d_gamescene.p1_count + 1);

                    if (d_gamescene.p1_tile_state[oo] % 2 == 1)
                    {
                        d_gamescene.p1_tile_state[oo]++;
                        break;
                    }
                }
                count_check++;
                d_gamescene.cpucnt++;
            }
            else
            {
                d_gamescene.p2_tile_state[d_gamescene.turnidx]++;
                if (d_gamescene.turncolor == 3)
                {
                    d_gamescene.p2_bcount--;
                }
                else
                {
                    d_gamescene.p2_wcount--;
                }
                d_gamescene.cpu_oorc = false;

                if (count_check == 0)
                {
                    d_gamescene.cpu_notO++;                         // cpu가 1개의 타일도 맞추지 못하고 턴이 넘어갈 경우, cpu가 맞출 확률을 조금 높여줌
                }
                break;
            }

            if (ox % 2 == 0)
            {
                d_gamescene.cpu_oorc = true;
                break;
            }
        }

        /* 추가 보정안
         * 앞 타일들부터 체크해 밝혀진 타일의 숫자를 저장해둔 뒤,
         * 다음 밝혀진 타일까지의 사이의 타일 개수와 다음 밝혀진 타일의 숫자를 비교해 사이 숫자가 타이트하게 맞으면 (색상까지)
         * 그 사이의 타일들은 전부다 맞출 수 있게 합니다.
         */

        // 아직 미구현
    }
Exemple #2
0
    // Update is called once per frame
    void Update()
    {
        // 1플레이어의 턴일 때, 해당 플레이어가 가진 색상별 타일의 개수를 보여줌
        if (d_gamescene.player_turn == 1)
        {
            White_num.GetComponent <Text>().text = "x " + d_gamescene.p1_wcount;
            Black_num.GetComponent <Text>().text = "x " + d_gamescene.p1_bcount;
        }
        // 2플레이어의 턴일 때, 해당 플레이어가 가진 색상별 타일의 개수를 보여줌
        else
        {
            White_num.GetComponent <Text>().text = "x " + d_gamescene.p2_wcount;
            Black_num.GetComponent <Text>().text = "x " + d_gamescene.p2_bcount;
        }

        // 게임 시작 전 각 플레이어가 타일 4장을 뽑는 단계
        if (d_gamescene.game_state == 0)
        {
            // 시작 전 1Player 차례
            if (d_gamescene.player_turn == 1)
            {
                take_tile_txt.GetComponent <Text>().text = "Player 1의 차례 입니다\n 숫자 타일을 4장 골라주세요";
                if (d_gamescene.p1_count == 4)
                {
                    d_gamescene.player_turn = 2;
                }
            }
            // 2P 모드 시작 전 2Player 차례
            else if (d_gamescene.game_mode == 2)
            {
                take_tile_txt.GetComponent <Text>().text = "Player 2의 차례 입니다\n 숫자 타일을 4장 골라주세요";
                if (d_gamescene.p2_count == 4)
                {
                    d_gamescene.game_state  = 1;
                    d_gamescene.player_turn = 1;
                }
            }
            // 1P 모드 시작 전 CPU 자동 진행
            else
            {
                // 카드 4장 랜덤 입력
                d_gamescene.player_turn = 2;
                for (int i = 0; i < 4; i++)
                {
                    int ran_num = Random.Range(0, 2);
                    if (ran_num == 0)
                    {
                        take_tile.w_take();
                    }
                    else
                    {
                        take_tile.b_take();
                    }
                }
                d_gamescene.player_turn = 1;

                d_gamescene.game_state = 1;
            }
        }

        // 게임 시작 후 플레이어가 턴을 시작하고 나서 처음 타일 1장을 뽑는 단계
        else if (d_gamescene.game_state == 1)
        {
            // 시작 후 1Player 차례
            if (d_gamescene.player_turn == 1)
            {
                take_tile_txt.GetComponent <Text>().text = "Player 1의 차례 입니다\n 숫자 타일을 1장 골라주세요";
            }
            // 2P 모드 시작 후 2Player 차례
            else if (d_gamescene.game_mode == 2)
            {
                take_tile_txt.GetComponent <Text>().text = "Player 2의 차례 입니다\n 숫자 타일을 1장 골라주세요";
            }
        }
    }