Pythonで[ 1日目]にチェスゲームを書く


我々はCOVID - 19のためにロックダウンにあります、そして、それは休みです(学校も、ズームでさえありません).それで、私は仕事を1週間休んで、子供たちと過ごす時間を決めました.そして、本当に私の息子と小さなコードプロジェクトを実装するよりも私の時間のどのような良い使用?彼は学校でPythonを勉強していますが、彼らは多くのクラスを取得していません(COVID - 19を覚えていますか?)そして、あまりにも過去のprintではない、これは彼が彼のゲームをアップするための優れた機会かもしれないと私はクールなブログポストシリーズを書く!全勝利の状況.
彼は最近チェスに入っているので、私は彼がテキストチェスゲームを実行したいかどうか尋ねました、そして、彼は本当に興奮しているようでした(彼がそれを偽造していなかったかなり確信しています).
このシリーズでは、どのように我々はゲームの日ごとに実装を通過されます.これは12歳であり、私は教育の機会としてこれを使用しようとしていることを覚えて、私は最終的に我々はすべてのよく構造化された素敵な最適化されたコードで実装されていることを約束しますが、私はナイーブアプローチを開始することを選択し、私はすでに前に知っているすべてを適用する代わりに物事をより良いものを行う方法の結論に到着する.私は私たちはコマンドを使用してアンドゥ/リドゥ/リプレイゲームで終わるだろうかなりcerntain、私はまだ彼はまだしていない場合でも知っている.とにかく、プロセスを見て完全に楽しいの一部です.
あなたがこのシリーズを楽しむことを望みます、現在、飛び込みましょう!
私が最初にしたことは、チェスゲームの基本的なビルディングブロックが何であるかを彼に尋ねることでした.彼は私たちがたぶんボードから始めるべきだと言った.私が言及したように、彼はprintを学んだので、我々はラインとコラムを印刷することによって板を「ブルートフォース」にしようとしました:
print("-------------------------")
print("|  |  |  |  |  |  |  |  |  |")
あまり悪くない.
-------------------------
|  |  |  |  |  |  |  |  |  |
明らかに、彼は*と文字列の複製について既に、そしてendのパラメータを使用しています.
print("-"*25)
print("|  "*8, end="|\n")
コードはきれいだったが、出力はまだ1行だった!8が必要でした.彼は既にループについて知っていましたが、Pythonの構文についての経験はありませんでした.
for x in range(8):
  print("-"*25)
  print("|  "*8, end="|\n")
閉じるこの動画はお気に入りから削除されています
print("-"*25)
ループの後.
ルック!私たちは板を持っている.
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
|  |  |  |  |  |  |  |  |
------------------------------
OK、これは良いです-しかし、我々が実際に遊ぶことができるならば、我々はボード状態に関する情報を保存するために若干の種類のデータ構造を必要とします.
12 yoは配列について知っています、しかし、二次元配列についての推論は少しのジャンプでした、それで、リストのリストとしてそれを説明して、それは働きました.そこで、書き始めたコードは以下の通りです.
board = []
for i in range(8):
  row = []
  for j in range(8):
    row.append(None)
  board.append(row)
この点で、私は、これが最高の教育アプローチであるかどうか確信しませんでした-しかし、私はちょうど彼らのように、それらのひどい入れ子になったループを残すことができませんでした.
board = [[None]*8]*8
私はここで何をしていたかを説明し始めたが、彼はすでに文字列からこのタイプの構文に精通していたので、判明します-彼はちょうど何が起こっていたかを理解しました.
今、私たちはボードをプリントする方法を変えなければなりませんでした.実際にハードコードの文字列の代わりにボードを印刷します.
以下のメソッドを定義しました.
def print_board(board):
  for row in board:
    print("-"*25)
    for column in row:
       print("|{}".format(column), end="")
    print("|")
  print("-"*25)

board = [[None]*8]*8

print_board(board)
出力:
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
……作品を板に加えましょう.
私たちは、各々の部分のために標準的な1つの手紙を使用することに決めて、プレフィックスとして色WまたはBを加えます.
と付け加えました.
board[0] = ["BR","BN","BB","BQ","BK","BB","BN","BR"]
board[1] = ["BP","BP","BP","BP","BP","BP","BP","BP"]
board[6] = ["BP","BP","BP","BP","BP","BP","BP","BP"]
board[7] = ["BR","BN","BB","BQ","BK","BB","BN","BR"]
出力は全くバランスが取れていない.
------------------------------
|BR|BN|BB|BQ|BK|BB|BN|BR|
------------------------------
|BP|BP|BP|BP|BP|BP|BP|BP|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|None|None|None|None|None|None|None|None|
------------------------------
|BP|BP|BP|BP|BP|BP|BP|BP|
------------------------------
|BR|BN|BB|BQ|BK|BB|BN|BR|
------------------------------
12 yoは行番号と列文字を持つべきであると指摘したので、私たちはそれらを追加し、None値を2つの空白に変更しました.いくつかの微調整の後、我々は着陸しました:
def print_board(board):
    row_number = 8
    print("  ", end="")
    print(" ----"*8)
    for row in board:
        print(row_number, end=" ")
        row_number -= 1
        for cell in row:
            print("| {} ".format(cell), end="")
        print("|")
        print("  ", end="")
        print(" ----"*8)
    print("  ", end="")
    for letter in ['a','b','c','d','e','f','g','h']:
        print("  {}  ".format(letter), end="")
    print("")

board = [["  "]*8]*8
board[0] = ["BR","BN","BB","BQ","BK","BB","BN","BR"]
board[1] = ["BP","BP","BP","BP","BP","BP","BP","BP"]
board[6] = ["BP","BP","BP","BP","BP","BP","BP","BP"]
board[7] = ["BR","BN","BB","BQ","BK","BB","BN","BR"]

print_board(board)
出力:
   ---- ---- ---- ---- ---- ---- ---- ----
8 | BR | BN | BB | BQ | BK | BB | BN | BR |
   ---- ---- ---- ---- ---- ---- ---- ----
7 | BP | BP | BP | BP | BP | BP | BP | BP |
   ---- ---- ---- ---- ---- ---- ---- ----
6 |    |    |    |    |    |    |    |    |
   ---- ---- ---- ---- ---- ---- ---- ----
5 |    |    |    |    |    |    |    |    |
   ---- ---- ---- ---- ---- ---- ---- ----
4 |    |    |    |    |    |    |    |    |
   ---- ---- ---- ---- ---- ---- ---- ----
3 |    |    |    |    |    |    |    |    |
   ---- ---- ---- ---- ---- ---- ---- ----
2 | BP | BP | BP | BP | BP | BP | BP | BP |
   ---- ---- ---- ---- ---- ---- ---- ----
1 | BR | BN | BB | BQ | BK | BB | BN | BR |
   ---- ---- ---- ---- ---- ---- ---- ----
    a    b    c    d    e    f    g    h  
そして、それはその日のためだった.
次の時間を調整する方法を見ている!