예제 #1
0
        // 카드 이동
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (!gameEnd)
            {
                if (int.TryParse(txtRecvLine.Text, out recvLine) &&
                    int.TryParse(txtAmount.Text, out amount) &&
                    int.TryParse(txtSendLine.Text, out sendLine))
                {
                    if (recvLine > 10 || sendLine > 10 || amount < 1)
                    {
                        _state = GameState.WrongInput;
                    }
                    else
                    {
                        //양의 경우 연속된 만큼만 가능하게 한다.
                        int chainAmount = board.GetCardChainAmountFromLine(sendLine);
                        if (amount > chainAmount)
                        {
                            _state = GameState.TooManyCards;
                        }
                        else
                        {
                            if (judge.CanConveyCard(sendLine, amount, recvLine))
                            {
                                //카드 옮기기
                                board.ConveyCardLineToLine(sendLine, amount, recvLine);

                                //옮긴 후 움직임 수 증가 및 스코어 1 감소
                                score.GiveMovePenalty();
                                //카드 한 세트가 완성되면
                                if (judge.LineHasCardSet(recvLine))
                                {
                                    score.GiveOneCardSetScore();
                                    board.RemoveOneCardSet(recvLine);
                                }
                            }
                            else
                            {
                                _state = GameState.CantTransferCards;
                            }
                        }
                    }
                }
                else
                {
                    _state = GameState.WrongInput;
                }

                if (judge.BoardIsEmpty())
                {
                    _state  = GameState.Win;
                    gameEnd = true;
                    DisableGameBoard();
                }
                else if (score.IsGameOver())
                {
                    _state  = GameState.GameOver;
                    gameEnd = true;
                    DisableGameBoard();
                }
                //보드 상태 확인(print)
                PrintBoard(board, score, dealer);
            }
        }
예제 #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("스파이더 게임 시작");

            Dealer dealer = new Dealer();
            Score  score  = new Score();
            Board  board  = new Board(dealer);
            Judge  judge  = new Judge(board, dealer);


            //게임 난이도 선택
            int difficulty = -1;

            while (true)
            {
                Console.Write("게임 난이도를 선택해주세요. (1: 보통 / 2: 어려움 / 3: 매우 어려움) ");
                try
                {
                    difficulty = int.Parse(Console.ReadLine());
                }
                catch (Exception e)
                {
                    Console.WriteLine("잘못된 입력입니다.");
                    continue;
                }

                if (difficulty >= 1 && difficulty <= 3)
                {
                    break;
                }
                else
                {
                    Console.WriteLine("잘못된 입력입니다.");
                }
            }

            switch (difficulty)
            {
            case 1: dealer.SetDifficulty(Difficulty.Normal); break;

            case 2: dealer.SetDifficulty(Difficulty.Hard); break;

            case 3: dealer.SetDifficulty(Difficulty.VerryHard); break;
            }


            //난이도에 따라 딜러가 셔플
            dealer.Shuffle();
            //셔플 후 딜러가 보드에 카드 배분
            board.InitBoard();


            int select   = -1;
            int sendLine = -1;
            int recvLine = -1;
            int amount   = -1;

            //보드에 카드가 남아있는 동안
            while (!judge.BoardIsEmpty() || !score.IsGameOver())
            {
                //보드 상태 확인(print)
                PrintBoard(board, score, dealer);
                //카드를 옮길 지, 새로 받을 지 결정
                while (true)
                {
                    Console.Write("나의 행동은? (1:카드 옮기기 / 2:새카드 받기 / 0:힌트) ");
                    try
                    {
                        select = int.Parse(Console.ReadLine());
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("잘못된 입력입니다.");
                        continue;
                    }

                    if (select >= 0 && select <= 2)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("잘못된 입력입니다.");
                    }
                }

                //카드 옮기기일 경우
                if (select == 1)
                {
                    // 옮길 카드 줄, 양을 선택.
                    while (true)
                    {
                        Console.Write("옮기고 싶은 카드가 속한 라인을 선택하세요 (1~10 / 0:취소) ");
                        try
                        {
                            sendLine = int.Parse(Console.ReadLine());
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("잘못된 입력입니다.");
                            continue;
                        }

                        if (sendLine >= 0 && sendLine <= 10)
                        {
                            if (sendLine == 0 || !board.LineIsEmpty(sendLine))
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("이 라인에는 카드가 없습니다.");
                            }
                        }
                        else
                        {
                            Console.WriteLine("잘못된 입력입니다.");
                        }
                    }
                    //카드 옮기기 선택 취소
                    if (sendLine == 0)
                    {
                        continue;
                    }


                    //양의 경우 연속된 만큼만 가능하게 한다.
                    amount = board.GetCardChainAmountFromLine(sendLine);
                    while (true)
                    {
                        Console.Write($"몇 개의 카드를 옮기시겠습니까? (최대 {amount}장 / 0:취소) ");
                        try
                        {
                            select = int.Parse(Console.ReadLine());
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("잘못된 입력입니다.");
                            continue;
                        }

                        if (select >= 0 && select <= amount)
                        {
                            break;
                        }
                        else
                        {
                            Console.WriteLine("그만큼 옮길 수 없습니다.");
                        }
                    }
                    if (select == 0)
                    {
                        continue;
                    }


                    //옮길 위치 선택
                    while (true)
                    {
                        Console.Write("선택한 카드를 옮길 라인을 선택하세요 (1~10 / 0:취소) ");
                        try
                        {
                            recvLine = int.Parse(Console.ReadLine());
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("잘못된 입력입니다.");
                            continue;
                        }

                        //동일 라인으로 이동 불가
                        if (recvLine == sendLine)
                        {
                            Console.WriteLine("동일한 라인입니다. 다시 선택해주세요.");
                        }
                        else if (recvLine >= 0 && recvLine <= 10)
                        {
                            //받을 라인의 카드와 내가 보낼 카드가 연속될 수 있는가 확인
                            if (recvLine == 0 || judge.CanConveyCard(sendLine, select, recvLine))
                            {
                                break;
                            }
                            else
                            {
                                Console.WriteLine("이 라인으로는 옮길 수 없습니다.");
                            }
                        }
                        else
                        {
                            Console.WriteLine("잘못된 입력입니다.");
                        }
                    }
                    if (recvLine == 0)
                    {
                        continue;
                    }

                    //카드 옮기기
                    board.ConveyCardLineToLine(sendLine, select, recvLine);

                    //옮긴 후 움직임 수 증가 및 스코어 1 감소
                    score.GiveMovePenalty();
                    //카드 한 세트가 완성되면
                    if (judge.LineHasCardSet(recvLine))
                    {
                        board.RemoveOneCardSet(recvLine);
                        score.GiveOneCardSetScore();
                    }
                }
                //새로 받을 경우
                else if (select == 2)
                {
                    //딜러에게 카드가 없음
                    if (!dealer.CanPlayCard())
                    {
                        _state = GameState.DealerIsEmpty;
                    }
                    //보드의 모든 줄 중 어느것도 비지 않음
                    else if (!board.LinesAreNotEmpty())
                    {
                        _state = GameState.BoardLineIsEmpty;
                    }
                    else
                    {
                        //보드의 모든 줄에 카드 열 장씩 배부
                        board.ConveyCardToAllLine();
                    }
                }
                //힌트를 줘야하는 경우
                else
                {
                    //힌트를 줄 수 있는 상황이라면 힌트 주기
                    if (judge.CanGiveHint())
                    {
                        score.GiveHintPenalty();
                        _state = GameState.Hint;
                    }
                    else //아닐 경우
                    {
                        //딜러가 카드를 줄 수 있다면 새 카드 받기 권유
                        if (dealer.CanPlayCard())
                        {
                            _state = GameState.GetNewCard;
                        }
                        else
                        {
                            //힌트를 줄 수 없다면 게임오버
                            for (int i = 1; i <= board.boardLines.Count; i++)
                            {
                                if (board.LineIsEmpty(i))
                                {
                                    _state = GameState.NoMoreHint;
                                }
                                else
                                {
                                    _state = GameState.GameOver;
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            //게임 상태 프린트
            PrintBoard(board, score, dealer);
            //게임이 끝나면 점수 표시
            PrintResult(score);
        }