Pythonista+sceneでトランプをランダムに表示する

今回は、Pythonistaのsceneでトランプを表示する処理を作成してみました。

プログラム概要は以下の通り。
・53枚の中からランダムに5枚トランプを引く
・スマホ画面をタッチするとカードを引き直す

## トランプ処理を作成する方法
まずは53枚(絵札13枚ずつ＋ジョーカー)のトランプセットの作成です。
マーク＋数字という形で文字列を作成し、トランプリストの配列に格納していきます。

マークはPythonistaのカード画像に合わせて'Clubs', 'Hearts', 'Spades', 'Diamonds'を使用します。

### 実装例
※2020/01/06修正 
card_list.append()の位置がずれていたので修正しました。
<pre>
class TrumpGame:
	def make_card_list(self):	
		# マークのリスト
		symbol_list = ['Clubs', 'Hearts', 'Spades', 'Diamonds']
		# カードリスト
		card_list = ['Joker']

		# マークと数字を合体させる
		for symbol in symbol_list:
			for number in range(1, 14):
				# 11以上と1は置き換え
				if number == 1:
					card = symbol + 'A'
				elif number == 11:
					card = symbol + 'J'
				elif number == 12:
					card = symbol + 'Q'
				elif number == 13:
					card = symbol + 'K'
				else:
					# 10以下ならそのまま
					card = symbol + str(number)

				# カードをリストに追加
				card_list.append(card)
			
		return card_list
</pre>



次にカードをシャッフル処理を関数として作成します。

randam.shuffle()を使えば簡単にシャッフルは作成可能。

◆実装例
<pre>
	def shuffle(self, card_list):
		# カードをシャッフルする
		random.shuffle(card_list)
		return card_list
</pre>

関連記事＞＞[【Python】random.shuffle()の活用例](https://se.miyabikno-jobs.com/python-random-shuffle/)

## トランプを画面に表示する方法
トランプクラスを呼び出してカードリストを作成。
その後5枚をピックアップします。

<pre>
class MyScene (Scene):
	def setup(self):
		# TrumpGame()クラスを呼び出してカードリストを作成	
		self.tg = TrumpGame()
		self.card_list = self.tg.make_card_list()
		self.card_list = self.tg.shuffle(self.card_list)
		self.draw_cards = []

		# 5枚ピックアップ
		for i in range(0, 5):
			self.draw_cards.append(
				self.card_list.pop(0)
			)
</pre>

続いて描画処理の作成です。
SpriteNode()でカードの文字列を渡してadd_child()で画面に描画します。

<pre>
	
		self.items = []
		for i,card in enumerate(self.draw_cards):
			item = SpriteNode('card:' + card)
			item.anchor_point = (0.5, 0)
			item.position = (80 + i * 50, 350)
			self.add_child(item)
			self.items.append(item)
</pre>

トランプ作成とsceneの処理をまとめたコードは以下です。

<pre>
from scene import *
import random

class MyScene (Scene):
	def setup(self):
		# バックグラウンド設定
		self.background_color = '#004f82'
		ground = Node(parent=self)
		
		self.tg = TrumpGame()
		self.make_draw_cards()

		self.items = []
		for i,card in enumerate(self.draw_cards):
				item = SpriteNode('card:' + card)
				item.anchor_point = (0.5, 0)
				item.position = (80 + i * 50, 350)
				self.add_child(item)
				self.items.append(item)
	
	def touch_began(self, touch):
		self.change_draw_cards()
	
	# 5枚引く処理
	def make_draw_cards(self):
		self.card_list = self.tg.make_card_list()
		self.card_list = self.tg.shuffle(self.card_list)
		self.draw_cards = []

		for i in range(0, 5):
			self.draw_cards.append(
				self.card_list.pop(0)
			)	
			
	# カードを交換する処理		
	def change_draw_cards(self):
		self.make_draw_cards()
		for i,card in enumerate(self.draw_cards):
				self.items[i].texture = Texture('card:' + card)
			
class TrumpGame:
	def make_card_list(self):	
		# マークのリスト
		symbol_list = ['Clubs', 'Hearts', 'Spades', 'Diamonds']
		# カードリスト
		card_list = ['Joker']

		# マークと数字を合体させる
		for symbol in symbol_list:
			for number in range(1, 14):
				# 11以上と1は置き換え
				if number == 1:
					card = symbol + 'A'
				elif number == 11:
					card = symbol + 'J'
				elif number == 12:
					card = symbol + 'Q'
				elif number == 13:
					card = symbol + 'K'
				else:
					# 10以下ならそのまま
					card = symbol + str(number)

					# カードをリストに追加
					card_list.append(card)
			
		return card_list
	def shuffle(self, card_list):
		# カードをシャッフルする
		random.shuffle(card_list)
		return card_list

if __name__ == '__main__':
	run(MyScene(), show_fps=False)
</pre>

◆実行例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415049/2fd84bd7-8df7-f40e-8ad6-b7aa53e9fe9e.gif" width="200px">

以上、Pythonista＋sceneでトランプを作成する処理でした。

Pythonistaについてはブログでもまとめています。
[Pythonistaの使い方まとめ](https://se.miyabikno-jobs.com/summary-pythonista/)

ブログでPythonistaで作るポーカー作成講座を作ってみました。
[Pythonista+sceneポーカー作成講座](https://se.miyabikno-jobs.com/pythonista-create-poker/ )