본문 바로가기

Programing(프로그래밍)

c# 파칭코 게임 (재귀함수, 랜덤, 잠깐 기다리기, 커서 위치 바꾸기, 키입력 전 무한루프)




 최종코드---

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace pachinkogame
{
    class pachinko
    {
 
        /////////////////////////////
 
        static int money = 100;    //first money
        static int score = 0;
        static char a, b, c;
 
        static Random r = new Random();
        ///////////////////////////////
 
        static char createcharacter()
        {
            System.Threading.Thread.Sleep(50);    
            int random = r.Next(06);
 
            char character;
            switch (random)              //  0 ~ 4 (A, #, V, $, %)
            {
                case 0:
                    character = 'A';
                    break;
                case 1:
                    character = '#';
                    break;
                case 2:
                    character = 'V';
                    break;
                case 3:
                    character = '$';
                    break;
                default:
                    character = '%';
                    break;
            }
            return character;
        }
 
        static void printresult()
        {
            Console.SetCursorPosition(106);
            Console.WriteLine("STOP!");
 
            if (a == b && b == c)
            {
                score = 30;
                Console.SetCursorPosition(108);
                Console.WriteLine("WIN! +30");
            }
            else
            {
                score = -5;
                Console.SetCursorPosition(108);
                Console.WriteLine("LOSE -5");
            }
 
            money = money + score;
 
            System.Threading.Thread.Sleep(1000);
        }
 
        static void play()
        {
            while (money > 0)
            {
                if (Console.KeyAvailable == true)
                {
                    printresult();
 
                    Console.ReadKey(true);      //erase key insert
                }
 
                else if (Console.KeyAvailable == false)
                {
                    while (Console.KeyAvailable == false)
                    {
                        Console.SetCursorPosition(106);
                        Console.WriteLine("---------    NOW MONEY : {0}  ", money);
                        Console.SetCursorPosition(108);
                        Console.WriteLine("---------");
 
                        Console.SetCursorPosition(107);
                        Console.Write("- ");
 
                        a = createcharacter();
                        b = createcharacter();
                        c = createcharacter();
 
                        Console.Write("{0} {1} {2}", a, b, c);
                        Console.WriteLine("-");
                    }
                }
            }
        }
 
        static void Main(string[] args)
        {
            play();                 // if money is 0, game is end.
 
            Console.SetCursorPosition(1010);
            Console.WriteLine("Thank you for playing!");
 
            System.Threading.Thread.Sleep(1500);
 
        }
    }
}
 
 
cs



-------------------------------------


1. 하노이의 탑을 만들라고 했었는데, 결국 뭘 만들라는건지 질문 자체를 이해못해서 파칭코 게임으로 만들게 됐다.


2. 이번엔 사람의 도움이 아니라, 필요한 코드들은 직접 짜고

막히는 부분은 인터넷에서 찾고 찾아서 얼기설기 코드를 만들었더니

왜 여기서 이렇게 하면 버그가 나는걸까 싶은 부분도 아직 그대로 있다ㅜㅜ 

해결은 해서(자리를 바꾼다거나 해서) 버그는 없이 돌아가지만 그냥 왜 거기서 버그가 났었는지 아직도 모름.....


3. 파칭코가 빙글빙글 돌아가는걸 보여주고 싶었음.

 while문 하나를 키 입력 받기 전까지 무한으로 돌게 하려고 

( while (Console.KeyAvailable == false) ) 이런것도 써봄 ㅋㅋ 

근데 한번 입력하니까 계속 입력된걸로 인식해서 진행이 안됨 ㅠㅠㅋ 찾다보니 

(Console.ReadKey(true);) 요렇게 해주면 왠지 입력이 리셋될것 같아서 해보니 진짜 리셋됨!! 올레!

(그럼 false 하면 어떻게 될까......?!)


4. if문 안의 무한 루프를 돌던 while에서, 입력을 받은 후 빠져나와, 다음 else if로 갈 줄 알았던 분기문이, 

if가 끝났다고 if else로 안가고 바로 다음 구문으로 넘어가 버려서 멘붕. 

(사실 방금까지 왜 그런건지 모르고 있었는데 블로그에 정리하면서 깨달았다.... 

if를 두개쓰면 되는 문제였는데..... 이걸 왜 몰랐었니 ㅇ<-< 으아)


5. 랜덤함수는 아무래도 시간의 영향을 받는거 같은데, 한 랜덤함수에서 한번에 3개의 글자를 "짠!" 하고 구해버리면

항상 같은 글자가 나온다는 문제점이 있어서(...) 글자 사이에 시간차를 준 후 랜덤 함수를 두개 구해서 곱해버림.

(글쓰다보니 두개 구할 필요가 없네? 내일 코드 고쳐야지.)

(글쓰다보니 나머지를 따로 구할 필요도 없잖아? 나 뭐니)


6. 4번의 이유 때문에 코드 사이에 약간의 텀을 주는 함수가 없을까 찾다가 

유용한 녀석(System.Threading.Thread.Sleep(MiliSec.)) 발견.


7. 한번 그려진 그래픽(이라기엔 좀 민망하지만ㅋ) 위에 새로운 그래픽을 그리기 위해

커서 위치를 조정하는 함수도 써봄(Console.SetCursorPosition(x,y);). 우오오

잼남 신남! 뭔가 실시간?으로 돌아가는 게임을 만든 느낌!!ㅋㅋ


8. 점수랑, 점수에 계산해줄 그 턴의 점수는 아예 전역변수로 선언해버림.

원랜 play 함수 안에 넣었는데, play 함수가 재귀로 한바퀴 돌때마다 리셋 되어버리길래

(리셋은 내가 할꺼야!! 누구맘대로!!) 걍 맨 첨으로 꺼내버렸다.... 이래도 되는걸까?ㄷㄷ


9. 정말 한글로 된 블로그들보단 영문 블로그가 훠어얼씬 방대하고 자료가 많다.

위의 함수들은 그나마 대중적이지만, 조금만 생소한 함수들로만 들어가도 (특히)네이버에선 전혀 찾을수가 없다.

그러니까 구글링합시다 여러분.


10. I wanna make different function 이라고 적어놓은 부분은

원래대로라면 따로 함수로 때고 싶었는데, 저 a, b, c 요녀석들이 문제여서 따로 떼질 못했다.

밤이 늦어서 머리가 제대로 안돌아간건지... 내일 다시 보고 따로 떼야지.

그래야 부가적인 다른 기능들도 넣을 수 있을듯.



흐으.. 벌써 자정이 넘었다 ㅠ


나중에 좀 더 물어보고 아쉬운 부분 몇 군데 더 고칠생각.

잘자용.


-----다음날 추가수정----


1. 랜덤 수를 매번 구해 줄 필요가 없어서, 전역변수로 뺌.


2. a, b, c도 비교하기위해 밖으로 뺌. 

근데 생각해보니 비교할때 char형을 int형으로 비교했는데도 비교가 되더라 ㄷㄷ지적받고 놀람.


3. 이전 코드에서 print()던 함수를 createcharacter()로 (지적받고)바꿨다.

일단 이름만으로 뭘 하는지 알아야 하는데, 그게 불가능했고, 이 함수가 하는 일과 정확히 매치되지도 않았고

그래서 함수 안에 프린트 하는 부분을 아예 함수밖으로 빼고, 캐릭터 생성하는 함수로 정리함.


4. 재귀로 돌던 함수는 몇만번을 돌게되면 뻑(크래쉬)이 날 수 있다는 이야길 듣고

while문으로 바꿨다. 동시에 돈이 0원이 되면 함수에서 나와서 게임이 종료되도록 바꿨다.


5. 그 외에 자잘하게, 이기면 WIN, 지면 LOSE 라고 출력하는걸 만들었다.