[G-POS] 양팔저울문제 PONDOR

LeeWlWL·2023년 2월 25일

개발

목록 보기
1/2

기획 문서

ㅁㄴㅇㄹ

Class Diagram

classDiagram
%%Using UnityEngine.Events

	class GameManager{
		+enum PHASE
		%%0 : 라운드 시작 전, 1 : 플레이어 선택, 2 : 방향 선택, 3 : 결과 계산, 4 : 최종 결과 보여주기
		+int winCounter %% 총 승리 횟수
		+bool endGame %% 게임이 끝났는지 여부
		+bool citizenW %% 시민이 최종 승리했는지 여부
		+List~Player~ players 
		+List~Player~ participants

		+int votingPlayerIndex
		+int round
		+int maxRound
		+List<int> roundGoal %% 라운드 목표 저장하는 list
		+int[] roundPlayerNumber %% 각 라운드 사람 수
		+int roundMinimunNumber = 1 %% 한 쪽에 올라가는 최소 사람 수

		+UnityEvent SetGameInfoStart
		+UnityEvent PlayerSelectionStart
		+UnityEvent DirectionSelectionStart
		+UnityEvent RoundResultStart
		+UnityEvent LastResultStart
		%%RoundResult 결과에 따라 RoundStarted 혹은 RoundEnded로 이동
	}
	%%UnityEvent들에 각자 PhaseManager의 Activate(), Deactivate()등을 작동시킬 수 있는 function을 연결하면 됩니다.
	GameManager : +ReportEndPhase(enum PHASE)
	GameManager : +InitializationRound()
	GameManager : +AddWin() int
	GameManager : +MovetoNextRound() int
	GameManager : +GetAnswer()
	GameManager : +roundGoalInitialization()
	GameManager : +CheckWinCondition() bool
   %% 유저의 승리 여부와 탬플릿을 비교하여 이겼는지 안 이겼는지를 리턴
	
	class Player{
		+enum COLOR //기존의 enum COLOR 사용
		+string playerName
		+int weight, type
		+Button select, right, left
		+bool weightSelected
		+bool isLeft
		+SpriteRenderer sr
		+TMP_Text nameTextMesh
	}
	Player : +SetColor(COLOR color)
	
	class PhaseManagerBase{
		+
	}
	PhaseManagerBase : +ActivatePhase()
  PhaseManagerBase : +DeactivatePhase()
	
	%%canvasList의 자식들을 SetActive를 통해 차례로 비활성화 및 다음 canvas 활성화

	class PageManagerBase{
		+GameObject currentCanvas
	}
	PageManagerBase : +SwitchCanvas(GameObject Canvas)
	
	class PageDataIO1{
		+
	}
	PageDataIO1 --|> PageManagerBase : 상속
	PageDataIO1 ..> InitialPhaseManager

	class PagePlayerSelection1{
		+
	} 
	PagePlayerSelection1 --|> PageManagerBase : 상속
	PagePlayerSelection1 ..> PlayerSelectionManager
	
	class PageDirectionSelection1{
		+
	}
	PageDirectionSelection1 --|> PageManagerBase : 상속
	PageDirectionSelection1 ..> DirectionSelectionManager

	class PageRoundResult1{
		+
	}
	PageRoundResult1 --|> PageManagerBase : 상속
	PageRoundResult1 ..> RoundResultManager
	
	class PageLastResult1{
		+
	}
	PageLastResult1 --|> PageManagerBase : 상속
	PageLastResult1 ..> LastResultManager

	class InitialPhaseManager{
		+
	}
		GameManager : +SetPlayerNum(int num)
%% playernum을 외부에서 입력받아 저장하는 것
		GameManager : +SetPlayerName(string name)
%% playername을 외부에서 입력받아 저장하는 것
		GameManager : +SetPlayerInfo()
%% player에게 누가 스파이이고, 무게가 몇이고를 할당하는 작업
		InitialPhaseManager : +ShowGameInfo()
%% 이전의 showgamepurpose와 howtoplay를 합쳐서 구현, 규칙을 보여주는
%% 페이지
		InitialPhaseManager : +ShowPlayerInfo()
%% 플레이어의 정보를 보여준다

	InitialPhaseManager --|> PhaseManagerBase : 상속


	class PlayerSelectionManager{

	}
	PlayerSelectionManager : +UpdateParticipants(List<int> playeridx)
%% Choose가 먼저 나옴
%% candidates 후보 변수

	PlayerSelectionManager --|> PhaseManagerBase : 상속

	class DirectionSelectionManager{
		+Player currentPlayer
	}
	DirectionSelectionManager : +ChooseDirection(Player currentPlayer, bool isLeft)
	DirectionSelectionManager : +MovetoNextPlayer()
	DirectionSelectionManager --|> PhaseManagerBase : 상속

	class RoundResultManager{
		-enum DIRECTION
		-int direction
	}
	RoundResultManager : +CalculateTotal() int
%% 플레이어의 저울 참가 여부와, 그에 따른 투표 정보가 Player에 저장됨
%% 다 받아서 계산해서 DIRECTION을 리턴함
	RoundResultManager : +ResultOutput() 

	RoundResltManager --|> PhaseManagerBase : 상속


	class LastResultManager{
		+List~int~ trueAnswer
	}
	LastResultManager : +PlayerFailed() 
%% 플레이어가 실패했을 시, 능력자가 승리했다는 UI를 호출해준다
	LastResultManager : +JudgeRound(List <int>GuessInput)
%% 게임매니저에서 answer을 받고, 페이지에서 능력자의 추측
%% 입력을 받아서 UI에서 끝났을 때 이 함수를 부를 것이다
%% JudgeRound 이후에 최종 결과 출력을 UI에서 명령을 때려 준다
%% 최종 결과 출력 이후 게임 END 출력도 UI에서 처리한다
	LastResultManager --|> PhaseManagerBase : 상속


기술기획

public class Player : MonoBehaviour
{
public string playerName; //플레이어 이름
public int weight; //랜덤으로 정할 무게, 괴물일 시 ‘실제 무게 합산 시에만’ 0으로 취급
public int type; //해당 플레이어 괴물 여부 및 능력 확인 (0: 평범한 플레이어, 괴물의 능력은 홀수는 왼쪽, 짝수는 오른쪽일 때 발동한다. 1~2:자신이 위치한 접시가 항상 무겁다. 3~4:자신이 위치한 접시가 항상 가볍다. 5~6:저울의 결과를 반대로 바꾼다.)
public Button select; //플레이어 선택 버튼
public Button right; //오른쪽 저울에 올라가기 버튼
public Button left; //왼쪽 저울에 올라가기 버튼
public TMP_Text nameText; //입력 받은 이름 저장
public GameObject[] visibleObject; //중간에 꺼졌다 켜졌다 하는 항목들

}

public class GameManager : MonoBehaviour
{
public List players;
public Button confirm;
public List<List> roundInfo;

// Start is called before the first frame update
void Start()
{
    StartGame();
}

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

void StartGame()
{
    GetNames();
    SetPlayer();
    SetRoundObjetives();
    for (int round = 0; round < 5; round++)
    {
        PlayRound(round);

        if(CheckWinCondition()) {

            // 김도형

        }
    }

    
}

void GetNames() //프로그램 시작 시 플레이어 이름 저장
{
    //김도형
}

void SetPlayer() //플레이어 순서, 무게, 괴물 여부, 괴물 능력 랜덤으로 정함
{
     //양영헌
}

void SetRoundObjetives() //라운드 목표 조건부 랜덤으로 정하기
{
     //정유진, 이지현
				//라운드 목표를 조건부 랜덤으로 정하는 함수
        //앞에 선언된 roundinfo list는 <roundObjective, 라운드 인원, 가벼운  최소 인원 >로,총 5라운드로 이루어진 이중 리스트
        //-1 0 1 중 하나의 값을 담은 int가 roundObjective고, 5라운드니까 list<int>가 되겠지
        //이 roundObjective를 set하는 함수이다
        //-1은 왼쪽으로 기울어짐, 0은 수평, 1은 오른쪽으로 기울어짐을 뜻함
        //3라운드는 무조건 수평이 되어야함
        //1,2,4,5 라운드는 -1 아니면 1로 랜덤으로 부여되는데, -1-1-1-1 혹은 1111 처럼 4개 다 쏠리지는 않도록 부여해야함
        //이 setObjectives 랜덤 정수 5개를 debug 창에 출력하면 됨
}

void PlayRound(int round) //라운드 대표자를 입력받고 라운드 진행
{
    SelectPlayers() // 정유진

    Weigh() // 정유진
}

PopupRule(); // 백지은

bool CheckWinCondition() // 김도형

}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class Player : MonoBehaviour
{
    public string playerName; //플레이어 이름
    public int weight; //랜덤으로 정할 무게, 괴물일 시 ‘실제 무게 합산 시에만’ 0으로 취급
    public int type; //해당 플레이어 괴물 여부 및 능력 확인 (0: 평범한 플레이어, 괴물의 능력은 홀수는 왼쪽, 짝수는 오른쪽일 때 발동한다. 1~2:자신이 위치한 접시가 항상 무겁다. 3~4:자신이 위치한 접시가 항상 가볍다. 5~6:저울의 결과를 반대로 바꾼다.)
    public Button select; //플레이어 선택 버튼
	  public Button right; //오른쪽 저울에 올라가기 버튼
	  public Button left; //왼쪽 저울에 올라가기 버튼
    public TMP_Text nameText; //입력 받은 이름 저장
    public GameObject[] visibleObject; //중간에 꺼졌다 켜졌다 하는 항목들

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public List<Player> players;
    public Button confirm;
    public List<List<int>> roundInfo;

    // Start is called before the first frame update
    void Start()
    {
        StartGame();
    }

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

    }

    void StartGame()
    {
        GetNames();
        SetPlayer();
        SetRoundObjetives();
        for (int round = 0; round < 5; round++)
        {
            PlayRound(round);
        }
    }

    void GetNames() //프로그램 시작 시 플레이어 이름 저장
    {
        confirm.onClick.AddListener(SetNames);
    }

    void SetNames()
    {
        for (int i = 0; i< 5; i++)
        {
            players[i].playerName = players[i].nameText.text;
            players[i].visibleObject[0].SetActive(false);
        }
        confirm.onClick.RemoveListener(SetNames);
        confirm.gameObject.SetActive(false);
    }

    void SetPlayer() //플레이어 순서, 무게, 괴물 여부, 괴물 능력 랜덤으로 정함 (debug)
    {

    }

    void SetRoundObjetives() //라운드 목표 조건부 랜덤으로 정하기 (debug)
    {

    }

    void PlayRound(int round)
    {
        Debug.Log("현재 대표자는 " + players[round].playerName + "입니다.");
        SelectPlayers();
    }

    IEnumerator SelectPlayers() //저울에 올라갈 플레이어를 선택
    {
        yield return 0;
    }
}
profile
진화중이에요

0개의 댓글