[Sparta-BCamp] TIL 8 ( 틱택토, 메서드, 구조체 ) ⭐⭐⭐

업데이트:

카테고리:

태그: , ,




개인 공부 C# 3일차

  • 2주차 강의 남은 거 듣기,숙제( 숫자맞추기, 틱택톡 )
  • 어제 코드 컨벤션 정리하기.
  • 14:00 학습법 강의.
  • 3주차 듣고 숙제, 시간 남으면 개인과제








1. 2주차 과제

1)숫자 맞추기 게임

1~100까지 랜덤숫자중 하나를 맞추는게임
코드는 강의내용 보고 작성

image



2)틱택토 게임

2023-11-08-16_24_54

틱택토게임
어제 들었던 컨벤션강의 내용, Summary도 사용하려 노력해 보았습니다.
TicTacToc Class 에 2차 배열 map , DrawMap, DoOX 메서드 PlayGame(), CheckWin(), CheckPostion(int position) 13X13 2차원배열

전체 코드 보기
using System.Numerics;

namespace SecondWeek
{
    internal class Program
    {
        static void Main(string[] args)
        {
           
            int position;       //1~9 위치
            int user = 2;       // player 1, 2
            int player = 50;    // 50 = O , 51 = X
            bool checkPosition = true;
            bool gameend = true;

            TicTacToc tic = new TicTacToc();    // 인스턴스화 
            tic.DrawMap();                      // 맵그리기   

            // player1 = 50  
            // player2 = 51  

            while (gameend)
            {
                PlayGame();
                CheckWin();
            }
            
            void PlayGame()     // 게임 플레이.
            {
                if (user == 1) { user = 2; } else if (user == 2) { user = 1; }
                if (user == 1) { player = 50; } else if (user == 2) { player = 51; }
                Console.Write("자리를 정해주세요.(1 ~ 9) \nPlayer" + user + " : ");
                position = int.Parse(Console.ReadLine());
                CheckPosition(position);
                tic.DoOX(position, player);
                Console.Clear();
                tic.DrawMap();
            }

            void CheckWin() {
                int[] playercheck = { 50, 51 };
                foreach (int ox in playercheck)
                {
                    if (((tic.map[2, 2] == ox) && (tic.map[2, 6] == ox)&&(tic.map[2, 10] == ox))
                       || ((tic.map[6, 2] == ox) && (tic.map[6, 6] == ox) && (tic.map[6, 10] == ox))
                       || ((tic.map[10, 2] == ox) && (tic.map[10, 6] == ox) && (tic.map[10, 10] == ox))
                       || ((tic.map[10, 2] == ox) && (tic.map[6, 2] == ox) && (tic.map[2, 2] == ox))
                       || ((tic.map[2, 6] == ox) && (tic.map[6, 6] == ox) && (tic.map[10, 6] == ox))
                       || ((tic.map[2, 10] == ox) && (tic.map[6, 10] == ox) && (tic.map[10, 10] == ox))
                       || ((tic.map[2, 2] == ox) && (tic.map[6, 6] == ox) && (tic.map[10, 10] == ox))
                       || ((tic.map[2, 10] == ox) && (tic.map[6, 6] == ox) && (tic.map[10, 2] == ox)))
                    {
                        if (user == 1)
                        {
                            Console.WriteLine("Player 1가 승리하였습니다!");
                            gameend = false;
                        }
                        else 
                        {
                            Console.WriteLine("Player 2가 승리하였습니다!");
                            gameend = false;
                        }
                        break;
                    }
                }
            }

            void CheckPosition(int position){
                if (0 < position && position > 10)
                {
                    Console.WriteLine("\n1~9 숫자를 입력해주세요\n");
                    if (user == 1) { user = 2; } else if (user == 2) { user = 1; }
                    PlayGame();
                }
                int[] playercheck = { 50, 51 };
                foreach (int ox in playercheck)
                {
                    if ((position == 1 && tic.map[2, 2] == ox)
                        || (position == 2 && tic.map[2, 6] == ox)
                        || (position == 3 && tic.map[2, 10] == ox)
                        || (position == 4 && tic.map[6, 2] == ox)
                        || (position == 5 && tic.map[6, 6] == ox)
                        || (position == 6 && tic.map[6, 10] == ox)
                        || (position == 7 && tic.map[10, 2] == ox)
                        || (position == 8 && tic.map[10, 6] == ox)
                        || (position == 9 && tic.map[10, 10] == ox))
                    {
                        Console.WriteLine("\n잘못된 자리입니다 다시 입력해 주세요\n");
                        if (user == 1) { user = 2; } else if (user == 2) { user = 1; }
                        PlayGame();
                    }
                }
            }
            Console.WriteLine("게임이 종료되었습니다.");
        }
    }

    /// <summary>
    /// 맵에 테두리, OX표시
    /// </summary>
    public class TicTacToc 
    {
        // 배치 자리
        // map[2, 2],  map[2, 6],  map[2, 10]
        // map[6, 2],  map[6, 6],  map[6, 10]
        // map[10, 2], map[10, 6], map[10, 10]

        // 1~9 배치 자리
        // 21~31 맵 테두리
        // 50,51 player, com 배치위치
        public int[,] map = new int[13, 13]
            {
                    { 22, 28, 28, 28, 23, 28, 28, 28, 23, 28, 28, 28, 24 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 21, 0, 1, 0, 21, 0, 2, 0, 21, 0, 3, 0, 21 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 25, 28, 28, 28, 26, 28, 28, 28, 26, 28, 28, 28, 27 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 21, 0, 4, 0, 21, 0, 5, 0, 21, 0, 6, 0, 21 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 25, 28, 28, 28, 26, 28, 28, 28, 26, 28, 28, 28, 27 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 21, 0, 7, 0, 21, 0, 8, 0, 21, 0, 9, 0, 21 },
                    { 21, 0, 0, 0, 21, 0, 0, 0, 21, 0, 0, 0, 21 },
                    { 31, 28, 28, 28, 29, 28, 28, 28, 29, 28, 28, 28, 30 },
            };


        /// <summary>
        /// 맵 그리기 
        /// </summary>
        public void DrawMap()
        {
            for (int i = 0; i < 13; i++)
            {

                for (int j = 0; j < 13; j++)
                {
                    if (map[i, j] == 21)
                    {
                        Console.Write("│ ");
                    }
                    else if (map[i, j] == 22)
                    {
                        Console.Write("┌ ");
                    }
                    else if (map[i, j] == 23)
                    {
                        Console.Write("┬ ");
                    }
                    else if (map[i, j] == 24)
                    {
                        Console.Write("┐ ");
                    }
                    else if (map[i, j] == 25)
                    {
                        Console.Write("├ ");
                    }
                    else if (map[i, j] == 26)
                    {
                        Console.Write("┼ ");
                    }
                    else if (map[i, j] == 27)
                    {
                        Console.Write("┤ ");
                    }
                    else if (map[i, j] == 28)
                    {
                        Console.Write("─");
                    }
                    else if (map[i, j] == 29)
                    {
                        Console.Write("┴ ");
                    }
                    else if (map[i, j] == 30)
                    {
                        Console.Write("┘ ");
                    }
                    else if (map[i, j] == 31)
                    {
                        Console.Write("└ ");
                    }
                    else if (0 < map[i, j] && map[i, j] < 10)
                    {
                        Console.Write(map[i, j]);
                    }
                    else if (map[i, j] == 50)       //Player 1
                    {
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.Write("O");
                        Console.ResetColor();
                    }
                    else if (map[i, j] == 51)       //Player 2
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write("X");
                        Console.ResetColor();
                    }
                    else
                    {
                        Console.Write(" ");
                    }
                }
                Console.WriteLine();
            }
        }

        /// <summary>
        /// 자리에 OX 표시하기
        /// </summary>
        /// <param name="position"></param>
        /// <param name="player"></param>
        public void DoOX(int position,int player) 
        {

            // 배치 자리
            // map[2, 2],  map[2, 6],  map[2, 10]
            // map[6, 2],  map[6, 6],  map[6, 10]
            // map[10, 2], map[10, 6], map[10, 10]

            switch (position) 
            {
                case 1:
                    map[2, 2] = player;
                    break;
                case 2:
                    map[2, 6] = player;
                    break;
                case 3:
                    map[2, 10] = player;
                    break;
                case 4:
                    map[6, 2] = player;
                    break;
                case 5:
                    map[6, 6] = player;
                    break;
                case 6:
                    map[6, 10] = player;
                    break;
                case 7:
                    map[10, 2] = player;
                    break;
                case 8:
                    map[10, 6] = player;
                    break;
                case 9:
                    map[10, 10] = player;
                    break;
            }
        }
    }
}

하고나서 느낀점
많이 부족하다. 전체적인 코드, 클래스, 메서드, 변수 사용에 많이 미숙했고, 맵 크기를 좀 더 작게 했으면 좋았을까. 라는 후회를 조금 했었고, 또 1~9 의 배열의 위치가 1~9와 연관이 있는 무언가 였으면 하기 쉬웠겠다고 생각했다.

DrawMap, DoOX, 코드가 너무 길어지는대 단축할 방법이 없을까 고민하고 만들고 나서 후회했다..
13X13한 이유는 빈공간이 있으면 보기 좋을 거 같아서 했지만 잘못된 선택이었다.

풀이를 보고나서
고쳐야 될, 하지 않아도 될 코드가 너무 많았다. 더 간단하게, 쉽게 할 수 있는 것들이었고, Player 를 나타낼 때 % 쓰는것, 조건문들도 생각하면 더 간단하게 할 수 있었다.
게임판을 배열을 안써도 됐고, Write로 해도 됐다. 1~9부분에 새로운 배열을 사용하였고 그렇게하면 유저가 입력한 값이랑 배열의 값이 같아져서 더 효율적이고 간단하게 코딩이 가능하다고 생각한다. 많은부분이 필요가 없다. 왜 배열을 쓸 생각을 못 한 걸까? 처음 굳이 맵을 배열로 한다는 생각부터 잘못된 게 아닐까? 배운 걸 사용하고 싶어서 사용했던 걸까? 생각을 못 했던 걸까?
지금 공부법에 문제가 있다고 느꼈다. 다양한 코드를 보고 이해하고 사용하는 느낌으로 가면 좋을 거 같다.








2. C# 강의 내용 정리

3일차 내용 정리 2주차 들은 강의 정리 3주차 강의는 내일 TIL에

⭐C# 메서드와 구조체⭐
struct








3. 코드 컨벤션 강의

어제 코드 컨벤션강의 내용 정리.

코드 컨벤션

코드 컨벤션 스타일

  • BSD,K&R이 있다. 가장큰 차이는 중괄호{}의 위치.
  • BSD스타일 : 줄간격이 한눈에 들어오지만 코드가 길어진다는 단점.
  • K&R스타일 : 블록을 조건에 한 줄로 같은 행에 배치 코드 줄 수 절약, 한눈에 많은 코드를 작성 할 수 있다.
  • 유니티 C# 은 BSD 스타일로 사용한다.
  • 클래스명, 변수명, 함수 모두 의미있는 이름을 지어주어야 한다.
  • 내 코드를 다른 사람이 쉽게 이해할 수 있도록.
  • 오랜 시간 뒤에 내가 내 코드를 알아보기 위해서
  • 가독성. 취직.
// BSD
if(조건)
{
    처리로직
}

// K&R
if(조건){
    처리로직
}

// 추가 GNU 코딩 스타일   : 블록 표시하여 구조가 잘 보인다
//  수평으로 많은 코드를 작성할 수 없다.
if(조건)
    {
        처리로직
    }



표기법, 네이밍 규칙

  • PascalCase : 모든 단어에서 첫 글자를 대문자로 쓰는 방식
  • camelCase  : 첫 단어를 제외하고 나머지 첫 글자를 대문자로 쓰는 방식
  • snake_case : 단어가 합쳐진 부분마다 중간에 언더바(_)을 사용
  • kebab-case : 단어가 합쳐진 부분마다 중간에 하이픈(-)을 사용
  • 유니티에서는 PascalCase사용
  • NameSpace, Class, Struct(구조체) = PascalCase
  • 함수 Enum = PascalCase
  • Public = PascalCase
  • nonPublic (private,protected~~~) _camelCase -> 살짝 불편 안 쓰는 케이스가 있다.
  • 함수 내부에서는 camelCase
  • 덩치가 크거나 Public -> Pascal Case
  • ⭐ 이름 정할 때 누가 봐도 알 수 있도록 ⭐
  • ⭐ 습관처럼 만들자 ⭐



협업 꿀팁

1) 주석과 Summary

협업 시 다른 개발자분들이 한눈에 보기 쉽게 주석, Summary를 활용하자.
Summary를 써보며 튜터님에게 질문하며 Class, Static, Public, 인스턴스화 등 추가로 공부하게 되었다.

image


2) 한글이 깨지는 현상

인코딩방식 확인법 .sc 메모장으로 열어 우측하단 에서 확인 , 한글을 지원하는 인코딩방식 -> UTF-8 로 설정 image

인코딩방식 변경법
1.  기존 파일 변경
다른이름으로 저장 -> 인코딩하여 저장 utf-8로

2.  새 파일 생성 시
editorconfig 파일을 이용, 프로젝트 내부에 .editorconfig 파일을 생성
Visual Studio를 열고 도구 -> 옵션 -> 텍스트 편집기 -> C# -> 코드 스타일 -> 생성된 파일에 코드 추가
image

// 생성된 파일에 코드 추가  
[*]
charset = utf-8
  • 생성된 파일에 코드 추가



List에 대하여

C#에서 List는 메모리상 1열로 존재한다 배열에 가깝다.
list는 동적으로 크기를 조정할 수 있는 배열
요소를 추가하거나 삭제 시 새로운 배열 생성 후, 기존의 요소들을 복사하는 작업을 수행

내부적으로 배열의 크기를 늘리거나 줄이는 작업을 수행한다. 처음 요소 추가시 4증가 DefaultCapacity = 4; image
Capacity가 Length보다 작으면 Capacity가 2배로 증가 image

2배로 증가 확인

    List<int> list = new List<int>();
    Console.WriteLine("Capacity : " + list.Capacity);
    list.AddRange(new int[4] { 1, 2, 3, 4 });
    Console.WriteLine("Capacity : " + list.Capacity);
    list.Add(1);
    Console.WriteLine("Capacity : " + list.Capacity);
    list.Add(1); list.Add(1); list.Add(1); list.Add(1);
    Console.WriteLine("Capacity : " + list.Capacity);
    Console.WriteLine("Count : "+list.Count);
  • image








4. 정리, 잡담

코드컨벤션 강의 내용

  • 어제 코드컨벤션 강의 내용, 협업 꿀팁
  • 정리 List, Capacity에 대하여 더 알게 되었다.

콘솔 커서 위치

  • Console.SetCursorPosition: 이 함수는 콘솔 창에서 커서의 위치를 설정합니다.
  • 출력의 정확한 위치를 제어하고 싶을 때 사용됩니다.
  • exConsole.SetCursorPosition(10, 5);
  • 오버로딩 : 매개변수의 개수, 타입, 순서가 다른 동일한이름의 여러 메서드
  • 구조체 : struct 키워드



잡담
오늘 1시쯤 컴터가 꺼졋다. 저장은 되어 있어서 다행이었다.
2주차 공부 중 클래스, static이 궁금해서 튜터님에게 물어보러 갔다. 이해를 못 해서 죄송했다. 3강을 듣고 갔다면 더 좋았을 거 같았다. 그렇지만 2강 숙제를 안 한 상태라 3강을 못 들었고 3강에 클래스가 있는지도 보지 못했었다. 너무 아쉽다.

이번 틱택톡을 하고 풀이를 본 후 느낀 게 많다. 많이 부족할 걸 느꼈고, 어떻게 하면 더 코드를 잘 짤 수 있을까? 그냥 내 생각을 그대로 코드로 만들고 풀이를 보는 게 나에게 도움이 될까? 아니면 구글링해서 좋은 코드들을 보고 하는 게 좋지 않을까? 전자는 너무 시간 낭비가 아닐까? 방법이 잘못된 걸까? 완성했다고 끝이아닌 리팩터링 생각을 하자, 조건을 만들 때 좀 더 단축해서. 생각을 하자. 생각이 많은 날이었다.

공부한 지 오래돼서 조금씩 생각은 나지만 정확하게 모르는 상황이다. 지금 강의가 다 했던거고 머리에 들어오고 이해는 된다. 시간이 많으니 기본을 탄탄하게 다지는 시간이라 생각하고 천천히 자세하게 배우고싶다.

항상 하나의 숙제, 프로젝트 등을 하고 나면 느끼는 거지만 지금 잘 하고 있는 건지, 어느 부분이 어떻게 수정되면 좋은지 궁금하고 답답하다.. 하나씩 할 때마다 얻어 가는 게 많지만, 놓치는 부분도 있을 거라 생각한다. 항상 아쉽지만 생각한 대로 나오면 기분이 좋으면서 다른 좋은 코드들을 보면 또 많이 부족하다고 느낀다.




[Unity] TIL 8


참고 : 유니티 TOP


📔

댓글남기기