음.. 제가 아마 처음 영어공부를 할때 였던거 같아요

아버님 회사 직원중 한분이 영어를 너무 잘하셔서 저희에게 영어를 가르쳐 주셨는데 전 그때 행맨을 알았어요

전 단순히 글자 맞추는 건줄 알았는데 왠걸? 나중에 알아보니 못 마출 경우 뭔가는 매다는? 무시무시한 게임이었어요

네 글자맞추기! 하지만 맞추지 못하면? 무엇인가를 매다는? 게임 행맨 을 해볼게요!






그전에 알아야 할 것들 첫번째는?


1. String 변수의 할당과 초기화


먼저 String을 해보면 string과 String 두개가 있습니다다 무슨차이일까요? 결론은 똑같습니다다.

System.String allias를 쓴다고 하는데 이런거 몰라도 되고 그냥 마음에 드는 것을 쓰자구요!

초기화는

String a;           //초기화 하지않기

String a = null    //null로 초기화

String a = "haha" //haha로 초기화 등

이렇게 쓸수 있습니다. 지금까지는 항상int로 바꾸었는데 String은 그냥 변수선언하고 따옴표안에 써 넣으면 됩니다.!


2. 두 String 비교하기


행맨을 하기 위해서는 두개의 String 변수를 비교해야 합니다. 그래서 저희는 .Equal 메서드를 사용할 것입니다.

이 문자열이 같은지 안같은지 알려주는 메서드이구요 같으면 true를 다르면 false를 돌려주면서 값이 같은지 안같은지 가르쳐 줍니다.

사용방법은

String a1 = "haha"

String a2 = "haha"

if(a1.Equals(a2))  //Ture로 반환 합니다.

{

정답

}

이렇게 사용하시면 됩니다.!

여기서 볼 것은 Haha와 haha는 다른데요 C#은 대문자 소문자 구별을 하기 때문입니다. 만약 아 그런거 필요없다! 하시는 분은

a.Equals(b, StringComparison.OrdinalIgnoreCase); 이런식으로 해주시면 됩니다.!


3. String 과 StringBuilder


이미 만들어진 문자열에 문자를 추가하거나 중간에 문자를 삽입하는 이렇게 조물딱 조물딱 하려면 String 객체로는 하기 어렵습니다.

그래서 나온것이 바로 StringBuilder 입니다.간단한 것은 String을 사용하고 복잡한 것은 StringBuilder를 사용하면 됩니다!

선언은

StringBuilder str = new StringBuilder();

문자열의 길이는?

str.length;

3번째 문자는?

str.Chars(2);

3번째 문자를 k로 변경하려면?

str[3] = k;

끝에 ab를 추가하면?

str.append("ab");

2번째에 '@'를 첨가하면?

str.insert(1,'@');

등등 정도 알아두면 된다.


4. 클래스의 변수와 메서드의 접근제어


처음 클래스를 배울때 Public Private,protected 에 대해서 배웠는데 public만 하고 나머지는 다음에 한다고 했었죠?

일단 protected는 다음에 알도록 하고 오늘은 private만 해보도록 합시다. public은 앞에서 말했다 시피 어디에서나 접근가능합니다.

public 공공의 라는 단어와 같이 그런 뜻을 지닙니다 그럼 private는? 네 그 메서드를 선언한 클래스 내에서만 사용가능한 메서드 입니다.

C#은 앞에 아무것도 붙이지 않으면 자동으로 private가 되므로 공공연하게 필요할때는 public을 선언해 봅시다. 예를 들어 볼까요? 주석을 봅시다!


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CallTest
{
    class Program
    {
        public Program()
        {
 
        }
        private void getValue()
        {
 
        }
        static void Main(string[] args)
        {
            
            t1 t = new t1();
            t.ptest();       //사용 가능
            t.priTest();     //사용 불가
 
        }
    }
    class t1
    {
        public t1()
        {
 
        }
        public int ptest()
        {
            int a=0;
            a++;
            
            return a;
        }
        private int priTest()
        {
            int b = 0;
            b++;
            return b;
        }
    }
}
 
cs

자 이정도면 행맨을 만들기에 충분히 안것 같습니다! 이 게임을 만든후 드디어!GUI를 하도록 하니 마지막 까지 힘냅시다!



앞에서 대부분 배운것 이기에 이번 알아야 할 것들이 작네요!

자 만들어 볼까요?

다시 문제를 봅시다

0~9까지 중복을 허용하지 않는 숫자중에 자신이 예측하는 3개의 숫자를 입력합니다. 입력한 숫자와 컴퓨터가 생성한 숫자가 같으면 스트라이크로

값만 있고 위치가 다르면 볼 로 해서 사용자에게 결과를 알려줍니다. 이 정보로 추측하여 세 숫자와 그 위치까지 맞추면 게임이 끝납니다.

한번의 게임에 총 10번의 시도를 할 수 있습니다.


1.먼저 가위바위 보 같이 플레이어 클래스를 만들겠습니다 숫자를 입력받고 int형으로 변환하겠죠?

2. 숫자 3개를 랜덤으로 만드는 메서드 만들겠습니다.(중복이 없게 하는게 중요하겠죠? 중복제거는 로또번호에서 썻던 함수를 응용!)

3. 단순하게 메세지가 보이는 메서드, 스트라이크 볼이 보이는 메서드를 만들겠습니다.

4.게임이 끝날때 보이는 메서드를 생성합니다. 이겼거나 졌거나 컴퓨터의 숫자를 보여주는 메서드등으로 이루어져 있겠죠?

5.스트라이크와 볼등을 체크하는 메서드를 만들것 입니다.

6.한번 플레이 할때마다 체크 메서드를 이용 다른 메서드까지 이용해서 스트라이크와 볼을 보여주는 메서드를 만듭니다.

7.마지막으로 만든 메서드를 run 메서드에 넣고 완료!


소스 코드

Player.cs


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace NumberBaseBall
{
 
    class Player
    {
        int a;
        String msg;
        public Player()
        {
            a = 0;
            msg = " ";
        }
        public int input()
        {
            Console.WriteLine("0 - 9 사이 값을 넣으세요");
            msg = Console.ReadLine();
           
            a = int.Parse(msg);
            return a;
        }
    }
 
}
 
cs

Program.cs

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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace NumberBaseBall
{
    class Program
    {
        int[] m_data;
        Player m_Player;
        void NumberBaseBall()
        {
            m_data= new int[3];
            m_Player = new Player();
        }
        void makeData()
        {
            Random rand;
            rand = new Random();
 
            for(int i=0;i<m_data.Length;i++)
            {
                m_data[i] = rand.Next(09);
                for (int j = 0; j < i; j++)
                {
                    if(m_data[i]==m_data[j])
                    {
                        i--;
                    }
                }
 
            }
        }
        void showMsg(String msg)
        {
            Console.WriteLine(msg);
        }
        void showPlay(int[] data)
        {
            Console.WriteLine("스트라이크:" + data[1+ " ,볼:" + data[0]);
        }
        void showGameEnd(Boolean win)
        {
            if(true == win)
            {
                Console.WriteLine("축하합니다");
 
            }
            else
            {
                Console.WriteLine("다음 기회에");
            }
            Console.WriteLine("컴퓨터의 숫자는?");
            for(int i=0;i<m_data.Length;i++)
            {
                Console.WriteLine(m_data[i]);
            }
        }
        int check(int index,int a)
        {
            int b;
 
            b = 0;
            for(int i=0;i<m_data.Length;i++)
            {
                if(m_data[i]==a)
                {
                    if(i==index)
                    {
                        b = 2;
                        break;
                    }
                    else
                    {
                        b = 1;
                    }
                }
            }
            return b;
        }
        void onePlay(int[] result)
        {
            int input;
            int r;
            for(int i=0;i<result.Length;i++)
            {
                result[i] = 0;
            }
            for(int i=0;i<3;i++)
            {
                input = m_Player.input();
                r = check(i, input);
 
                if(2== r)
                {
                    result[1]++;
                }
                else if(1==r)
                {
                    result[0]++;
                }
            }
        }
        void run()
        {
            Boolean win;
            int[] result;
 
            result = new int[2];
            makeData();
 
            win = false;
            for(int i=0;i<10;i++)
            {
                showMsg((i + 1+ "번째 시도");
 
                onePlay(result);
                showPlay(result);
                if(3==result[1])
                {
                    win = false;
                    break;
                }
            }
            showGameEnd(win);
        }
        static void Main(string[] args)
        {
            Program m = new Program();
            m.NumberBaseBall();
            m.run();
 
        }
    }
}
 
cs

완성 한 프로그램 입니다.




바로 숫자야구!

숫자야구가 무었이냐구요?

0~9까지 중복을 허용하지 않는 숫자중에 자신이 예측하는 3개의 숫자를 입력합니다. 입력한 숫자와 컴퓨터가 생성한 숫자가 같으면 스트라이크로

값만 있고 위치가 다르면 볼 로 해서 사용자에게 결과를 알려줍니다. 이 정보로 추측하여 세 숫자와 그 위치까지 맞추면 게임이 끝납니다.

한번의 게임에 총 10번의 시도를 할 수 있습니다.





1.메서드의 값을 전달하는 방법(Call by Value, Call by Reference)

정말정말 중요한 것이 나왔습니다! 아마 신입 프로그래머로 회사에 들어갈때 대부분 물어보는 문제중 하나일 거에요!

값전달과 방식?참조 전달 이라고 하는 것 인데요

Call by Value는 그 메서드 내에서만 값이 바뀌고 그 메서드가 끝나면? 값이 다시 원래대로 돌아옵니다

Call by reference는 메서드 안에서 바뀐 값이 끝까지 계속 영원히 바뀌는 것을 말합니다. 이것은 소스 코드를 보시면서 꼭!!! 이해하세요! 


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CallTest
{
    class Program
    {
        public Program()
        {
 
        }
        void callbyValue(int a)
        {
            a = a * 2;
        }
        void callbyrefTest(int[] data)
        {
            for(int i= 0;i<3;i++)
            {
                data[i] = data[i] * 2;
            }
        }
        void run()
        {
            int[] mydata;
            int a;
 
            a = 3;
            mydata = new int[3];
 
            mydata[0= 1;
            mydata[1= 2;
            mydata[2= 3;
            
            callbyValue(a);
            Console.WriteLine(a);           //그대로 3
 
            callbyrefTest(mydata);         // 1 ,2,3이 2,4,6,으로 바뀌어 있다
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(mydata[i]);
            }
            
        }
        static void Main(string[] args)
        {
 
            Program p = new Program();
            p.run();
 
        }
    }
}
 
cs

특히 두번째 Call by Reference로 위 코드에서 run 메서드에서 callbyref메서드를 호출해서 값을 배열로 받는 경우입니다.
그래서 출력도 for문을 이용해서 배열로 했구요!

2. 프로그램을 설게하는 요령

동일한 것을 만들더라도 코드에서 각각 사람들의 개성이 나타납니다. 그래서 코딩을 기술의 영역에서 예술의 영역으로 보는 분들도 계십니다.

이렇게 프로그램을 설계하는데 있어서 좋은말이 있어서 가져옵니다.

첫 번째 기능 스펙을 명확하게 해야 합니다. 어떤 기능이 어떠한 방식으로 구현되어야 하는지를 정의하는 것입니다(이것은 프로그램을 사용하는 사용자의 요구에 따라서 결정됩니다.)

두 번째 재료를 설계해야 하는데 이때 클래스를 설계하고 그 대략적 기능을 정의합니다. 이후 클래스 메서드, 전역변수를 정의합니다.

세 번째 main 메서드에서 설계된 클래스를 이용해서 프로그램을 구현해 봅니다. 이때 두 번째로 돌아가서 설게를 보정합니다.

네 번째 모든 메서드에 대해서 상호관계 인터페이스가 완료되면 각 클래스의 메서드를 구체적으로 구현합니다.


+ Recent posts