2021年-12-21(Pythonゲーム2:BaskinRobins 31)


今週の計画:20日月曜日から22日水曜日にかけてPythonゲームプロジェクトを行います/23日木曜日から24日金曜日にかけてKakaoTalk UIクローン、InstarUIクローンプロジェクトを行い、GITによるコラボレーションのための特別講座(午後2時~4時予定)/週の資料構造アルゴリズム講座を行い、WebプログラミングA to Zとネット時代の襲撃課題を復習します
昨日と同じように、午前9時にグダ町の大講堂で、今日の午後4時までに提出しなければならない簡単なPythonゲームの項目の説明を聞いて、項目を行いました.
[simple Explanation]
Pythonゲーム2:BaskinRobbins 31ゲーム
(1)よく知られているテーブルゲームは,コンピュータとの1:1の大戦形式で行われる.ただし、パソコンもプレーヤーも31を超えており、数字とは呼べません.
(2)上記のルールは同じであるが,コンピュータは常に自分のやり方で数字を呼んで,自分が勝つようにする.つまり、パソコンに必勝を取らせてみましょう.
cf.2457152->役に立つなら😅👍!
🍇 今日の収穫🍇 :
  • 1)BaskinRobbins 31ゲーム必勝戦略:[2,6,10,14,18,22,26,30]4 n+2数列の数位が叫んだ方が勝つ.よって、事実上数字2を先に叫ぶ方が勝つ.また,上記の必勝アルゴリズムを用いて行うことも,コンピュータが失敗する唯一のケースである.
  • cf.必勝の関連数列の論理を説明して、私が30を叫ぶと勝利です!だから、私が最後の数字で30を叫びたいなら、相手は29、28、27のうちの1つを最後の数字として呼べばいいのです.そのため、相手が叫びたい3つの数字を除けば26が出てきますが、私が26を叫ぶと、今度私の番になったら30を呼ぶことができます.そう考えると必勝数は30から4に減るので、初めて叫ぶと必ず勝つ数字は2です.すなわち,必勝数30を4で割った残りの値2が必勝数を叫ぶ種となった.
        # 컴퓨터가 몇을 호출할 것인지 호출할 숫자의 범위를 결정하는 것
        # 컴퓨터가 랜덤하게 호출하는 기존의 함수에서 이 if~else 구문만 추가됨
        # 4n+2 수열의 숫자를 불러나가는 쪽이 승리하게되며, 따라서 사실상 먼저 2를 외치는 쪽이 승리할 수 있음
        # 4n n을 4로 나누면 나머지는 0~3이 나올 수 있는데 나누었을 때 나머지 2가 나올 수 있는 숫자는 2를 제외하고는 
        # 전부 필승 수열의 숫자뿐이다. 따라서, 숫자 2를 먼저 외치게 되는 쪽이 승리할 수 있게 된다.
        # 그러므로 last_num % 4 == 2: 인 last_num은 의미가 없다. 1~3 중 몇을 더해도 지기 때문.
        if last_num % 4 == 0:
            call_num_size = 2 # 처음 시작시 2를 먼저 외침
        elif last_num % 4 == 1:
            call_num_size = 1 # 상대가 1을 외치면 1을 추가하여 2를 먼저 외침
        elif last_num % 4 == 3:
            call_num_size = 3 # 상대가 3을 외치면 4n+2 수열의 n=1을 넣은 값인 6을 외치도록 3을 추가함
        else:
            call_num_size = random.randint(1, 3)
    
        computer_call = [last_num+i for i in range(1, call_num_size+1)]
  • 2)ターンオーバー方式進行:クロス進行と言うべきでしょうか?相手のラウンド->内のラウンド->相手のラウンドという順番に行う方式をコードで表現します.
  •     if start_player == 'computer' :
            turn = 0 # 역할에 가깝다( 2로 나눈 나머지 값이 0인 숫자들 아무거나 상관없다. 짝수! 단, 그 숫자+1한 숫자를 플레이어의 숫자로 부여해 주어야 한다. 홀수!)
            print('-- 각오해라 휴우먼 --')
        else:
            turn = 1
            print('-- 기계제국으로 돌아가시지 --')
        
        # 첫 시작시 last_num 값을 0으로 초기화 후 진입
        last_num = 0
        
        # 게임의 본체
        while last_num < 31:
            if turn % 2 == 0: # 2로 나눈 나머지 값이 0인 즉, 0(첫번째턴), 2(세번째턴), 4(다섯번째턴) 이런식으로 번갈아 턴을 진행할 수 있게 한다.
                # 두 함수 모두 return 값은 last_num이다.
                # 컴퓨터가 숫자를 호출하는 함수
                last_num = computer_call_number(last_num)
            else:
                # 플레이어가 숫자를 호출하는 함수
                last_num = player_call_number(last_num)
    
            turn += 1
  • 3)リスト計算:条件には最後に必ず31と呼ぶ条件がある.したがって、32または33が呼び出されないように、リスト計算プログラムを使用して32、33をリストから1行のコードに削除する.(リストにもデジタルコールを並べて表示するために、このように記述されたex.[1,2]->[3]->[4,5,6])
  • cf.リストから複数の要素を一度に削除する関数はnumpyパッケージの関数のみです.したがってnumpyパッケージをインポートしない限り、この方法はリストから複数の要素を一度に削除するのに適していると思います.
    
        # 상대로 부터 받은 마지막 숫자(last_num)에 더해줄 숫자값(i)의 범위를 
        # range(1, 호출할 숫자의 갯수(call_num_size) + 1)를 사용하여 표현한다.
        # 선공인 경우 숫자 0부터 증가가 시작되고, 후공인 경우 상대의 마지막 호출 숫자로부터 증가가 시작된다. 
        # 리스트 컴프리헨션 파이썬 문법을 통해 코드 간소화
        call_list = [last_num+i for i in range(1, call_num_size+1)] 
    
        # 호출 리스트의 마지막 숫자값
        last_num = call_list[-1]
        
        if last_num >= 31:
            # 리스트 컴프리헨션을 사용하여 마지막 숫자값이 32, 33인 경우는 호출 리스트에서 제외한다. 
            # 이유는 31을 마지막에 꼭 외치도록 하기위해.
            # call_list에서 숫자 하나씩 빼서 item에 넣는데, 그 값이 32, 33이 아닌값만 넣겠다.
            # 그리고 그 item들로 list를 만들겠다.
            call_list = [item for item in call_list if item != 32 and item != 33] 
            print(f'call_list : {call_list}')