Pythonを思い出そうと、毎度おなじみ15パズルを作ってみた
スポンサードリンク
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じゃないのですねー。
作り方的なものはもう何度目だって感じだったので簡単でした。そろそろ違うの作りたいけど、簡単そうななにかないかな……。