파이토존에서 마작을 했어요.

14646 단어 마작첫 투고Python

개요


나는 파이톤에서 마작을 할 수 있는 종목을 자제하고 있다.
이번에는 혼자서 마작을 하면서 카드를 우두둑우두둑 잘라내는 종목이다
점차 기능을 늘려 마작 AI를 만드는 것이 최종 목표다.

규칙.

  • 1~9이라는 숫자가 적힌 만자, 통자, 밧줄
    '동','남','서','북','백','발','중'등 총 34개 카드가 사용돼 총 136장
  • 유저는 13장의 카드(핸드카드)를 가지고 있으며, 나머지 카드(산)는 한 장의 카드와 한 장의 핸드카드를 빼서 교환한다.
    카드가 특정 조건을 충족시키면 게임이 통관되는 게임입니다.
  • 산에 있는 14장의 카드를 에이스라고 하는데 플레이어는 카드의 내용을 확인할 수도 없고 그 중에서 카드를 꺼낼 수도 없다.에이스에 따라 올라갈 수 없을 때도 있다.
  • 이루어지다


    소스 코드가 이런 느낌이에요.
    #!/usr/bin/env python
    # 麻雀プログラム
    # 現状ツモって切るだけの一人麻雀しかできない
    # 未実装:アガリ判定,手役判定,鳴き,河,
    from enum import Enum
    import sys
    import random
    import datetime
    
    
    class Pai(Enum):  # 牌クラス 牌の種類を定義
        # 萬子
        m1 = '一萬'
        m2 = '二萬'
        m3 = '三萬'
        m4 = '四萬'
        m5 = '伍萬'
        m6 = '六萬'
        m7 = '七萬'
        m8 = '八萬'
        m9 = '九萬'
        # 筒子
        p1 = '一筒'
        p2 = '二筒'
        p3 = '三筒'
        p4 = '四筒'
        p5 = '五筒'
        p6 = '六筒'
        p7 = '七筒'
        p8 = '八筒'
        p9 = '九筒'
        # 索子
        s1 = '一索'
        s2 = '二索'
        s3 = '三索'
        s4 = '四索'
        s5 = '五索'
        s6 = '六索'
        s7 = '七索'
        s8 = '八索'
        s9 = '九索'
        # 字牌
        z1 = '東'
        z2 = '南'
        z3 = '西'
        z4 = '北'
        z5 = '白'
        z6 = '発'
        z7 = '中'
    
        def __str__(self):  # print関数での表示方法を定義
            return self.value
    
    
    class Yama:  # 山クラス 山、王牌などの管理
    
        def __init__(self):
            self.yama = [*Pai] * 4  # 山の初期化
            random.shuffle(self.yama)
    
            self.wanpai = self.yama[0:14]  # 王牌の初期化
            del self.yama[0:14]
    
        def tsumo(self):  # 山の一番最後の牌を返す
            return self.yama.pop()
    
        def haipai(self):  # 13牌をプレイヤーに渡す
            haipai = self.yama[0:13]
            del self.yama[0:13]
            return haipai
    
    
    class Player:  # プレイヤークラス 手牌の管理
    
        def __init__(self):
            self.tehai = []
    
        def haipai(self,pai):  # ゲーム開始時に13牌を山からとる
            self.tehai = pai
            self.tehai.sort(key = lambda x: str(x.name))
            print('配牌\n',*self.tehai,'\n')
    
        def tsumo(self,pai):  # 山から1牌とって手牌から一枚捨てる
            print(*self.tehai, 'ツモ', pai)
            self.tehai.append(pai)
            sutehai = self.tehai.pop(int(input()))
            # キーボード入力で切る牌を指定
            self.tehai.sort(key = lambda x: str(x.name))
            print('打',sutehai,'\n')
            return sutehai
    
    
    random.seed(datetime.datetime.now())
    yama1 = Yama()  # 山の生成
    player1 = Player()  # プレイヤーの生成
    player1.haipai(yama1.haipai())
    while(len(yama1.yama)!=0):  # 山の牌数が0になるまで
       player1.tsumo(yama1.tsumo())  # 一枚ツモって切る
    
    
    (기록 편집)
  • 2021/01/01 파이썬 공식 코딩규약인 PEP8의 존재를 파악하고 읽기 편리하도록 수정했다.인코딩 설정의 삭제, import의 쓰기 등
  • 패산을 생성하는 곳에 대해 처음에는 목록에 포함된 형식으로 썼지만 *(별표)로 더 예쁘게 썼다.
  • self.yama = [pai for pai in Pai] * 4  # リスト包括表記
    
    self.yama = [*Pai] * 4  # アスタリスクを用いた表記
    # [Pai.m1,Pai.m2,...Pai.z7] * 4 と同じ意味
    
    
  • 맨 윗부분 모듈 출력판에 일부러 pai.value라고 쓰여 있지만 과부하 특수 방법__str__을 통해 print문의 출력을 정의할 수 있다.
  • class Pai:
        def __str__(self):
            return self.value
    
    tehai = [Pai.m1,Pai.p2,Pai.s3]
    print(*tehai)  # print(tehai[0],tehai[1],tehai[2])と同じ意味
    # 実行結果
    # 一萬 二筒 三索
    

    실행 결과



    명령 프롬프트에서 실행되었습니다.
    나는 카드의 표시, 순서, 카드의 교체 등을 정상적으로 진행할 수 있다고 생각한다.

    과제.

  • 문자로 표시해서 좀 못생겼어
  • 할로겐 판정 미실현
  • 이 두 가지를 다음 문장으로 삼다.

    끝맺다


    python 연습을 위해서 해봤어요.
    제가 쓴 코드를 공개하는 것은 이번이 처음입니다. 혹시 구설에 오르는 부분이 있으면 꼭 댓글로 지적해 주세요.

    참고 문장


    python에 대한 쓰기
    https://note.nkmk.me/
    이쪽 사이트 참고했어요.

    좋은 웹페이지 즐겨찾기