김김김의 게임개발
  • C# #4 메서드와 구조체
    2023년 08월 15일 23시 01분 28초에 업로드 된 글입니다.
    작성자: noun06

    메서드

    • 메서드는 특정한 작업을 수행하기 위해 사용되는 개념으로 함수라고도 불리움.
    • 코드의 재사용성, 모듈화, 가독성과 유지보수성, 중복 제거, 추상화 등의 특징을 가지고 있음.

     

    메서드의 구조와 문법

    • 접근 제한자(Access Modifier) : 메서드가 어디서 접근 가능한지 범위 지정(public, private, protected 등 사용)
    • 반환 타입(Return Type) : 메서드가 작업을 수행한 후 반환되는 값의 데이터 타입 지정.(반환하는 값이 없을 시 'void' 키워드 사용)
    • 매개변수(parameter) : 메서드가 호출될 때 받아들일 매개변수 지정. 메서드에 필요한 입력 값 전달 시 사용하며 0개 이상의 매개변수를 정의할 수 있음.
    • 반환값(Return Value) : 메서드가 결과를 반활할 때 사용하며 void가 아닌경우 해당 타입에 맞는 값 반환.
    [접근 제한자] [반환 타입] 매서드명([매개변수])
    {
        // 메서드 실행 코드
        [return 반환값;] //반환 타입이 void가 아닌 경우 결과 반환
    }
    // 예시 1: 반환 값이 없는 메서드
    public void SayHello()
    {
        Console.WriteLine("안녕하세요!");
    }
    
    // 예시 2: 매개변수가 있는 메서드
    public void GreetPerson(string name)
    {
        Console.WriteLine("안녕하세요, " + name + "님!");
    }
    
    // 예시 3: 반환 값이 있는 메서드
    public int AddNumbers(int a, int b)
    {
        int sum = a + b;
        return sum;
    }
    
    //메서드 호출
    SayHello();
    GreetPerson("John");
    AddNumbers(1, 2);

     

    • 메서드 오버로딩 : 동일한 이름의 동일한 기능을 하는 메서드를 여러 매개변수 리스트로 다중 정의하는 것. (매개변수의 개수, 타입, 순서 등)
    void PrintMessage(string message)
    {
        Console.WriteLine("Message: " + message);
    }
    
    void PrintMessage(int number)
    {
        Console.WriteLine("Number: " + number);
    }
    
    // 메서드 호출
    PrintMessage("Hello, World!");  // 문자열 매개변수를 가진 메서드 호출
    PrintMessage(10);  // 정수 매개변수를 가진 메서드 호출

     

    재귀 호출(Recursion)

    • 메서드가 자기 자신을 호출하는 것. 이를 통해 동일한 작업을 간단하게 표현하여 여러 번 수행할 수 있음.
    • 종료 조건을 명확하게 정의하여 무한 재귀 호출 반복에 주의해야 함. 
    void CountDown(int n)
    {
        if (n <= 0)
        {
            Console.WriteLine("Done");
        }
        else
        {
            Console.WriteLine(n);
            CountDown(n - 1);  // 자기 자신을 호출
        }
    }
    
    // 메서드 호출
    CountDown(5);

     

    구조체(Struct)

    • 여러 개의 다양한 데이터를 묶어 하나의 사용자 정의 데이터 타입 만들기 위해 사용하며 'struct' 키워드로 선언.
    • 구조체는 값 형식(Value Type)으로 분류되며 데이터를 저장하고 필요한 기능을 제공.
    • 구조체는 클래스와 유사한 멤버를 가지며 변수와 메서드 등으로 구성될 수 있음.
    struct Person
    {
        public string Name;
        public int Age;
    
        public void PrintInfo()
        {
            Console.WriteLine($"Name: {Name}, Age: {Age}");
        }
    }

     

    • 구조체는 변수를 선언하여 사용할 수 있으며 멤버에 접근할 때 '.' 연산자를 사용.
    Person person1;
    person1.Name = "John";
    person1.Age = 25;
    person1.PrintInfo();

     

    실습 과제 [1]

    • 구구단 출력하기
    namespace GuguDan
    {
        internal class Program
        {
            static void Main(string[] args)
            {
    
                Console.Write("단을 입력하세요: ");
                int num = int.Parse(Console.ReadLine());
    
                for(int i = 1; i < 10; i++)
                {
                    int result = num * i;
                    Console.Write($"{num} x {i} = {result} \n");
                }
            }
        }
    }

     

    실습 과제 [2]

    • 별찍기
    namespace Star
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                //직각삼각형◺
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j <= i; j++)
                    {
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
    
                //역직각삼각형◸
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 4; j >= i; j--)
                    {
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
    
                //피라미드
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 4 - i; j++)
                    {
                        Console.Write(" ");
                    }
                    for (int j = 0; j < 2 * i + 1; j++)
                    {
    
                        Console.Write("*");
                    }
    
                    Console.WriteLine();
                }
    
                 //역피라미드
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j <= i; j++)
                    {
                        Console.Write(" ");
                    }
                    for (int j = 7; j >= 2 * i + 1; j--)
                    {
    
                        Console.Write("*");
                    }
                    Console.WriteLine();
                }
    
    	//2중 배열 직각삼각형
                int[,] map = new int[5, 5]
                {
                    {1,0,0,0,0},
                    {1,1,0,0,0},
                    {1,1,1,0,0},
                    {1,1,1,1,0},
                    {1,1,1,1,1}
                };
    
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (map[i, j] == 1)
                        {
                            Console.Write("*");
                        }
                        else
                        {
                            Console.Write("");
                        }
                    }
                    Console.WriteLine();
                }
            }
        }
    }

     

    실습 과제 [3]

    • 최댓값, 최솟값 찾기
    namespace MaxMin
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                //최댓값 최솟값 찾기
    
                int[] num = new int[5];
                
    
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("숫자를 입력하세요: ");
                    num[i] = int.Parse(Console.ReadLine());
                }
    
                //입력 받은 후에 변수 선언
                int maxNum = num.Max();
                int minNum = num.Min();
    
                Console.WriteLine("최댓값: " + maxNum);
                Console.WriteLine("최솟값: "+ minNum);
            }
        }
    }

     

    실습 과제 [4]

    • 소수 판별하기
    namespace PrimeNumber
    {
        internal class Program
        {
                // 주어진 숫자가 소수인지 판별하는 함수
                static bool IsPrime(int num)
                {
                if (num <= 1) // 1보다 작거나 같은 수는 소수가 아니다.
                {
                    return false;
                }
                for (int i = 2; i * i <= num; i++) // 2부터 숫자의 제곱근까지만 확인한다.
                {
                    if (num % i == 0) // 숫자가 i로 나누어 떨어진다면 소수가 아니다.
                    {
                        return false;
                    }
                }
                return true; // 소수인 경우
            }
    
                static void Main()
                {
                    Console.Write("숫자를 입력하세요: "); // 사용자에게 숫자 입력 요청
                    int num = int.Parse(Console.ReadLine()); // 사용자가 입력한 값을 정수로 변환하여 저장
    
                    if (IsPrime(num)) // 입력 받은 숫자가 소수라면
                    {
                        Console.WriteLine(num + "은 소수입니다."); // 소수임을 출력
                    }
                    else // 소수가 아니라면
                    {
                        Console.WriteLine(num + "은 소수가 아닙니다."); // 소수가 아님을 출력
                    }
                }
            
        }
    }

    실습 과제 [5]

    • 숫자 맞추기
    namespace UpDownGame
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Random random = new Random();
                int numberToGuess = random.Next(1, 101);
                int guessCount = 0;
                int myNum = 0;
    
                Console.WriteLine("숫자 맞추기 게임을 시작합니다..");
                for(int i = 0; myNum != numberToGuess ; i++)
                {
                    Console.WriteLine("숫자를 입력하세요: ");
                    myNum = int.Parse(Console.ReadLine());
                    guessCount++;
    
                    if (myNum > numberToGuess)
                    {
                        Console.WriteLine("너무 큽니다");
                    }
                    else if (myNum < numberToGuess)
                    {
                        Console.WriteLine("너무 작습니다");
                    }
                    else
                    {
                        Console.WriteLine("성공");
                        Console.WriteLine(guessCount + "번 만에 맞추셨습니다");
                    }
                }
            }
        }
    }

    실습 과제 [6]

    • 틱택토
    using System;
    
    namespace TicTacToe
    {
        class Program
        {
            static char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
            static int player = 1; // 1 or 2
            static int choice; // 선택한 보드 위치
            static int flag = 0; // 승리 경우 체크
    
            // 보드 그리기
            static void DrawBoard()
            {
                Console.WriteLine($" {board[0]} | {board[1]} | {board[2]} ");
                Console.WriteLine("---|---|---");
                Console.WriteLine($" {board[3]} | {board[4]} | {board[5]} ");
                Console.WriteLine("---|---|---");
                Console.WriteLine($" {board[6]} | {board[7]} | {board[8]} ");
            }
    
            // 체크 승리 조건
            static int CheckWin()
            {
                //가로 승리
                if (board[0] == board[1] && board[1] == board[2])
                {
                    return 1;
                }
                else if (board[3] == board[4] && board[4] == board[5])
                {
                    return 1;
                }
                else if (board[6] == board[7] && board[7] == board[8])
                {
                    return 1;
                }
    
                //세로 승리
                else if (board[0] == board[3] && board[3] == board[6])
                {
                    return 1;
                }
                else if (board[1] == board[4] && board[4] == board[7])
                {
                    return 1;
                }
                else if (board[2] == board[5] && board[5] == board[8])
                {
                    return 1;
                }
                
    
                //대각선 승리
                else if (board[0] == board[4] && board[4] == board[8])
                {
                    return 1;
                }
                else if (board[2] == board[4] && board[4] == board[6])
                {
                    return 1;
                }
    
                //비김
                else if (board[0] != '1' && board[1] != '2' && board[2] != '3' &&
                         board[3] != '4' && board[4] != '5' && board[5] != '6' &&
                         board[6] != '7' && board[7] != '8' && board[8] != '9')
                {
                    return -1;
                }
                
                else
                {
                    return 0;
                }
            }
    
            // 보드 업데이트
            static void UpdateBoard()
            {
                char sign = (player % 2 == 0) ? 'O' : 'X';
                do
                {
                    Console.WriteLine($"어디에 '{sign}'을 놓을까요?");
                    choice = int.Parse(Console.ReadLine()) - 1;
                }
                while (board[choice] != (choice + 1).ToString()[0]);
    
                board[choice] = sign;
            }
    
            static void Main(string[] args)
            {
                Console.WriteLine("틱택토 게임을 시작합니다.");
                do
                {
                    Console.Clear(); 
                    Console.WriteLine("플레이어 1: X |||| 플레이어 2: O");
                    Console.WriteLine("\n");
                    if (player % 2 == 0)
                    {
                        Console.WriteLine("플레이어2 턴입니다.");
                    }
                    else
                    {
                        Console.WriteLine($"플레이어1 턴입니다.");
                    }
    
                    DrawBoard();
                    UpdateBoard();
    
                    flag = CheckWin();
    
                    player++;
                } while (flag != 1 && flag != -1);
    
                Console.Clear();
                DrawBoard();
                if (flag == 1)
                {
                    Console.WriteLine($"플레이어 {(player % 2) + 1} 승리!");
                }
                else
                {
                    Console.WriteLine("무승부!");
                }
            }
        }
    }

     

     

    댓글