needmoreeasy EN 한국어
배우기

28 — 게임: 규칙을 아는 상대

★★★★☆ (4/5)게임과 전략
선수 지식
18 — 모험, 12 — 랜덤
결과물
이기는 규칙을 따라 두는 상대와 겨루는 게임

상대가 재미있으려면 운만으로는 부족하고 규칙이 있어야 합니다. 이 게임은 돌무더기에서 한 번에 1~3개를 가져가고, 마지막 돌을 가져간 쪽이 집니다. 컴퓨터는 이기는 자리를 계속 지키는 규칙을 씁니다. 그 규칙은 나눗셈의 나머지 하나면 됩니다.

단계

  1. 규칙부터 봅니다. 남은 돌이 4의 배수일 때 상대에게 넘기면, 상대가 몇 개를 가져가든 이쪽이 다시 4의 배수를 만들 수 있습니다. 그래서 컴퓨터는 남은 돌을 4로 나눈 나머지만큼 가져갑니다:

    쌓인돌은 9
    내것은 쌓인돌을 4로 나눈 나머지
    내것 말해줘
    
    실행해 보기 →

    9를 4로 나누면 1이 남으므로 1개를 가져가고, 8개를 남깁니다.

  2. 나머지가 0이면 이미 진 자리라 규칙이 없습니다. 그때는 무작위로 둡니다:

    쌓인돌은 8
    내것은 쌓인돌을 4로 나눈 나머지
    만약에 내것이 0과 같으면
        내것은 1부터 3까지 무작위 숫자
    끝
    내것 말해줘
    
    실행해 보기 →
  3. 사람의 차례는 숫자로 묻고, 1~3이 아니면 다시 묻습니다. 건너뛰어는 이번 바퀴의 남은 줄을 건너뛰고 반복 처음으로 돌아갑니다:

    계속 반복해
        가져갈것을 숫자로 물어봐 몇 개 가져갈까요? 1, 2, 3
        만약에 가져갈것이 1보다 작으면
            1, 2, 3 가운데 하나여야 합니다 말해줘
            건너뛰어
        끝
        멈춰
    끝
    
    실행해 보기 →

    건너뛰어는 반복 안에서만 쓸 수 있습니다. 반복 밖에 적으면 컴파일할 때 막아 줍니다.

  4. 돌을 덜어 내고, 0이 되면 그 차례에 가져간 쪽이 집니다:

    쌓인돌은 12
    가져갈것은 3
    쌓인돌에서 가져갈것 빼
    쌓인돌 말해줘
    
    실행해 보기 →
  5. 전체입니다. nim.nme에 넣고 돌려 보세요:

    쌓인돌은 12
    계속 반복해
        남은 돌 말해줘
        쌓인돌 말해줘
        가져갈것을 숫자로 물어봐 몇 개 가져갈까요? 1, 2, 3
        만약에 가져갈것이 1보다 작으면
            1, 2, 3 가운데 하나여야 합니다 말해줘
            건너뛰어
        끝
        만약에 가져갈것이 3보다 크면
            1, 2, 3 가운데 하나여야 합니다 말해줘
            건너뛰어
        끝
        쌓인돌에서 가져갈것 빼
        만약에 쌓인돌이 0과 같으면
            마지막 돌을 가져가셨습니다. 지셨습니다 말해줘
            멈춰
        끝
        내것은 쌓인돌을 4로 나눈 나머지
        만약에 내것이 0과 같으면
            내것은 1부터 3까지 무작위 숫자
        끝
        쌓인돌에서 내것 빼
        컴퓨터가 가져간 개수 말해줘
        내것 말해줘
        만약에 쌓인돌이 0과 같으면
            컴퓨터가 마지막 돌을 가져갔습니다. 이기셨습니다 말해줘
            멈춰
        끝
    끝
    
    실행해 보기 →

    3, 1, 3처럼 두어 보세요. 컴퓨터가 남은 돌을 계속 4의 배수로 만들어 놓기 때문에, 처음이 12개면 사람이 이깁니다.

직접 해보기

처음 돌을 15개로 바꿔 보세요. 15는 4의 배수가 아니므로 컴퓨터가 먼저 유리한 자리를 잡습니다. 몇 번 두어 보고, 규칙이 왜 그런지 생각해 보세요. 이긴 판을 세는 이름을 하나 만들어 두어도 좋습니다.

배운 것

  • 나눈 나머지는 나눗셈에서 남는 수이고, 이 게임 전략의 전부입니다.
  • 건너뛰어는 이번 바퀴를 그만두고 반복 처음으로 돌아갑니다.
  • 상대의 「생각」은 지금 상황에서 계산해 내는 규칙 한 줄입니다.
  • 규칙이 통하지 않는 자리에서는 무작위로 두면 상대가 무너지지 않습니다.

GitHub에서 이 문서 보기