C 언어 실습

문제

바카라 게임 
1 ~ 13 사이의 숫자를 두 개를 뽑아
왼쪽이 큰지, 오른쪽이 큰지 아니면 같은지를 맞추는 게임입니다.

1. 컴퓨터는 1 ~ 13 의 두 개의 랜덤값을 뽑습니다.
2. 만약 Left : 1, Right : 3 을 뽑았을 때
3. Left, Middle, Right 를 선택합니다.
   만약 뽑은 숫자가 Left보다 크거나, Right보다 크다면 1점을 얻습니다.
   Middle(같다) 이라면 4점을 얻습니다.
   만약 Left, Right 를 틀렸다면 1점을 잃습니다.
   Middle(같다) 이라면 4점을 잃습니다.

총 10번 진행하며 마지막에 점수가 더 높은 사람이 이기는 게임입니다.

학습

1. 셔플 알고리즘: Knuth Shuffle
    - 한쪽 끝(앞 or 뒤)부터 한 자리씩 이동하면서, 각 자리에 들어갈 요소를 랜덤하게 뽑음
    - 랜덤 숫자 대상: 그 자리를 포함해서 아직 정하지 않는 자리에 있는 요소들
    - 랜덤하게 뽑힐 대상 리스트를 줄여가면서, 기존에 뽑힌 요소를 배제함
    - 랜덤 함수가 O(1)의 시간복잡도를 가지면, 전체 알고리즘은 O(n)

void shuffle(int card[], const int n)
{
	for (int i = n - 1; i > 0; i--)
	{
		int j = rand() % i;
		swap(&card[i], &card[j]);
	}
}
    
2. 포인터 스왑
3. 함수에서 포인터 매개변수를 이용한 연산
4. 구현, 시뮬레이션

댓글남기기