파이토존에서 마작을 했어요.
개요
나는 파이톤에서 마작을 할 수 있는 종목을 자제하고 있다.
이번에는 혼자서 마작을 하면서 카드를 우두둑우두둑 잘라내는 종목이다
점차 기능을 늘려 마작 AI를 만드는 것이 최종 목표다.
규칙.
'동','남','서','북','백','발','중'등 총 34개 카드가 사용돼 총 136장
카드가 특정 조건을 충족시키면 게임이 통관되는 게임입니다.
이루어지다
소스 코드가 이런 느낌이에요.#!/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()) # 一枚ツモって切る
(기록 편집)
#!/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()) # 一枚ツモって切る
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/
이쪽 사이트 참고했어요.
Reference
이 문제에 관하여(파이토존에서 마작을 했어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/OkNCTer/items/9de8d20a3dede9a4daa2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(파이토존에서 마작을 했어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/OkNCTer/items/9de8d20a3dede9a4daa2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)