Othello-判定(2017/10/9)
いろいろどたばたしてて間があいたが,まぁ現状読者もいないので問題ないだろう.
特に気にすることもなく気楽に更新する.
前回の更新はオセロの初期配置のみでしょうもないものだったが安心してほしい
今回からは本格的にゲームに重要なあたりを書く.
オセロのルールとして最低1枚以上相手の石をひっくり返すことのできる場所にしか置けないと言ったものがある.
これを実装するにはどうするのがいいのか.
アルゴリズムとしては簡単で
周囲8マスを走査し,それぞれでplayer_colorでない石が置かれていればその方向に走査をのばす.その方向の延長線上にplayer_colorの石があればokといったものである.
とりあえず実装するにあたって便利なので指定方向の反転可能な石の数を返す関数と,それを組み込んだ正当性判定の関数を作ろうと思う.
以下は指定方向の石の数を返す関数である.
def can_turn_over(board,player_color,p,q,d,e):
i = 1
while(board[p+i*d][q+i*e]==enemy_color(player_color)):
i+=1
if(board[p+i*d][q+i*e]==player_color):
return i-1;
else:
return 0;
簡単に引数と動作を解説すると,
(オセロ板の配列,置く石の色,石を置くy座標,石を置くx座標,y方向のベクトル,x方向のベクトル)
最後の2つには,それぞれ{-1|0|1}が入る
中で使ってるenemy_color(player_color)という関数だがこれはただ引数にいれられた石の色ではない色を返すだけの関数なので記載は省略する.
やってる内容は指定方向の次の石が違う色である間,返す値を加算し,while文を抜けたあとの次の石の色が自分のものであれば,挟んだ判定となり反転可能な石の数を返す.それ以外(つまり石がない,または場外)の場合,挟めていないので0を返す.
再帰で書いたほうがスマートだと思うが,面倒なのでまた別の記事で行おうと思う.
次は正当性の判定(指定した座標に石を置けるか置けないか)
def can_put(board,player_color,p,q):
if(p<1 or 8<p or q<1 or 8<q):
return 0;
elif(board[p][q] != 0):
return 0;
for i in range(-1,2,1):
for j in range(-1,2,1):
if(i==j==0):
None;
elif(can_turn_over(board,player_color,p,q,i,j) >0):
return 1;
else:
None;
return 0;
やってることが書いてるまんますぎるので解説はなし.
ただただ指定方向上の反転可能な石の数が0以上なら1返して,0なら0返すだけ.
またしばらく更新は止まると思うが,時間があれば更新するつもり.
制作その1(オセロ)-1
こんにちは.
ゲーム作るならまずは動作の少ないボードゲームから選びたい.
ボードゲームの中でもコマが2つしかないオセロなら簡単だろうと予想しゲーム制作第1弾とする.
何をつくるにせよまずはルールの確認から軽く全体像を設計する必要がある.
というわけでルールを確認しよう.
Othello Rule;
- 8×8の盤面.
- 2人のプレイヤ
- 黒と白のコマ
- 同色で挟んだ異色のコマをひっくり返す
- 最低1枚ひっくり返せる場所にしか置けない
- 初期スタートは黒2枚白2枚を中心に交互に配置
- パスの回数に制限は存在しない
- 盤面が埋まるか双方が打てなくなれば終了
- 最終時点で自色コマの多い奴が勝利
一応調べてて驚いたが日本発祥らしい.
韓国発祥って発言もあったがいつものアレだろう
まずは,2種類のコマと盤面の作成,及び初期配置をしよう.
いろいろ定義方法はあるだろうが今回は以下のようにしていく
コマ: 黒 = 1 , 白 = 2
盤面: 場外 = -1 , 未配置 = 0 , 黒配置 = 1 , 白配置 = 2
これを考慮して盤面を作成するにあたり今回は配列を使っていこうと思う.
配列は10×10(8×8じゃないのは場外をいれる為)を作成し,各所に対応する数字をいれていく.
実装方法は無数にあるが思いつくものをいくつかあげていこうと思う.
① : まんま書いちゃう
import numpy as np
board = np.array([[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 0, 0, 0, 1, 2, 0, 0, 0,-1],
[-1, 0, 0, 0, 2, 1, 0, 0, 0,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]])
② : for文を使う
board = [[0 for i in range(10)]for j in range(10)]
for i in range(0,10):
board[i][0] = board[0][i] = board[i][9] = board[9][i] = -1
board[4][4] = board[5][5] = 1
board[4][5] = board[5][4] = 2
他にもいろいろ書き方はあると思うが正直最初に一回しか呼び出さないので①で実装するのが一番確実かなと思ったり思わなかったり.
Python環境の導入(2017/8/16)
プログラミングをしようにもとりあえず環境がないと始まらない.
自分は普段ubuntuを利用しているが,だいたいの人がwindows派だろう.
というわけでwindowsへの導入の大まかな流れを書いていこうと思う.
- https://www.python.org/downloads/windows/へ飛び,求めるバージョンのインストーラをダウンロードしてくる.(基本的には一番新しいバージョンで問題ない)
- インストーラを起動し,インストールしていく.(とくに変更しなくていいならNextとかAgreeとか押しとけばいけるはず) 注:インストーラの環境変数の自動設定を有効にしておくか,インストール後にシステムの詳細設定から環境変数を登録すること
- コマンドプロンプトを起動し(”Windows+R”を押したあとcmdと入力しEnter), "python -V"と入力してみる. バージョン情報が表示されたら導入成功と考えていいだろう. コマンドが見つからない旨が表示されたら十中八九,環境変数の設定忘れだろう. 「Windows 環境変数 設定 やり方」等のワードで検索すれば解決策はたくさん出てくる. こんな適当なインストール手引よりよほどわかりやすいサイトも検索すればでてくる
適当に書いたが大まかな流れはこんなもんだろう.
ちなみにubuntuにはデフォルトで導入されているようで手動で導入する必要はない.
自分の使用している16.04LTSではデフォルトで2.Xが設定されており,pythonとターミナルに入力すれば2.Xが起動し,python3と入力すれば3.Xが起動する.
エディタはvi,sublimeText,Emacs,Terapad,メモ帳,秀丸,サクラエディタ,etc....
といろいろあり,使いなれたものを使えばいい.
どれが一番だ!!などと言及すると各エディタ派閥で戦争が勃発する危険性をがあり怖いのでやらない
長々と書いたが正直IDEを導入するのが一番楽なんじゃないだろうかとか思ったりする.
テスト投稿(2017/8/16)
はじめましてhatmanと申します.
テスト投稿も兼ねて軽く自己紹介をば.
Name : hatman(ハットマン)
Age : 20+α歳(α∈ℕ) --- この誤魔化し方をし始めて何年経過しただろうか
Hobby: 埴輪集めと音楽ゲーム(DDR,pop'n music)
Other: カフェイン中毒
C/C++/Javaを扱うプログラマ.
時代の波に取り残されるのを危惧しPythonを始める.
せっかく1から学ぶのであればブログを書いてみるかと考え今に至る.
"とりあえず簡単なゲームいくつか作ってみる"と目標をたてた.
とりあえず最初は動作の少ないボードゲーム
その中でもコマが2種類しかないオセロ(Othello)の作成を記事にしていこうと思う.
ちなみにブログを書くのは初体験なので拙文申し訳なす.