1. 선택한 게임의 이름은 무엇인가요?
    ㄴ Lethal Company(리썰 컴퍼니)
  2. 선택한 게임의 장르는 무엇인가요?
    ㄴ호러,코미디 공포, 4인 협동
  3. 선택한 게임의 어떤 시스템에 집중하셨나요?
    4인 협동 및 다양한 위험 요소(공포)
  4. 해당 시스템이 동작하는 구조의 시작부터 과정을 자세하게 분석, 나열해봅시다.
    1. 행성이라는 Stage에서 아이템을 파밍하는것이 목적이고 파밍한 아이템을 판매하여 목표금액을 달성하는 게임
    2. 행성마다 목표금액을 달성 못하면 GameOver
    3. 행성마다 위험요소(다양하고 참신한 괴물 과 함정)를 파훼하며 아이템을 파밍한다.
    4. 목표금액보다 돈을 많이 벌면 그 돈으로 유리한 플레이를 할 수있는 아이템을 구매 가능
    5. 이 과정을 팀원(4인 협동)들과 같이 플레이를 함.
  5. 직접 분석해본 내용 중 가장 핵심이 되는 구성 요소는 무엇이라 생각하나요?
    • 위험요소(다양하고 참신한 괴물 과 함정)
      다양한 위험요소들이 많기에 플레이를 하며  각각 파훼법을 익히며 재미를 느낄 수 있고
      플레이하는 유저들은 계속 긴장감을 가져 공포라는 장르를 잘 살림.
    • 4인 협동하여 목적을 달성
      협동을 하여 각종 위험요소들을 더 쉽게 피할수도 있지만, 오히려 사람이 많아져서 파훼하기 더 어려워지는 도전요소들로 인하여 더욱 재밌는 장면이 나올 수 있음.

Unity를 이용해 만든 프로젝트

/ 서비스 명  장르,분류 제작사
첫 번째 프로젝트 Cult of the Lamb 건설 시뮬레이션
던전 RPG
로그라이크
Massive Monster
두 번째 프로젝트 A Dance of Fire and Ice 리듬게임 7th Beat Games
세 번째 프로젝트 산나비 사이버펑크
액션 어드벤쳐
플랫폼
원더포션
네 번째 프로젝트 Slay the Spire 카드게임
로그라이크
Mega Crit Games
다섯 번째 프로젝트 Dungreed 로그라이크
플랫포머
TEAM HORAY

위 프로젝트들의 공통된 특징이 있나요?

  • 독립적인 개발자/소규모 개발팀에 의한 개발 - 인디 게임
  • 2D 에서 화려한 연출과 최고의 재미를 제공함

여러분이 생각하는 Unity의 강점은 뭐라고 생각하나요?

  • 많은 사용자에 따른 Unity 커뮤니티의 활성화
  • 유저 친화적인 인터페이스 기능 (UGUI, UI Tool Kit)
  • 다양한 에셋 지원 (Asset Store)
  • C# 언어를 사용하여 더욱 쉽게 개발 할 수 있는 환경

여러분은 Unity를 이용해 어떤 게임을 만들어보고 싶으신가요?

  • 장르던전 RPG, 덱빌딩,로그라이크
  • 특징 :  플레이어가 던전에 들어가기전 덱 빌딩을 소재로하여 전략성을 강화하였고
    로그라이크로 매 전투가 색다른 느낌을 주며 한번의 스테이지(던전)를 플레이 함으로 캐릭터를 강화하여
    도전할때 마다 스테이지를 더 많이 진행하는 재미를 느낄 수 있다.
  • 그 이유는? : 개인적으로 게임 장르의 꽃은 RPG라고 생각하여 RPG 장르를 추가하였고 거기에 매판 플레이를 할때마다 새로 전략 을 짤수있는 로크라이크와 덱빌딩을 소재로 개발을 해보고 싶습니다.

유니티 게임 개발 독학시에 구매했던 '내 에셋' 입니다. 

  1. 내일배움캠프 Unity 트랙에 참여한 계기는 무엇인가요?
    • 혼자서 독학하면 느낀 협업 프로젝트 경험이 적어서 신청하였습니다.
    • 참여하면서 협업 툴인 git,github 을 자세하게 익혔으면 좋겠습니다.
  2. 본 코스 수료 후, 어떤 게임 개발자로 성장하고 싶나요?
    • 어떤 장르에 속하지 않고 , 기획자가 제안하면 구현 할 수 있는 능력과 더 재미있게 만들 수 있을것 같으면
      오히려 내가 제안을 하는 게임개발자(클라이언트 프로그래머)가 되고싶습니다.
  3. 그 외에 Untiy 트랙에 기대하는 것이 있다면 자유롭게 작성해 주세요.
    • 협업 프로젝트 경험을 많이 쌓고 싶고 , 현업 및 실무에서 어떤 기술들을 익히면 좋은지를 배우고 싶습니다.

 

Unity 퀘스트 달리기 반

1.홀수 출력

 bool odd_Check(int num)
{
    if (num % 2 != 0)
    {
        return true;
    }

    return false;
}

//for문 사용
Console.WriteLine("for문 사용");
for (int i = 1; i <= 100; i++)
{ 
    if (odd_Check(i))
    {
        Console.WriteLine(i);
    }
}
Console.WriteLine("");

//while 문 사용
Console.WriteLine("while문 사용");
int num = 1;
while (num <= 100)
{
    //for문 사용
    if (odd_Check(num))
    {
        Console.WriteLine(num);
    }
    num++;
}
Console.WriteLine("");

//do-while 문 사용
Console.WriteLine("do -while문 사용");
num = 1;
do
{
    if (odd_Check(num))
    {
        Console.WriteLine(num);
    }
    num++; ;
} while(num <= 100);

3.팩토리얼 계산

Console.Write("Enter a number : ");
string input = Console.ReadLine();
int num = 0;
int result = 1;

int.TryParse(input,out num);

if(num <= 0)
{
    Console.Write("0 이하의 숫자가 감지되었습니다.");
    return;
}

for (int i = 1; i <= num; i++) result *= i;


Console.WriteLine("Factorial of " + num + " is " + result);

https://school.programmers.co.kr/learn/courses/30/lessons/42627#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 문제 설명

    하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.

    예를들어

    - 0ms 시점에 3ms가 소요되는 A작업 요청
    - 1ms 시점에 9ms가 소요되는 B작업 요청
    - 2ms 시점에 6ms가 소요되는 C작업 요청
    

    와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.

    한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.

    - A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms)
    - B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms)
    - C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)
    

    이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.

    하지만 A → C → B 순서대로 처리하면

    - A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms)
    - C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms)
    - B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)
    

    이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.

    각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)

    제한 사항
    • jobs의 길이는 1 이상 500 이하입니다.
    • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
    • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
    • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
    • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.
    입출력 예jobsreturn
    [[0, 3], [1, 9], [2, 6]] 9
    입출력 예 설명

    문제에 주어진 예와 같습니다.

    • 0ms 시점에 3ms 걸리는 작업 요청이 들어옵니다.
    • 1ms 시점에 9ms 걸리는 작업 요청이 들어옵니다.
    • 2ms 시점에 6ms 걸리는 작업 요청이 들어옵니다.

 

더보기

문제 풀이 :

 

모든 작업의 요청 시점 시간 에서부터 작업이 완료되는 시간들의 평균값을 구하는 문제다.

문제는 Heap(힙) 카테고리에 있지만 우선순위 큐를 사용하지 않아도 풀리는 문제다.

 

첫번째 중요한점 : 평균은 최소의 원소끼리 합했을때 최소의 평균값이 나온다.

즉, 인자값으로 준 vector를 [작업의 소요시간]을 기준으로 오름차순 정렬을 해서 각 평균을 구하면 된다.

 

두번째 중요한 점 : [ 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다 ]

이 문장을 잘 봐야된다.  작업이 완료된 시점의 시간에 작업이 없으면 남은 작업 중 요청 시점이 제일 빠른것 부터 다시 평균을 구해주면된다. 

 

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

bool compare(vector<int> a , vector<int> b)
{
     return a[1] < b[1];  
}

int solution(vector<vector<int>> jobs) 
{
    int answer = 0;
    int cur_time =0;
    bool check = false;
    
    vector<vector<int>> results = jobs;

    while(!results.empty())
    {
        check = false;
        sort(results.begin(),results.end(),compare);
        for(int i = 0; i < results.size(); i++)
        {
            if(cur_time >= results[i][0])
            {
                check  = true;
                answer += (cur_time - results[i][0]) + results[i][1];
                cout << cur_time << " "<< results[i][0]<< " "<<results[i][1]<<endl;
                cur_time += results[i][1];
                results.erase(results.begin() + i);
                break;
            }
        }

        if(!check)
        {
            vector<vector<int>> tmp = results;
            sort(tmp.begin(),tmp.end());
            cur_time = tmp[0][0];
            answer += tmp[0][1];
            cout << cur_time << " "<< tmp[0][0]<< " "<<tmp[0][1]<<endl;
            cur_time += tmp[0][1];
            tmp.erase(tmp.begin());
            results = tmp;
        }
    }
    
  cout <<answer;
    
    return answer / jobs.size();
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

LV2.가장 큰 수  (0) 2023.11.03
LV1.둘만의 암호  (0) 2023.10.26
LV1.체육복  (0) 2023.10.26
LV2.택배상자  (0) 2023.10.26
LV2.롤케이크 자르기  (0) 2023.10.26

Unity에서 C#의 메모장(.txt)를 읽기를 위한 코드 예제

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System;
using System.IO; // 파일입출력을 하기위한 네임스페이스

public struct SummonEnemy
{
    public string Enemy_name;
    public float Enemy_Summon_Time;
    public Vector2 Enemy_start_Pos;

}

public class FileReader : MonoBehaviour
{
    List<SummonEnemy> summonEnemies = new List<SummonEnemy>();

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            string filePath = "Assets/FileReadText/Example.txt";
            ReadTxt(filePath);
        }
    }

    string ReadTxt(string filePath)
    {
        FileInfo fileInfo = new FileInfo(filePath);
        string value = "";

        string[] Enemy = new string[4];

        

        if (fileInfo.Exists)
        {
            StreamReader reader = new StreamReader(filePath);
            while((value = reader.ReadLine()) != null)
            {
                SummonEnemy summonEnemy = new SummonEnemy();
                
                Enemy = value.Split(',');

                summonEnemy.Enemy_name = Enemy[0];
                summonEnemy.Enemy_Summon_Time = float.Parse(Enemy[1]);
                summonEnemy.Enemy_start_Pos = new Vector2(float.Parse(Enemy[2]), float.Parse(Enemy[3]));


                summonEnemies.Add(summonEnemy);
            }

            foreach(SummonEnemy readenemy in summonEnemies)
            {
                Debug.Log(readenemy.Enemy_name + readenemy.Enemy_Summon_Time + readenemy.Enemy_start_Pos);
            }

            reader.Close();
        }

        else
            value = "파일이 없습니다.";

        return value;
    }
}

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 내용 :

0 또는 양의 정수가 담긴 배열 하나를 인자값으로 줌

배열 원소를 각 이어 붙였을때 가장 큰 수를 반환하는 문제

 

문제 풀이 :

[숫자들의 조합 경우의 수를 찾음 -> 제일 큰값을 반환]

시간 복잡도로 인하여 바로 오답처리 

 

가장 큰 수를 뽑기 위한 조건 

1.배열의 원소(숫자)값의 제일 첫번째 자리가 커야된다.

-> ex) 6 , 10 -> 첫번째 자리 대소비교 ( 6 > 1 ) , 6이 앞으로

2.첫번째 자리가 똑같은 경우 , 해당 숫자를 앞뒤로 붙였을때 큰값을 앞에 붙여야한다 

-> ex) 3 , 34 -> 첫번째 자리가 똑같음 -> 앞뒤로 숫자를 붙여 대소비교 (334 < 343) , 343이 앞으로

 

이 2조건을 사용하여 숫자를 정렬한뒤 문자를 붙이면 원하는 결과값이 나온다.

 

[코드영역]

더보기
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

//알고리즘 헤더에 sort 함수에 비교자 변경해서 풀었음
//비교자에서 해당 수자를 문자열로 바꾸고 문자열 제일 앞 숫자가 같으면
//해당 숫자문자열을 합친뒤 크기를 비교하여 true인경우 정렬을 하는식으로

//비교자의 해당 숫자의 문자열 앞이 다른경우 대소비교하여 true인경우 정렬 

using namespace std;

bool compare(int a, int b)
{
     string str_lhs = to_string(a) ;
     string str_rhs = to_string(b) ;
    
    switch(str_lhs.front() == str_rhs.front() )
    {
        case true:
            if(str_lhs+str_rhs > str_rhs + str_lhs) { return true;}
            break;
        case false:
            if(to_string(a).front() > to_string(b).front())  {return true;} 
            break;
    }
  
    return false;
}

string solution(vector<int> numbers) {
    string answer = "";
        
    sort(numbers.begin(),numbers.end(),compare);
   
    //정렬된 배열 제알 앞이 0인경우 숫자 완성이 안됬기에 0문자열 리턴 
    if(numbers.front() == 0 ) { return "0";}
    
    for(int num : numbers) {  answer += to_string(num);}

    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

LV3.디스크 컨트롤러  (0) 2024.04.08
LV1.둘만의 암호  (0) 2023.10.26
LV1.체육복  (0) 2023.10.26
LV2.택배상자  (0) 2023.10.26
LV2.롤케이크 자르기  (0) 2023.10.26

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 내용 :

0.인자값으로 s와 skip 이라는 알파벳 소문자 문자열과 index라는 int 정수값이 주어짐

1.s 문자열에 문자를 index 만큼의 뒤의 문자로 변환해야함

2.변환시에 skip이라는 문자열에 해당 문자가 있을경우 그 문자를 무시하고 한번 더 변환함

2-1.변환시 글자 'z'를 넘어가는경우 'a'부터 다시 시작

이때 변환되는 문자열을 return


풀이 : 

문제에서 소문자 알파벳만 사용하기에 'a'~'z'를 담고있는 알파벳 배열을 만들것,

skip문자열의 문자인 경우 배열에 넣지 않으며 알파벳 배열을 만든다.

 

그후 s문자열의 길이만큼 반복문을 순회하며

해당 단일문자가 알파벳배열의 어디 index에 있는지 찾고 

찾은 문자의 index에 인자값index을 더하여 위치를 찾는다.

만약 더한 index값이 알파벳배열의 수를 넘었을 경우 , 다시 'a'부터 시작하게 초기화 한후 찾는다.

 

그럼 최종으로 찾은 index값을 알파벳 배열에 넣어 answer에 추가시키면 된다.

 

코드영역

 

더보기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;


string solution(string s, string skip, int index) {
    string answer = "";
    
    
    //sort 정렬 : 시간복잡도 N , 우선순위 큐 : 시간복잡도 : log n
    //이기에 우선순위큐를 이용하여 minheap으로 정렬함
    priority_queue<char,vector<char>,greater<char>> pq_skip;
    for(char ch : skip) {  pq_skip.push(ch);}
    
    
    char pivot = 'a'; //알파벳 배열에 넣을 시작 문자
    vector<char> alpabet;
    while(pivot <= 'z') 
    {
        //해당 알파벳이 skip문자열에 있는경우 알파벳 배열에 넣지 않는다.
        if( pq_skip.top() != pivot) { alpabet.push_back(pivot); }
        else { pq_skip.pop(); }
        pivot++;
    }
        
    //문자열 s 길이만큼 순회하며 문자를 변환한다.
    int result;
    for(int i = 0; s.size() >i;i++)
    {
        //문자열 s의 단일문자가 알파벳배열의 어디에 위치하는지 찾는다.
        int alpabet_index = find(alpabet.begin(),alpabet.end(),s[i]) - alpabet.begin();
        
        //찾은 단일문자위치에 인자값index를 더하여 최종 위치를 찾는다.
        result = alpabet_index + index;
        //만약 알파벳 사이즈를 초과한 경우 , 알파벳 사이즈만큼 뺀다.
        while(result> alpabet.size()-1 )
        {
            result -= alpabet.size();
        }
        
        answer += alpabet[result];
    }
    
    
    return answer;
}

해당 문제를 이렇게 풀었지만 , 다른 사람 풀이를 보니 더욱 가독성 좋고 쉽게 풀이한게 있어 코드를 첨부한다.

 

다른사람 풀이

#include <string>
#include <vector>

using namespace std;

string solution(string s, string skip, int index) {
    string answer = "";

    for(auto v : s)
    {
        int t = 0; //다음 문자로 넘어간 숫자를 카운트하는 변수
        int c = v - 'a'; //문자v에서 'a'를 뺌으로 알파벳의 위치순서를 파악
        while(t < index)
        {
            c++;//다음 알파벳위치(알파벳 변환)
            v = (c % 26) + 'a';//해당 알파벳 위치를 문자열로 변환(v는 char 자료형)
            //c%26은 알파벳이 총 26개 이기 때문에 큰 숫자가 들어와도 알파벳의 한 형태로 변환 가능하기떄문
            
            //skip문자열에 해당 문자(v)가 있는지 체크
            if(skip.find(v) == string::npos)
            {
            	//없으면 카운트를 증가시킴
                t++;
            }
        }
        
        answer += v;
    }
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

LV3.디스크 컨트롤러  (0) 2024.04.08
LV2.가장 큰 수  (0) 2023.11.03
LV1.체육복  (0) 2023.10.26
LV2.택배상자  (0) 2023.10.26
LV2.롤케이크 자르기  (0) 2023.10.26

+ Recent posts