2주차 강의 정리!
https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EC%A0%9C%EC%96%B4%EB%AC%B8
https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EB%B0%98%EB%B3%B5
for문 - 반복횟수 직관적, 반복조건 한 눈에 확인 가능 , 가독성 좋음
while문 - 반복 조건에 따라 조건문의 실행 횟수가 유동적. 더 간결할 수 있다.
https://velog.io/@paenge1004/TIL-C-%EA%B8%B0%EC%B4%88-%EB%B0%B0%EC%97%B4#foreach-%EA%B5%AC%EB%AC%B8
namespace Array2
{
internal class Program
{
static void Main(string[] args)
{
int[,] _map = new int[5, 5]
{
{1,1,1,1,1 },
{1,0,0,0,1 },
{1,0,1,0,1 },
{1,0,0,0,1 },
{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();
}
}
}
}
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2);
foreach(int number in numbers)
{
Console.WriteLine(number);
}
Stack<int> _stack1 = new Stack<int>();
_stack1.Push(1);
_stack1.Push(2);
_stack1.Push(3);
int _value = _stack1.Pop(); // _value = 1
// Queue
Queue<int> _queue1 = new Queue<int>();
_queue1.Enqueue(1);
_queue1.Enqueue(2);
_queue1.Enqueue(3);
int _value1 = _queue1.Dequeue(); // _value1 = 1
// HashSet
HashSet<int> _set1 = new HashSet<int>();
_set1.Add(1);
_set1.Add(2);
_set1.Add(3);
foreach(int _element in _set1)
{
Console.WriteLine(_element);
}
1. 리스트는 동적으로 크기 조정가능
메모리 사용량 동적 크기 조정가능, 배열보다 많은 메모리 사용.
Linked List로 구현되기 때문에, 배열보다 인덱스로 인한 데이터 접근이 느리다.
연결된 노드 모두 순회해야하기 때문임
2. 코드 복잡도 증가
데이터 추가 삭제 등의 작업이 배열보다 간편 -> 유연성은 즉 코드 복잡도 증가시킬 수 있다.
[접근 제한자][리턴 타입][메서드 이름]([매개변수])
{
// 메서드 실행 코드
}
반환값 없으면 void !
public void SayHello()
{
Console.Write("안녕하세요!");
}
public void greetPerson(string name)
{
Console.WriteLine("안녕하세요, " + name + "님!");
}
public int AddNumbers(int a, int b)
{
int sum = a + b;
return sum;
}
[메서드 이름] ([전달할 매개변수]);
AddNumbers(10, 20);
void PrintFullName(string firstName, string lastName)
{
Console.WriteLine("full name: " + firstName + "" + lastName);
}
매개변수의 타입, 순서가 달라야한다. 만약 동일한 자료형이면 매개변수의 갯수가 달라야한다.
-> 지겹도록 공부한 내용! 외우자!
명확하게 멈추는 지점을 알지 못하면, 무한 반복이 된다.
-> Stack Overflow!
재귀 호출을 적절하게 사용하려면 꼭 멈추는 지점을 파악하자.
namespace TicTacToeGame
{
internal class Program
{
static char[] _arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
static int _player1 = 1;
static int _choice;
static int _flag = 0;
static void Main(string[] args)
{
do
{
Console.Clear();
Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
Console.WriteLine("\n");
if (_player1 % 2 == 0)
{
Console.WriteLine("플레이어 2의 차례");
}
else
{
Console.WriteLine("플레이어 1의 차례");
}
Console.WriteLine("\n");
Map();
string _line = Console.ReadLine();
bool _res = int.TryParse(_line, out _choice);
if (_res == true)
{
if (_arr[_choice] != 'X' && _arr[_choice] != '0')
{
if (_player1 % 2 == 0)
{
_arr[_choice] = 'O';
}
else
{
_arr[_choice] = 'X';
}
_player1++;
}
else
{
Console.WriteLine($"죄송합니다. {_choice} 행은 이미 {_arr[_choice]}로 표시되어 있습니다.");
Console.ReadLine();
}
}
else
{
Console.WriteLine("숫자를 입력해주세요.");
}
_flag = PlayerWin();
}
while (_flag != -1 && _flag != 1);
if (_flag == 1)
{
Console.WriteLine($"플레이어 {(_player1 % 2) + 1}이(가) 이겼습니다.");
}
else
{
Console.WriteLine("무승부");
}
Console.ReadLine();
}
static void Map()
{
// 맵 생성
Console.WriteLine(" | | ");
Console.WriteLine($" {_arr[1]} | {_arr[2]} | {_arr[3]} ");
Console.WriteLine("_____|_____|_____");
Console.WriteLine(" | | ");
Console.WriteLine($" {_arr[4]} | {_arr[5]} | {_arr[6]} ");
Console.WriteLine("_____|_____|_____");
Console.WriteLine(" | | ");
Console.WriteLine($" {_arr[7]} | {_arr[8]} | {_arr[9]} ");
}
static int PlayerWin()
{
if (_arr[1] == _arr[2] && _arr[2] == _arr[3])
{
return 1;
}
if (_arr[4] == _arr[5] && _arr[5] == _arr[6])
{
return 1;
}
if (_arr[7] == _arr[8] && _arr[8] == _arr[9])
{
return 1;
}
else if (_arr[1] == _arr[4] && _arr[4] == _arr[7])
{
return 1;
}
else if (_arr[2] == _arr[5] && _arr[5] == _arr[8])
{
return 1;
}
else if (_arr[3] == _arr[6] && _arr[6] == _arr[9])
{
return 1;
}
else if (_arr[1] == _arr[5] && _arr[5] == _arr[9])
{
return 1;
}
else if (_arr[3] == _arr[5] && _arr[5] == _arr[7])
{
return 1;
}
else if (_arr[1] != '1' && _arr[2] != '2' && _arr[3] != '3' && _arr[4] != '4' && _arr[5] != '5' && _arr[6] != '6' && _arr[7] != '7' && _arr[8] != '8' && _arr[9] != '9')
{
return -1;
}
else { return 0; }
}
}
}
TicTacToe 게임을 제작하는게 굉장히 어려웠다.
그래서 풀이를 보고 코드를 따라치며 제작했다.
막상 따라 제작하니 유니티 게임매니저 스크립트와 비슷했다.
앞으로 개발자가 되려면 복잡한 로직의 코드를 머릿속으로 생각하고
펜, 컴퓨터 등등 내가 원하는대로 로직을 표현해야하는데
아직 많이 부족한 것 같아 아쉽다.
코드 리뷰도 꼭 진행하자.