no image
사전캠프 3일차 [게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발], 오목 게임 팀플 기획(개인 작성)
1. 오늘 학습 키워드[게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발] 강의 학습, 오목 게임 팀플 기획2. 오늘 학습 한 내용을 나만의 언어로 정리하기void Start(){ Application.targetFrameRate = 60;}보통 Start() 안에 넣어서 게임 시작 시 프레임을 설정한다.프레임을 60프레임으로 제한함.3. 학습하며 겪었던 문제점 & 에러문제&에러에 대한 정의내가 한 시도해결 방법새롭게 알게 된 점이 문제&에러를 다시 만나게 되었다면4. 내일 학습 할 것게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발 1주차 이상5. 메모1. 오목의 기본 개념 정리(공통 작업)(개인 작성)[Step 1] 오목이란?오목이란?게임의 장르 : 보드 게임, 전략 게임기본적인 목표: ..
2025.06.26
no image
사전캠프 2일차 [기초 문법 복습 + 달리기반 Lv1, Lv2, Lv3]
1. 오늘 학습 키워드기초 문법 복습, 달리기반 Lv1, Lv2 풀기2. 오늘 학습 한 내용을 나만의 언어로 정리하기달리기반 Lv1, Lv2, Lv3using System;using System.Collections.Generic;using System.Linq;using System.Text;//------------------------------------------------------------------------------------------------------------------------////기본 문법 복습//팀원에게 스위치 케이스문 질문을 받았는데 나는 그냥 일반적인 숫자나 변수값이 들어가도 되는 줄 알았다//하지만 알아보니 리터럴 상수값이 들어간다고 한다 처음에는 리터럴 상수가..
2025.06.24
no image
사전캠프 1일차 [OT+팀원소개+기초 문법 톺아보기]
1. 오늘 학습 키워드기초 문법 톺아보기2. 오늘 학습 한 내용을 나만의 언어로 정리하기using System;using System.Collections.Generic;using System.Linq;using System.Text;//------------------------------------------------------------------------------------------------------------------------////입력과 출력//출력Console.WriteLine("Hello");//숫자 입력int number = int.Parse(Console.ReadLine());Console.WriteLine($"You entered: {number}");// Parse -..
2025.06.23
no image
Unreal Learning - Agents FPS Anemy 12(언리얼 머신러닝 FPS 적)
https://awesome-columnist-586.notion.site/Unreal-Learning-Agents-FPS-Anemy-12-c532b8c4f2144fd78680b7484a748393?pvs=4 Unreal Learning - Agents FPS Anemy 12 | Notion일단 BP_LearningInteractorR 의 Specify Agent Observation에서 오류가 난거같다 처음 실행할때는 오류가 안났었는데 찾아보니 컴파일이 제대로 되어있지 않았다.awesome-columnist-586.notion.site
2025.01.31
no image
Unreal Learning - Agents FPS Anemy 11(언리얼 머신러닝 FPS 적)
https://awesome-columnist-586.notion.site/Unreal-Learning-Agents-FPS-Anemy-11-2f89e95292af4b6ba3b1ce49b4db33d6?pvs=4 Unreal Learning - Agents FPS Anemy 11 | Notion함수 오버라이드 - GatherAgentCompletionawesome-columnist-586.notion.site
2025.01.31
no image
프로그래머스/C++ 배열 만들기 1
문제 설명정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.제한사항1 ≤ n ≤ 1,000,0001 ≤ k ≤ min(1,000, n)입출력 예n k result103[3, 6, 9]155[5, 10, 15]입출력 예 설명입출력 예 #11 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.입출력 예 #21 이상 15 이하의 5의 배수는 5, 10, 15 이므로 [5, 10, 15]를 return 합니다.#include #include using namespace std;vector solution(int n, int k) { vector answer; ..
2025.01.31
no image
프로그래머스/C++ 9로 나눈 나머지
문제 설명음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.제한사항1 ≤ number의 길이 ≤ 100,000number의 원소는 숫자로만 이루어져 있습니다.number는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.입출력 예number result"123"6"78720646226947352489"2입출력 예 설명입출력 예 #1예제 1번의 number는 123으로 각 자리 숫자의 합은 6입니다. 6을 9로 나눈 나머지는 6이고, 실제로 123 = 9 × 13 + 6입니다. 따라..
2025.01.31
no image
프로그래머스/C++ 짝수와 홀수
문제 설명정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.제한 조건num은 int 범위의 정수입니다.0은 짝수입니다.입출력 예num return3"Odd"4"Even"#include #include using namespace std;string solution(int num) { string answer = ""; if(num%2==0) answer = "Even"; else answer = "Odd"; return answer;}
2025.01.31
반응형

1. 오늘 학습 키워드

[게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발] 강의 학습, 오목 게임 팀플 기획


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

void Start()
{
    Application.targetFrameRate = 60;
}
  • 보통 Start() 안에 넣어서 게임 시작 시 프레임을 설정한다.
  • 프레임을 60프레임으로 제한함.

3. 학습하며 겪었던 문제점 & 에러

  • 문제&에러에 대한 정의
  • 내가 한 시도
  • 해결 방법
  • 새롭게 알게 된 점
  • 이 문제&에러를 다시 만나게 되었다면

4. 내일 학습 할 것

게임 개발이 처음이어도 쉽게 배우는 모바일 게임 개발 1주차 이상


5. 메모


1. 오목의 기본 개념 정리(공통 작업)(개인 작성)

[Step 1] 오목이란?

  1. 오목이란?
    • 게임의 장르 : 보드 게임, 전략 게임
    • 기본적인 목표: 자신의 돌을 가로, 세로, 대각선으로 연속 5개로 놓아 먼저 승리하는 것.
  2. 게임에 사용되는 요소
    • 15x15 또는 19x19 크기의 바둑판
    • 흑돌과 백돌 (두 명의 플레이어가 번갈아 가며 돌을 둠)
    • 선공은 일반적으로 흑돌
  3. 기본적인 진행 방식
    • 번갈아가며 한 수씩 돌을 놓음
    • 한 번 둔 돌은 다시 움직일 수 없음
    • 상대보다 먼저 5개의 돌을 연속으로 배열하면 승리
  4. 승리 조건 & 패배 조건
    • 승리 조건 : 같은 색의 돌을 5개 연속으로 두면 승리
    • 패배 조건 : 상대가 먼저 5개를 잇거나 금수 규칙 위반 시 패배

2. 게임의 룰과 상세 규칙 계획

[Step 2] 오목의 기본 규칙 정리

  1. 기본 규칙
    • 두 명의 플레이어가 번갈아 돌을 둠
    • 돌을 교차점에 둠 (격자 위)
    • 돌은 한 번 놓으면 이동 불가
  2. 승리 조건과 게임 종료 방식
    • 같은 색 돌을 가로/세로/대각선으로 5개 연속 놓으면 승리
    • 5개 이상이어도 무효가 아닌 일반 오목에서는 승리로 인정 (백 기준, 흑은 X)
  3. 특수 규칙 적용 여부
    • 금수 룰 적용 여부 (흑만 적용)
      • 33 금수: 한 수로 열린 세목(3개 연결) 2개 이상 만들면 무효
      • 44 금수: 한 수로 열린 네목(4개 연결) 2개 이상 만들면 무효
      • 6목 금지: 6개 이상 연결하면 무효 (5개까지만 허용)

3. 팀별 새로운 게임 요소 추가하기

[Step 3] 기존 오목에서 차별화된 요소 기획

  1. 기존 오목과 차별점을 만들 요소를 정의하세요.
    • 스킬 시스템 도입 : 게임 중 특정 횟수에 한해 사용할 수 있는 스킬
      • 상대 돌 하나 제거
      • 본인 돌 2개 연속 놓기
      • 상대 시간 절반으로 줄이기
  2. 게임의 핵심 재미를 한 문장으로 정의하세요.
    • “순간 판단력과 전략, 스킬 활용으로 반전을 만들어내는 오목”
  3. 추가적인 게임 규칙이 필요한가요?
    • 스킬은 게임당 3회 사용 가능
    • 스킬 종류는 게임 시작 전 선택

4. 최종 기획 문서 정리 & 팀 발표

[Step 4] 기획 문서 작성

🔷 게임 개요

  • 게임명: 스킬 오목 (Skill Gomoku)
  • 장르: 전략 보드 게임
  • 플레이 방식: 1:1 대전
  • 플랫폼: PC / 모바일

🔷 게임 진행 방식

  • 플레이어는 번갈아가며 돌을 놓는다
  • 각 플레이어는 고유 스킬 1개씩을 보유하며, 총 3회 사용 가능
  • 스킬 사용은 자신의 턴 시작 시 결정
  • 강화 타일 위에 돌을 놓으면, 다음 1턴 동안 해당 수는 금수 룰 무시

🔷 추가적인 게임 규칙

  • 금수 룰은 기본 적용 (33, 44, 6목)
  • 스킬 종류:
    • 🔥 "돌파" – 금수 룰 1턴 무시
    • ❌ "파괴" – 상대 돌 하나 제거
    • ⏱️ "재촉" – 상대 턴 시간 절반으로 제한

🔷 팀별 차별화 요소

  • 전통적인 오목의 사고력 + 스킬 기반의 전략성 강화

[선택 포함 내용]

  • 게임 시나리오 예시
  • 예상되는 사용자 경험



알까기 삼목

📌 1. 오목의 기본 개념 정리

✅ 오목이란?

  • 게임의 장르: 보드 전략 게임
  • 기본적인 목표: 가로, 세로, 대각선 방향으로 자신의 돌 5개를 연속으로 배치하여 승리

📌 2. 알까기 삼목 기본 규칙

✅ 게임에 사용되는 요소

  • 원형 보드(또는 격자형 바둑판)
  • 흑/백 알 (물리적으로 튕길 수 있음)
  • 마우스로 알을 튕기는 조작

✅ 기본적인 진행 방식

  • 플레이어는 번갈아가며 자신의 알을 튕겨서 보드에 놓음
  • 알은 바닥에서 굴러가며 다른 알에 부딪히거나, 보드 밖으로 나갈 수 있음
  • 정확한 위치 조준 및 세기 조절이 필요함
  • 알이 보드 밖으로 떨어지면 무효 처리, 다시 놓을 수 없음

📌 3. 승리 조건 및 특수 규칙

✅ 승리 조건

  • 보드 위에 남아 있는 자신의 알 중에서 연속 5개가 가로, 세로, 또는 대각선으로 연결되면 승리
  • 튕겨서 의도하지 않게 연결될 수도 있고, 상대의 알을 밀어내며 전략적으로 배치 가능

✅ 패배 조건

  • 상대가 먼저 연속 5개를 만들면 패배
  • 자신의 알을 너무 많이 보드 밖으로 날려서 불리해지면 패배 가능성 ↑

✅ 특수 규칙 (선택 적용 가능)

  • 튕기기 제한 시간: 한 턴당 10초
  • 알 수 제한: 각 플레이어는 10개의 알만 사용 가능
  • 자기 알로 자기 알 밀기 가능 / 상대 알 밀어내기도 가능
  • 한 번에 여러 개의 알이 밀리거나 튕겨나가도 허용

📌 4. 게임 차별점 및 재미 요소

✅ 기존 오목과의 차별점

항목 기존 오목 알까기 오목

방식 클릭/두기 튕기기 (물리 조작)
전략성 고정된 위치 계산 위치 + 물리 반응 예측
재미 포인트 정적인 수 싸움 예측 불가한 물리 반응, 반전 가능성
룰 완성도 정제된 룰 창의적, 신선한 룰 적용

✅ 게임의 핵심 재미 정의

“정확한 컨트롤과 전략으로 알을 튕겨 5목을 완성하는 역동적인 오목!”


📌 5. 최종 기획 문서 요약

🔷 게임 개요

  • 게임명: 알까기 오목
  • 장르: 보드 + 피직스 기반 전략 게임
  • 플레이 인원: 2명
  • 방식: 번갈아가며 알을 튕겨 보드에 배치

🔷 진행 방식 요약

  • 손 또는 마우스로 알을 튕겨 보드에 놓는다
  • 이미 놓인 알을 맞춰 이동시킬 수 있다 (전략적 충돌 가능)
  • 보드 밖으로 나가면 해당 알은 무효

🔷 추가 규칙

  • 튕기기 시간 제한 (10초)
  • 제한된 수의 알만 사용 가능
  • 5목이 먼저 완성되면 즉시 승리

📌 6. 예상 사용자 경험

  • 직관적인 재미: 누구나 쉽게 튕기기 시작
  • 실력 기반 경쟁: 손 조작의 정확성 + 전략적 사고
  • 웃음 유발: 예측 불가한 물리 반응으로 예상치 못한 전개
  • 빠른 템포: 턴 간 템포가 빠르고 실시간성 있음
반응형
반응형

1. 오늘 학습 키워드

기초 문법 복습, 달리기반 Lv1, Lv2 풀기


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

달리기반 Lv1, Lv2, Lv3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//------------------------------------------------------------------------------------------------------------------------//
//기본 문법 복습

//팀원에게 스위치 케이스문 질문을 받았는데 나는 그냥 일반적인 숫자나 변수값이 들어가도 되는 줄 알았다
//하지만 알아보니 리터럴 상수값이 들어간다고 한다 처음에는 리터럴 상수가 뭔지 제대로 이해하지 못했다
//리터럴 상수 == 코드에 직접 적은 값 이라고 한다. 결국 우리가 그냥 사용하는 숫자다.
//switch문의 case에 들어가는 값은 반드시 상수여야한다(예 : 리터럴, const, enum 등)

Console.Write("값을 입력해주세요 : ");

int number = int.Parse(Console.ReadLine());

Console.WriteLine("입력된 값 " + number);

switch (number)
{
    case 1: //이건 지금 리터럴 상수로 사용된 것
        Console.WriteLine("1번이 선택되었습니다.");
        break;
    case 2:
        Console.WriteLine("2번이 선택되었습니다.");
        break;
}

//case에는 변수값이 들어갈 수 없고 리터럴 상수와 같이 사용하면 된다.

//------------------------------------------------------------------------------------------------------------------------//
//Lv1. 홀수 출력
//1부터 100까지의 숫자 중에서 홀수만 출력하는 프로그램을 작성하세요.
//1. for문을 사용해 홀수를 출력하세요.

Console.WriteLine("for문 1~100사이 홀수 값 출력");
for(int i=1; i<=100; i++)
{
    if(i%2 != 0)
    {
        Console.Write(i + " ");
    } 
}
Console.WriteLine();
Console.WriteLine();

//2. while문을 사용해 홀수를 출력해 주세요.
Console.WriteLine("while문 1~100사이 홀수 값 출력");
int num = 1;
while(num <= 100)
{
    if (num % 2 != 0)
    {
        Console.Write(num + " ");
    }
    num++;
}
Console.WriteLine();
Console.WriteLine();

//3. do-while문을 사용해 홀수를 출력해주세요.
Console.WriteLine("do-while문 1~100사이 홀수 값 출력");
int k = 1;
do
{
    if (k % 2 != 0)
    {
        Console.Write(k + " ");
    }
    k++;
} while (k <= 100);

//------------------------------------------------------------------------------------------------------------------------//
//Lv1. 배열을 사용한 합계 및 평균 계산
int[] numbers = { 10, 20, 30, 40, 50 };
int sum = 0;

for(int i=0; i<numbers.Length; i++)
{
    sum += numbers[i];
}
int ave = sum / numbers.Length;

Console.WriteLine("합계 : " + sum);
Console.WriteLine("평균 : " + ave);

//------------------------------------------------------------------------------------------------------------------------//
//Lv2. 팩토리얼 계산

Console.WriteLine("팩터리얼 계산");
Console.Write("값 입력 : ");
int number = int.Parse(Console.ReadLine());
int sub = 1;

for(int i= number; i>=1; i--)
{
    sub *= i;
}

Console.WriteLine("값 : " + sub);

//------------------------------------------------------------------------------------------------------------------------//
//LV2. 숫자 맞추기 게임

Console.WriteLine("숫자 맞추기 게임");

Random random = new Random();
int randomNum = random.Next(1, 101);

while (true)
{
    Console.Write("번호 입력 : ");
    int sel = int.Parse(Console.ReadLine());
    if(randomNum == sel)
    {
        Console.WriteLine("정답!!");
        break;
    }
    else if(randomNum > sel)
    {
        Console.WriteLine("선택한 값보다 큽니다.");
    }
    else if(randomNum < sel)
    {
        Console.WriteLine("선택한 값보다 작습니다.");
    }
}

//------------------------------------------------------------------------------------------------------------------------//
//Lv2. 이중 반복문을 사용한 구구단 출력

//가로로 출력
for(int i=1; i<=9; i++)
{
    for(int j=2; j<=9; j++)
    {
        Console.Write(j + "x" + i +"=" + (i*j) + "  ");
    }
    Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();

//세로로 출력
for (int i = 2; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        Console.Write(i + "x" + j + "=" + (i * j) + "  ");
    }
    Console.WriteLine();
}

//------------------------------------------------------------------------------------------------------------------------//
//Lv2. 배열 요소의 최대값과 최소값 찾기

int[] numbers = { 10, 20, 30, 40, 50 };

int min = numbers[0];
int max = numbers[0];

for (int i = 0; i < numbers.Length; i++)
{
    for (int j = 0; j < numbers.Length; j++)
    {
        if (numbers[j] < min) { min = numbers[j]; }
        if (numbers[j] > max) { max = numbers[j]; }
    }
}

Console.WriteLine("최대값 : " + max);
Console.WriteLine("최소값 : " + min);

//------------------------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------------------------//
//Lv3. 행맨 게임
string secretWord = "hangman";
char[] guessWord = new char[secretWord.Length];
int maxAttempts = 6;
int attempts = 0;
bool wordGuessed = false;

for (int i=0; i<guessWord.Length; i++)
{
    guessWord[i] = '_';
}

while (attempts < maxAttempts && !wordGuessed)
{
    Console.WriteLine("현재 단어 : " + new string(guessWord));
    Console.Write("문자를 입력해주세요 : ");
    char input = Console.ReadKey().KeyChar; //char 입력받기 몰랐던 부분.
    Console.WriteLine();

    bool correctGuess = false;

    
    for(int i=0; i< secretWord.Length; i++)
    {
        if (secretWord[i] == input && guessWord[i] == '_')
        {
            guessWord[i] = input;
            correctGuess = true;
        }
    }

    if (!correctGuess)
    {
        attempts++;
        Console.WriteLine("틀렸습니다. 남은 기회 : " + (maxAttempts-attempts));
    }

    wordGuessed = true;
    for (int i = 0; i < secretWord.Length; i++)
    {
        if (guessWord[i] != secretWord[i])
        {
            wordGuessed = false;
            break;
        }
    }

}

if (wordGuessed)
{
    Console.WriteLine("단어를 맞췄습니다!" + secretWord);
}
else
{
    Console.WriteLine("기회를 모두 소진하였습니다. 정답은 :" + secretWord);
}

//------------------------------------------------------------------------------------------------------------------------//
//Lv3. 숫자 야구 게임

Random random = new Random();
int[] targetNumber = new int[3];

// 중복 없는 3자리 숫자 생성
int index = 0;
while (index < 3)
{
    int num = random.Next(1, 10);
    bool isDuple = false;

    for (int i = 0; i < index; i++)
    {
        if (targetNumber[i] == num)
        {
            isDuple = true;
            break;
        }
    }

    if (!isDuple)
    {
        targetNumber[index] = num;
        index++;
    }
}

bool isGuessUser = false;

while (!isGuessUser)
{
    int[] userGuess = new int[3];

    for (int i = 0; i < 3; i++)
    {
        Console.Write($"유저 번호 선택 {i + 1}번째 : ");
        userGuess[i] = int.Parse(Console.ReadLine());
    }

    Console.Write("선택한 번호 : ");
    for (int i = 0; i < 3; i++)
        Console.Write(userGuess[i] + " ");
    Console.WriteLine();

    int strikes = 0;
    int balls = 0;

    for (int i = 0; i < 3; i++)
    {
        if (userGuess[i] == targetNumber[i])
        {
            strikes++;
        }
        else if (Array.Exists(targetNumber, x => x == userGuess[i]))
        {
            balls++;
        }
    }

    Console.WriteLine($"{strikes} 스트라이크, {balls} 볼");
    Console.WriteLine();
    Console.WriteLine();

    if (strikes == 3)
    {
        Console.WriteLine("정답입니다!");
        isGuessUser = true;  // ← 게임 종료 플래그
    }
}


3. 학습하며 겪었던 문제점 & 에러 / 새롭게 알게 된 점 정리

✅ 1. switch문에서 변수 사용이 안 되는 이유

  • switch문의 case에는 반드시 컴파일 타임 상수 값만 들어가야 한다.
    • 사용 가능한 값: 리터럴(literal), const로 정의된 상수, enum 값 등
  • 평소에 숫자를 그냥 넣어서 사용했기 때문에 변수도 되겠지라고 착각했지만, 실제론 case에서 변수 사용 시 컴파일 에러 발생
  • ❌ 예시 (에러):
  • int a = 1; switch(x) { case a: // ❌ 오류! a는 런타임 변수 }
  • ✅ 예시 (정상):
  • const int a = 1; switch(x) { case a: // ✅ 컴파일 타임 상수 사용 가능 }

✅ 2. 리터럴 상수(Literal Constant)의 개념

  • 리터럴 상수란 코드에 직접 작성한 값
    • 예: 1, 'A', "Hello", true
  • case 1:, case 'A':처럼 우리가 자주 쓰는 숫자나 문자는 리터럴이기 때문에 사용 가능
  • 반면, 일반 변수는 값이 바뀔 수 있으므로 case에서 사용할 수 없음

✅ 3. Console.ReadKey().KeyChar – char 한 글자 입력받기

  • 기존에 Console.ReadLine()만 사용했기 때문에 문자 단위 입력 처리 방법을 몰랐음
  • Console.ReadKey().KeyChar를 사용하면 한 글자를 즉시 입력받을 수 있음
  • 유용한 경우: 메뉴 선택, 키 입력 처리, 게임 입력 등
  • Console.Write("입력: "); char input = Console.ReadKey().KeyChar; Console.WriteLine("\\n입력한 문자: " + input);

✅ 4. Array.Exists() – 배열 안에 값이 있는지 확인

  • Array.Exists(array, x => x == 값) 형태로 사용
  • for문을 쓰지 않고도 배열에 값이 존재하는지 간단히 확인 가능
  • 숫자 야구 게임에서 볼(Ball) 판별 시 사용했음
  • if (Array.Exists(targetNumber, x => x == userGuess[i])) { balls++; }

✅ 느낀 점 요약

  • switch-case 문법에서 컴파일 타임 상수의 중요성을 명확히 알게 됨
  • ReadKey()를 통해 빠른 문자 입력 방식을 익히고 활용 가능성을 느낌
  • Array.Exists()처럼 람다식을 활용한 배열 검색 방법이 코드 간결화에 효과적임을 깨달음

4. 내일 학습 할 것

  • 유니티 강의수강

5. 메모

새로운 팀원 추가!!

홍기정 - 93년생 원래 C#을 사용했었고 유니티도 조금 공부했었다.

김혜수 - 91년생 UI,UX를 하다가 유니티를 배워보려고 왔다.

원래 달리기반 Lv1, Lv2만 풀려고 했지만 시간이 남아서 Lv3 까지 풀어봤다. 하지만 쉽지 않았다 모르는 문법도 있었고 아직 갈 길이 먼거같다. 역시 개발자는 겸손할 수 밖에 없는 직업.. 하나씩 차근차근히 잘 배워보자!!!


반응형
반응형

1. 오늘 학습 키워드

기초 문법 톺아보기


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//------------------------------------------------------------------------------------------------------------------------//
//입력과 출력

//출력
Console.WriteLine("Hello");

//숫자 입력
int number = int.Parse(Console.ReadLine());
Console.WriteLine($"You entered: {number}");
// Parse - string형만 받음 - null값이여도 안됨
// Convert.Toint32() - object등 여러 타입으로 사용 가능하다 null값이면 0으로 값을 받음
//------------------------------------------------------------------------------------------------------------------------//
//Loop 반복문
//for, while, do-while문이 있다.
//do-while 문
//조건을 나중에 평가하므로 코드 블록이 최소 한 번 실행됩니다.
//------------------------------------------------------------------------------------------------------------------------//
//조건문
//if, else if, else가 있다.
//------------------------------------------------------------------------------------------------------------------------//
//배열

//배열 선언과 초기화
int[] numbers = new int[5]; // 크기가 5인 정수 배열 선언
numbers[0] = 10; // 첫 번째 요소에 값 10 저장
numbers[1] = 20; // 두 번째 요소에 값 20 저장

// 배열 선언과 동시에 초기화
int[] numbers2 = { 10, 20, 30, 40, 50 };

//배열 접근과 순회
int[] numbers3 = { 10, 20, 30, 40, 50 };
for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}
//------------------------------------------------------------------------------------------------------------------------//
//클래스

//클래스 정의와 객체 생성 방법
class Person
{
    public string Name;
    public int Age;

    public void Introduce()
    {
        Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
    }

    static void Main(string[] args)
    {
        // 클래스 사용 예제
        Person person = new Person();
        person.Name = "John";
        person.Age = 30;
        person.Introduce();
    }
}
//여태 유니티로 클래스를 사용했었지만 static void Main(string[] args)를 C#에서 직접 코드를 작성할때 써야할줄은 몰랐다.
//------------------------------------------------------------------------------------------------------------------------//
//상속

//상속 예제
class Animal
{
    public void Eat()
    {
        Console.WriteLine("Eating...");
    }
}
class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Barking...");
    }

    static void Main(string[] args)
    {
        // 상속 사용 예제
        Dog dog = new Dog();
        dog.Eat();
        dog.Bark();
    }
}
//------------------------------------------------------------------------------------------------------------------------//
//인터페이스
//인터페이스는 클래스나 구조체가 구현해야 하는 메서드와 속성의 정의를 포함합니다. C#에서는 인터페이스를 다중 상속할 수 있습니다.

//인터페이스 정의와 구현

interface IAnimal
{
    void MakeSound();
}

class Dog2 : IAnimal
{
    public void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    static void main(string[] args)
    {
        // 인터페이스 사용 예제
        IAnimal animal = new Dog2();
        animal.MakeSound();
    }
}
//클래스 상속은 구현 상속, 인터페이스는 기능 약속이다.
//------------------------------------------------------------------------------------------------------------------------//
//추상 클래스
//추상 클래스는 인스턴스화될 수 없으며, 상속을 통해서만 사용될 수 있습니다. 추상 메서드를 포함할 수 있습니다.

abstract class Animal3
{
    public abstract void MakeSound();
}

class Dog3 : Animal3
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    static void main(string[] args)
    {
        // 추상 클래스 사용 예제
        Animal3 animal = new Dog3();
        animal.MakeSound();
    }
}

//추상 클래스의 주요 이점
//1. 공통 로직을 재사용할 수 있다 (일반 메서드 포함 가능)
abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("숨 쉰다");  // 모든 동물이 숨 쉬니까!
    }
    public abstract void MakeSound();  // 동물마다 울음소리는 다르니까 직접 구현하도록 강제
}

//2. 상속받는 클래스에 "반드시 구현해야 하는 메서드"를 강제할 수 있다
abstract class Animal
{
    public abstract void MakeSound();  // 반드시 구현
}
class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}

//3. 기초 구조는 정하고, 세부는 유연하게
abstract class Character
{
    public void TakeTurn()
    {
        Console.WriteLine("턴 시작");
        Attack();
        Console.WriteLine("턴 종료");
    }
    public abstract void Attack();
}

//4. 인터페이스와 달리 상태(필드)와 구현을 가질 수 있다
interface IThing
{
    int count = 0; // ❌ 컴파일 에러!
    void Do();     // ✔ 메서드 정의만 가능
}

//추상 클래스는 필드, 생성자, 메서드 모두 가질 수 있다.
abstract class Thing
{
    protected int count = 0;

    public void Increase() => count++;

    public abstract void Do();  // 자식 클래스에서 반드시 구현
}
//------------------------------------------------------------------------------------------------------------------------//
//가상 메서드 (Virtual Methods)
//가상 메서드는 자식 클래스에서 재정의할 수 있는 부모 클래스의 메서드이다.
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    static void main(string[] args)
    {
        // 가상 메서드 사용 예제
        Animal animal = new Dog();
        animal.MakeSound();
    }
}

//------------------------------------------------------------------------------------------------------------------------//
//랜덤 숫자 생성 (Random Number Generation)

//Random 클래스 사용
Random random = new Random();
int randomNumber = random.Next(); // 0과 int.MaxValue 사이의 난수 생성
int randomNumberInRange = random.Next(1, 101); // 1과 100 사이의 난수 생성

//랜덤 숫자 생성 예제
Random random = new Random();
int randomNumber = random.Next(1, 101);
Console.WriteLine($"Random number between 1 and 100: {randomNumber}");
//------------------------------------------------------------------------------------------------------------------------//
//문자열 처리

//문자열 생성 및 초기화
string message = "Hello, World!";

//문자열 길이 확인 - 문자열의 길이는 Length 속성을 사용하여 확인할 수 있습니다.
string message = "Hello, World!";
int length = message.Length; // 13

//문자열 비교 - == 연산자나 Equals 메서드를 사용하여 문자열을 비교할 수 있습니다.
string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2; // false
bool isEqualMethod = str1.Equals(str2); // false

//부분 문자열 추출 - Substring 메서드를 사용하여 문자열의 일부를 추출할 수 있습니다.
string message = "Hello, World!";
string hello = message.Substring(0, 5); // "Hello"

//문자열 분할 - Split 메서드를 사용하여 문자열을 특정 구분자로 나눌 수 있습니다.
string message = "Hello, World!";
string[] words = message.Split(','); // { "Hello", " World!" }

//문자열 합치기 - + 연산자나 String.Concat 메서드를 사용하여 문자열을 합칠 수 있습니다.
string str1 = "Hello";
string str2 = "World";
string message = str1 + ", " + str2 + "!"; // "Hello, World!"

//문자열 포맷팅 - String.Format 메서드를 사용하여 문자열을 포맷팅할 수 있습니다.
string name = "John";
int age = 30;
string message = String.Format("Name: {0}, Age: {1}", name, age); // "Name: John, Age: 30"

//문자 배열 변환 - 문자열을 문자 배열로 변환하거나, 그 반대 작업을 할 수 있습니다.
string message = "Hello";
char[] chars = message.ToCharArray(); // { 'H', 'e', 'l', 'l', 'o' }
string newMessage = new string(chars); // "Hello"
//------------------------------------------------------------------------------------------------------------------------//
//out과 ref
//C#에서 out과 ref 키워드는 메서드에 인수로 전달된 변수를 참조로 전달하는 데 사용됩니다. 둘 다 메서드 내부에서 값을 변경할 수 있으며,
//메서드 호출 후에도 변경된 값이 반영됩니다.

//out
//사용 예: 메서드가 여러 값을 반환해야 할 때 유용합니다.
//특징:
//메서드가 반환하기 전에 반드시 값을 할당해야 합니다.
//호출할 때 초기화되지 않아도 됩니다.

//예제
void GetValues(out int x, out int y)
{
    x = 10;
    y = 20;
}

int a, b;
GetValues(out a, out b);
Console.WriteLine($"a: {a}, b: {b}"); // a: 10, b: 20

//ref
//사용 예: 변수의 현재 값을 메서드 내부에서 수정해야 할 때 유용합니다.
//특징:
//메서드가 호출될 때 변수는 초기화되어 있어야 합니다.
//메서드 내부에서 값을 수정할 수 있습니다.

//예제
void Increment(ref int number)
{
    number++;
}

int value = 5;
Increment(ref value);
Console.WriteLine(value); // 6

//차이점:
//out은 메서드 내부에서 값을 할당해야 하며, 초기화되지 않은 변수를 받을 수 있습니다.
//ref는 변수의 초기화가 필요하며, 메서드 호출 전에 이미 할당된 값을 전달받습니다.
//------------------------------------------------------------------------------------------------------------------------//
//is와 as
//C#에서 is와 as 키워드는 객체의 타입을 확인하고 변환하는 데 사용됩니다.
//두 키워드는 타입 검사 및 변환을 더 간단하고 안전하게 수행할 수 있도록 도와줍니다.

//is (타입 확인)
//사용 예: 객체가 특정 타입인지 확인할 때 사용합니다.
//특징:
//결과는 true 또는 false로 반환됩니다.
//타입이 일치하면 true, 그렇지 않으면 false를 반환합니다.

//예제
object obj = "Hello, World!";
if (obj is string)
{
    Console.WriteLine("obj is a string");
}
else
{
    Console.WriteLine("obj is not a string");
}

//as (타입 변환)
//사용 예: 객체를 특정 타입으로 안전하게 변환할 때 사용합니다.
//특징:
//타입 변환이 성공하면 변환된 객체를 반환합니다.
//실패하면 null을 반환합니다.

//예제
object obj = "Hello, World!";
string str = obj as string;
if (str != null)
{
    Console.WriteLine("Conversion successful: " + str);
}
else
{
    Console.WriteLine("Conversion failed");
}

//차이점:
//is는 객체가 특정 타입인지 확인하는 데 사용됩니다.
//as는 객체를 특정 타입으로 변환하는 데 사용되며, 변환에 실패하면 null을 반환합니다.
//------------------------------------------------------------------------------------------------------------------------//

3. 학습하며 겪었던 문제점 & 에러

  • 새롭게 알게 된 점
    • 원래는 유니티로만 C#을 사용하다보니 기본 C#의 문법에 대해서는 잘 몰랐었다 기본적으로 유니티는 Start함수나 Update등 바로 코드를 실행하는 코드가 있다보니 원래 C#에서 사용하는 static void main(string[] args)를 사용하는줄 몰랐다 JAVA 공부 경험이 있어서 어렵진 않았다.
    • 상속이나 인터페이스, 추상 클래스, 가상메서드등을 잘 유니티에서는 사용하지 않았었다 그나마 상속을 사용했었는데 기본 문제들을 풀어보면서 조금더 적응해봐야겠다.
    • 기초 문법을 보니 is는 잘 사용했었지만 as는 잘 몰랐었다 as에 대해서도 더 알아봐야겠다.
    • out, ref도 사용할 일이 잘 없었다보니 조금 어색했다 더 알아보자.
    • 나머지것들에 대한건 잘 알고있어서 부족한 부분을 다시 공부해봐야겠다.

4. 내일 학습 할 것

기초 문법 톺아보기 복습, 달리기반 Lv1, Lv2


5. 메모

https://nbcamp-unity-precamp.oopy.io/

[내일배움캠프] 사전캠프 OT & 사전학습 가이드

사전캠프

  • 진행 방식 :
    • 강의 수강
    • 퀘스트 모음집 진행
    • 데일리 루틴 (TIL 제출)
    • 팀스터디
    • 담임 매니저와의 1:1 면담
제목 : [내일배움캠프 사전캠프] + 오늘의 학습 키워드

1. 오늘 학습 키워드
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
3. 학습하며 겪었던 문제점 & 에러
 - 문제&에러에 대한 정의
 - 내가 한 시도
 - 해결 방법
 - 새롭게 알게 된 점
 - 이 문제&에러를 다시 만나게 되었다면? 
4. 내일 학습 할 것은 무엇인지

팀원

팀장 - 26세 이재은

오승엽 - 29세 사회복지학과 졸업, 블루아카이브 게임을 좋아함

유형준 - 24세 게임 모델링쪽 학과 졸업

이원혁 - 27세 정보통신학과 재학중, 게임의 스토리를 좋아함

조민석 - 26세 역사학과


반응형
반응형

https://awesome-columnist-586.notion.site/Unreal-Learning-Agents-FPS-Anemy-12-c532b8c4f2144fd78680b7484a748393?pvs=4

 

Unreal Learning - Agents FPS Anemy 12 | Notion

일단 BP_LearningInteractorR 의 Specify Agent Observation에서 오류가 난거같다 처음 실행할때는 오류가 안났었는데 찾아보니 컴파일이 제대로 되어있지 않았다.

awesome-columnist-586.notion.site

 

반응형
반응형

https://awesome-columnist-586.notion.site/Unreal-Learning-Agents-FPS-Anemy-11-2f89e95292af4b6ba3b1ce49b4db33d6?pvs=4

 

Unreal Learning - Agents FPS Anemy 11 | Notion

함수 오버라이드 - GatherAgentCompletion

awesome-columnist-586.notion.site

 

반응형
반응형

문제 설명

정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ n ≤ 1,000,000
  • 1 ≤ k ≤ min(1,000, n)

입출력 예

n k result

10 3 [3, 6, 9]
15 5 [5, 10, 15]

입출력 예 설명

입출력 예 #1

  • 1 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.

입출력 예 #2

  • 1 이상 15 이하의 5의 배수는 5, 10, 15 이므로 [5, 10, 15]를 return 합니다.
#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, int k) {
    vector<int> answer;
    
    for(int i=1; i<=n; i++)
        if(i%k==0)
            answer.push_back(i);
    
    return answer;
}
반응형
반응형

문제 설명

음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.

이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.


제한사항

  • 1 ≤ number의 길이 ≤ 100,000
  • number의 원소는 숫자로만 이루어져 있습니다.
  • number는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.

입출력 예

number result

"123" 6
"78720646226947352489" 2

입출력 예 설명

입출력 예 #1

  • 예제 1번의 number는 123으로 각 자리 숫자의 합은 6입니다. 6을 9로 나눈 나머지는 6이고, 실제로 123 = 9 × 13 + 6입니다. 따라서 6을 return 합니다.

입출력 예 #2

  • 예제 2번의 number는 78720646226947352489으로 각자리 숫자의 합은 101입니다. 101을 9로 나눈 나머지는 2이고, 실제로 78720646226947352489 = 9 × 8746738469660816943 + 2입니다. 따라서 2를 return 합니다.
#include <string>

using namespace std;

int solution(string number) {
    int answer = 0;
    int a = 0;

    for (int i = 0; i < number.size(); i++) {
        a += number[i] - '0';
    }

    answer = a % 9;

    return answer;
}
반응형
반응형

문제 설명

정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • num은 int 범위의 정수입니다.
  • 0은 짝수입니다.

입출력 예

num return

3 "Odd"
4 "Even"
#include <string>
#include <vector>

using namespace std;

string solution(int num) {
    string answer = "";
    
    if(num%2==0) answer = "Even";
    else answer = "Odd";
    
    return answer;
}
반응형