[231229]TIL

응징·2023년 12월 29일
0

TIL

목록 보기
7/36
post-thumbnail

형변환

int num1 = int.Parse(변수1);
int num2 = int.Parse(변수2);

문자열이었던 변수를 정수형으로 num1,num2값에 넣어줄 수 있다. 앞서 실수를 정수로 변경했었는데, 이번에는 문자열로 숫자를 받았다면 정수로 변환해서 계산 해서 돌려줄수 있기 때문에 중요하다

비트 연산자

int a = 0b1100; // 12 (2진수)
int b = 0b1010; // 10 (2진수)

int and = a & b; // 0b1000 (8)
int or = a | b; // 0b1110 (14)
int xor = a ^ b; // 0b0110 (6)

int c = 0b1011; // 11 (2진수)
int leftShift = c << 2; // 0b101100 (44)
int rightShift = c >> 1; // 0b0101 (5)

int d = 0b1100; // 12 (2진수)
int bit3 = (d >> 2) & 0b1; // 1 (3번째 비트)
d |= 0b1000; // 0b1100 | 0b1000 = 0b1100 (12)

&: 두 값이 1일 때만 1반환 (나머지는 다 0)
|: 둘 중 하나라도 1이면 1반환 (0,0이면 0)
^: 두 비트의 값이 다를때만 1 같으면 0
<<: 보기 그대로 왼쪽에 두칸 밀기
(/).>>: 오른쪽으로 두칸밀기 이때 결과가 0101이 나오는데 아무래도 앞의 두자리 수는 기존걸 유지하는듯하다

진수 표기법

프로그래밍에선 앞에 몇진수인지 표기하는 듯하다.

0b = 2진수
0o = 8진수
0x = 16진수

0b0110 이라면 2진수 0110 = 6 이라는 뜻

문자열 처리기능

분할

string str = "Hello, World!";
string[] words = str.Split(',');

쉼표로 각각을 분할

검색

string str = "Hello, World!";
int index = str.IndexOf("World");

World를 검색해서 index에 저장한다는데 아직까지는 이 기능이 어떤때 쓰일지 감이 안잡힌다.
DB나 다른 분야는 몰라도 게임개발에선 처음부터 world로 문자열을 생성하면 그만일거 같은데

  • 아, 특정 단어 검열할때 쓰일듯하다

문자열 대소 비교

string str1 = "Apple";
string str2 = "Banana";
int compare = string.Compare(str1, str2);

string.Compare(); 은 더 큰것을 저장하는 함수인듯

문자열 크기비교는 사전식 비교를 한다. 사전에 더 뒤에 나올수록 더 높은것 문자열의 길이는 중요하지 않다고 한다. 문자열 크기 비교를 쓸 일이 있을까?

문자열 포멧팅

string name = "John";
int age = 30;
string message = string.Format("My name is {0} and I'm {1} years old.", name, age);

{0}, {1}에 순차적으로 뒤에 변수값을 삽입하는 듯

조건문과 반복문

삼항연산자

int Num1 = 1;
int Num2 = 2;
string 변수 = (Num1 > Num2) ? "참일때" : "참이 아닐때";
Console.WriteLine(변수);

int currentExp = 1200;
int requiredExp = 2000;

# 삼항 연산자
string result = (currentExp >= requiredExp) ? "레벨업 가능" : "레벨업 불가능";
Console.WriteLine(result);

결과는 "레벨업 불가능으로 if문과 비슷한 요과를 짧은 코드로 낼수 있다.

swich 중첩

int playerScore = 100;
string playerRank = "";

switch (playerScore / 10)
{
	case 10:
	case 9:
		playerRank = "Diamond";
		break;
	case 8:
		playerRank = "Platinum";
		break;
	case 7:
		playerRank = "Gold";
		break;
	case 6:
		playerRank = "Silver";
		break;
	default:
		playerRank = "Bronze";
		break;
}

case 10:
case 9:
playerRank = "Diamond";
break;

case10은 break를 만나지 않고 case9를 읽고나서 빠진다 이런 코드를 중첩 swich라고 하는듯

foreach

foreach (자료형 변수 in 배열 또는 컬렉션)
{
// 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}

string[] inventory = { "검", "방패", "활", "화살", "물약" };

foreach (string item in inventory)
{
    Console.WriteLine(item);
}

배열의 원소를 전부 훑어본다고 생각해두자

아니면 대입하는 느낌 [0]에 있는 검을 한번 대입하고 [1]에 있는 방패를 대입한결과를 전부 출력하고 있다고 생각하면 이해하기 편할지도

컬렉션

List

가변적인 크기를 갖는 배열(실질적으로 배열은 아니지만 편의상 그렇게 생각하라는 것)

Dictionary

딕셔너리(Dictionary)는 키와 값으로 구성된 데이터를 저장

Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("Alice", 100); //초기화 예

Stack

Stack은 후입선출(LIFO) 구조를 가진 자료 구조

Stack<int> stack1 = new Stack<int>();  // int형 Stack 선언

// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);

int value = stack1.Pop(); // value = 3 (

마지막에 들어간 것이 먼저 나온다.
점점 위로 쌓이는 구조 그래서 원소 하나를 꺼냈을때 젤 위의 원소(마지막에 넣었던) 가 나온다

Queue

Queue는 선입선출(FIFO) 구조를 가진 자료 구조

Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언

// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);

// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 

들어온 순으로 빠져나가는 양방형 구조인듯 하다 구멍이 위아래로 있고, 넣을땐 위에서 부터 넣고 빼낼 땐 밑에 있는것을 빼내는 듯.

함수 정리

[new Random().Next(0, 3)];

string computerChoice = choices[new Random().Next(0, 3)];

0~2까지의 숫자를 랜덤으로 뽑아냄

Console.ReadLine() --> [0],{1}

Console.Write("문자를 입력하세요: ");
char input = Console.ReadLine()[0];

입력한 문자열에 0번째 위치한 문자를 가져옴

Console.WriteLine("The sum of {0} and {1} is {2}.", num1, num2, sum);

순서대로 변수값을 대입해줌

참고로 {1}부터가 아니라 {0}부터 써야하는거 명시해야함. 이거때문에 오류메세지는 없는데 무한 컴파일 지옥에 있었다. 기억하자 배열도 리스트도 프로그래밍에선 0부터라는거

Console.writeLine( "\t")

"\t"는 문자열에서 쓸수있는 것으로 아마 띄어쓰기 정리인것 같긴한데 일정 간격으로 띄어준다

static void Main()
        {
            for (int i = 1; i < 9; i++)
            {
                for (int j = 2; j < 9; j++)
                {
                    Console.Write("{0} X {1} = {2}  ", i, j, i * j + "\t"); //정렬
                }

                Console.WriteLine();
            }
        }

리스트.Add(원소), 리스트.Remove(원소)

리스트.Add(원소); // 원소 추가
리스트.Remove(원소) // 해당 원소를 찾아 삭제

과제

숫자 맞추기 게임

static void Main(string[] args)
        {
            //숫자 맞추기 게임
            int Count = 0;
            Random rend = new Random();
            int AI = rend.Next(0, 101); //0부터 100까지의 숫자


            Console.WriteLine("숫자맞추기 게임을 시작 (0~100");



            while (true) //숫자 맞추기 반복진행
            {
                Console.Write("숫자를 입력하시오 : ");
                int Input = int.Parse(Console.ReadLine());  //읽어온것 바로 반환
				//int.TryParse는 어째선지 안됨. 왜?
                if (Input > 0 && Input < 101)
                {
                    Count++;
                    if (AI < Input)
                    {
                        Console.WriteLine("더 작습니다");
                    }
                    else if (AI > Input)
                    {
                        Console.WriteLine("더 큽니다");
                    }
                    else
                    {
                        Console.WriteLine("축하합니다 {0}번째로 맞추셨습니다", Count);
                        break; //맞추면 종료 반복문 빠져나감
                    }

                }
                else
                {
                    Console.WriteLine("0부터 100까지의 숫자중 입력해주세요");
                }

            }

        }

int Input = int.Parse(Console.ReadLine()); 이 줄에서 int.TryParse는 빨간줄이 뜨더라 어째서?

이 과제는 생각보단 어렵지 않았다. 예시를 많이 보여줘서 그런것 같기도

틱택토 ( 콘솔 )

로직 만드는게 생각보다 어렵진 않았지만 그놈의 예외처리가 문제였다.

틱택토는 숫자를 1에서부터9까지만 받아야 하고 문자는 받으면 안된다. 그리고 다시 콘솔로 보여질때는 O,X 문자를 보내야 해서 다시 문자열로 바꿔야 하고 생각보다 자료형 결정하는게 어려웠는데 그래서 그런지 예외처리 오류를 엄청나게 띄었다. 강의에서도 예외처리를 좀 강조하면서 설명했으면 좋았을까 싶다.

namespace System
{
    internal class Program
    {
        static string[] num = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        static int Player = 1;
        static string Input;
        static void Main(string[] args)
        {

            //틱택토 (콘솔) 게임 만들기

            int Input;

            Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
            Console.WriteLine(" ");
            game(); //게임판

            while (true)
            {
                
                //숫자 넣어놓기
                if(Player % 2 == 1)
                {
                    Console.Write("플레이어 1의 차례:");
                    if (int.TryParse(Console.ReadLine(), out Input)) // 입력이 정수로 변환 가능한지 확인
                    {
                        if (Input < 1 || Input > 9)
                        {
                            Console.WriteLine("숫자를 다시 입력해주시오. ");
                            Console.WriteLine(" ");
                            continue;
                        }
                        num[Input - 1] = "O";

                        game();

                        if (Wingame())
                        {
                            Console.WriteLine(" ");
                            Console.WriteLine("플레이어1 승리");
                        }

                        Player++;
                    }
                    else
                    {
                        Console.WriteLine("숫자를 입력해주세요.");
                        Console.WriteLine(" ");
                        continue;
                    }

                }
                if (Player % 2 == 0)
                {
                    Console.Write("플레이어 1의 차례:");
                    if (int.TryParse(Console.ReadLine(), out Input)) // 입력이 정수로 변환 가능한지 확인 한번 확인하는 함수
                    {
                        if (Input < 1 || Input > 9)
                        {
                            Console.WriteLine("숫자를 다시 입력해주시오. ");
                            Console.WriteLine(" ");
                            continue;
                        }
                        num[Input - 1] = "X";

                        game();

                        if (Wingame())
                        {
                            Console.WriteLine(" ");
                            Console.WriteLine("플레이어1 승리");
                        }

                        Player++;
                    }
                    else
                    {
                        Console.WriteLine("숫자를 입력해주세요.");
                        Console.WriteLine(" ");
                        continue;
                    }

                }

                if(Player == 10)
                {
                    Console.WriteLine("무승부");
                    break;
                }

                
            }
            
        }


        static void game() 
        {
            Console.WriteLine("     |     |     ");
            Console.WriteLine("  {0}  |  {1}  |  {2}  ",num[0], num[1], num[2]);
            Console.WriteLine("     |     |     ");
            Console.WriteLine("-----|-----|------");
            Console.WriteLine("     |     |     ");
            Console.WriteLine("  {0}  |  {1}  |  {2}  ", num[3], num[4], num[5]);
            Console.WriteLine("     |     |     ");
            Console.WriteLine("-----|-----|------");
            Console.WriteLine("     |     |     ");
            Console.WriteLine("  {0}  |  {1}  |  {2}  ", num[6], num[7], num[8]);
            Console.WriteLine("     |     |     ");

            Console.WriteLine(" ");

        }


        static bool Wingame() //이긴 판정
        {

            //가로로 빙고
            if((num[0] == num[1]&& num[1]== num[2])||
                (num[3] == num[4] && num[4] == num[5])||
                (num[6] == num[7] && num[7] == num[8]))
            {
                return true;
            }
            //세로로 빙고
            else if ((num[0] == num[3] && num[3] == num[6]) ||
                (num[1] == num[4] && num[4] == num[7]) ||
                (num[2] == num[5] && num[5] == num[8]))
            {
                return true;
            }
            //가로로 빙고
            else if ((num[0] == num[4] && num[4] == num[8]) ||
                (num[2] == num[4] && num[4] == num[6]))
            {
                return true;
            }
            else
            {
                return false;
            }

        }




    }
}

결국 완성하긴 했다. TryParse() 함수로 해결됐다.
TryParse()는 입력이 정수로 변환 가능한지 확인하고 Input에 넣어준다.

(+)

F10을 누르면 드레그 된 코드에 다음 행보를 알수 있음 (기억해두는게 좋을듯)

여러줄 주석처리 된 것을 한꺼번에 지우려면 Ctrl+K+U

profile
Unity 개발 위주로 정리합니다

0개의 댓글