読者です 読者をやめる 読者になる 読者になる

灰色の棚

適当な話を適当に書くので、適当に見ていってください

Pythonを思い出そうと、毎度おなじみ15パズルを作ってみた


スポンサードリンク

f:id:syunki-gt:20150119233401j:plain
 3,4年ぶりくらいにPythonを触ってみようとしたんですが、完全に忘れてました。環境整えて、それからどうしようというレベルで。

 思い出すのも兼ねて、最近よくやる(新しい言語を覚えるときとか、思い出すときによく作る)15パズルづくりをやってみました。

 出来たものとかを報告しますー。では、いってみよー。

製作時間、2時間

 かかった時間は2時間でした。厳密にはもう少し短いけど、きっちりは測ってなかったのでそのくらい。

 作る考え方としては、

  • 1~15+0(空いているマスが0)の完成形リストを作る
  • 0を動かしていってシャッフルする
  • キーで0を動かせるようにする
  • 元の状態に戻ったらクリアとする

 という感じ。あとはリタイアを付けたくらいです。

コード

 書いたコードがこれ。考えながらザクザク作ったし、私がちょっと考えた程度なので雑かつ長いです。

# coding: utf-8
import random

def draw(pzl):
	count = 0
	draw_text = ""
	for piece in pzl:
		draw_text = draw_text + str(piece).zfill(2) + " "
		count = count + 1
		
		if count == 4:
			print draw_text
			draw_text = ""
			count = 0

def shuffle(pzl, num):
	piece = pzl
	
	wnum = 0
	key = 15
	while (wnum < num):
		move_viability = []
		if key < 12:
			move_viability.append(4)
		if key > 3:
			move_viability.append(-4)
		if key % 4 != 3:
			move_viability.append(1)
		if key % 4 != 0:
			move_viability.append(-1)
		
		change = random.choice(move_viability)
		
		tmp_piece = piece[key]
		piece[key] = piece[key + change]
		piece[key + change] = tmp_piece
		
		key = key + change
		
		wnum = wnum + 1
	return (piece, key)

def complete(check, correct):
	conti = True
	if check == correct:
		conti = False
	return conti

def input_check(dir, key):
	check = True
	if (dir == "w" and key > 3) or (dir == "d" and key % 4 != 3) or (dir == "s" and key < 12) or (dir == "a" and key % 4 != 0):
		check = False
	return check

if __name__ == '__main__':
	complete_pazzle = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0]

	shuffle_pazzle = list(complete_pazzle)
	shuffle_pazzle, key = shuffle(shuffle_pazzle, 1)
	
	bleak_check = False
	while complete(shuffle_pazzle, complete_pazzle):
		check_tmp = True
		direction = ""
		
		while check_tmp:
			draw(shuffle_pazzle)

			direction = raw_input("up:w, right:d, down:s, left:a, retire:0\n")
			check_tmp = input_check(direction, key)
			if direction == "0":
				bleak_check = True
				break
			if check_tmp:
				print "error"
		if bleak_check:
			break
		
		change = 0
		if direction == "w":
			change = -4
		elif direction == "d":
			change = 1
		elif direction == "s":
			change = 4
		elif direction == "a":
			change = -1
		
		print str(change) + " " + str(key)
		
		tmp_piece = shuffle_pazzle[key]
		shuffle_pazzle[key] = shuffle_pazzle[key + change]
		shuffle_pazzle[key + change] = tmp_piece
		
		key = key + change
	
	if bleak_check != True:
		draw(shuffle_pazzle)
		print "*Clear*"

 99行です。100行は切ったね(別に目指してなかったけど)

詰まりかけた点

 これらが詰まりかけました。文字コードは詰まったので日本語を使わない方向で回避しました。

 utf-8の設定にして、クォーテーションの前にuを付ければいいのかと思ったんですが、だめだったんですよねー。調べる時間を取るのも面倒だったので、なんちゃって英語にしましたが。うーん。


 演算子は++とか+=とかを使えるかのところ、ランダムはそのままインポートの有無、リストは代入するとコピーでなく場所を渡したような形になったのでいじりました。

 まぁ、そうだよねという感じでした。あとはelifだforだでちょっと調べものしたくらいかな。elseifじゃないのですねー。


 作り方的なものはもう何度目だって感じだったので簡単でした。そろそろ違うの作りたいけど、簡単そうななにかないかな……。

おわりに

 Pythonを思い出そうと作ってみました。とりあえず思い出した(というかそもそも極めてないからこの程度)けど、ここから何をしようかな。

 Pythonはちょっとした何かをするときには楽かなと思うけど、実際のところ何をするのに適するのかというのが分かっていません。その気になればゲーム作ったり、アプリ作ったりもできるんだろうけどなー。


 とりあえず、こんなところです。まぁ、触るだけでも楽しかったのでよし!

 では、今回はこのへんで。おわり!