🌸 「なでしこ」
>
🍯 「貯蔵庫」
n目並べ(m人対戦用) n,m ∈ ℕ, n > 2, m > 1
🌟新規
📒一覧
🔌
🔍検索
🚪ログイン
n目並べ(m人対戦用) n,m ∈ ℕ, n > 2, m > 1 📖
2人以上対象の四目並べ。四目並べを作っていたら、五目並べを作りたくなり色々した
プログラム:
(→大)
# N目並べ X=0 Y=0 countlimit = 13 count = countlimit NumberTimes = [] Observer = 0 #0がプレイ中、1がゲーム終了を示す Winer = 0 #勝者の番号 #それぞれ縦のマス目の数と横のマス目の数 Horizontal_row = 15 Vertical_row = 15 Width = (描画中キャンバスの"height"をDOM属性取得)/(Vertical_row+2)#Widthはキャンバス上のマスをどれだけ離すか。 Stage = 盤面初期化 #Stageは集合。Stageは左から順に縦列を設定している。 Who = 1 #whoは手番の人。1で赤。2で青。 Limit = 4 #Limitは揃える目の長さ Type = 2 #Typeは想定している人数 Colors = { "1":"#FF0000", "2":"#0000FF", "3":"#FFA500", "4":"#00FF00", "5":"#DA70D6", "6":"#808080", "7":"#000000", } #辞書型変数で色を対応させる Type_Limit = Colorsの要素数 #Type_Limitは実装しているColorのパターン数 Direction = [[0,1,0,-1],[1,1,-1,-1],[1,0,-1,0],[1,-1,-1,1]] #確認する方向を(x,y,x,y)の形で反対方向と同時に接続 Gravity = 1 #落下するかどうか。1ならあり。0ならなし main__盤面描画 "request"を1秒毎 ●request: count = count - 1 もしcount == 0なら: もしObserver == 0ならば: X=乱数(Horizontal_row) Y=乱数(Vertical_row) もし(盤面範囲(X,Y))ならば: Y=石落下場所(X) もしStage[X,Y] == 0なら: Stage[X,Y] = Who チェック 手番交代 count = countlimit 盤面描画 [Width,Width-5]へ" {count}秒"を文字描画 Resetボタン=「Reset」のボタン作成 Resetボタンに{ "文字サイズ": "30px"}をDOMスタイル一括設定。 Resetボタンをクリックした時には: 初期化 Gravityボタン=「Gravity」のボタン作成 Gravityボタンに{ "文字サイズ": "30px"}をDOMスタイル一括設定。 Gravityボタンをクリックした時には: もしGravity==1ならば: Gravity=0 違えば: Gravity=Gravity+1 初期化 Typeボタン="Type"のボタン作成 Typeボタンに{ "文字サイズ": "30px"}をDOMスタイル一括設定。 Typeボタンをクリックした時には: もしType==Type_Limitならば: Type=2 違えば: Type=Type+1 初期化 timer_button="timer"のボタン作成 timer_buttonに{ "文字サイズ": "30px"}をDOMスタイル一括設定。 timer_buttonをクリックした時には: もしcountlimit == 10なら: countlimit = 2 違えば: countlimit = countlimit+2 初期化 Reroll = "Reroll"のボタン作成 Rerollに{ "文字サイズ": "30px"}をDOMスタイル一括設定。 Rerollをクリックした時には: もし0 < 要素数(NumberTimes)なら: X = 配列ポップ(NumberTimes) Y = 配列ポップ(NumberTimes) Stage[X,Y] = 0 Who = ((要素数(NumberTimes))/2%Type) + 1 count = countlimit Observer = 0 main__盤面描画 描画中キャンバスをマウス押した時には: もしObserver=0なら: X=FLOOR(マウスX/Width)-1 Y=FLOOR(マウスY/Width)-1 もし盤面範囲(X,Y)&&Stage[X,Y] == 0なら: Y=石落下場所(X) Stage[X,Y] = Who チェック 手番交代 違えば: "{Limit}個揃ってるよ!"と言う 盤面描画 [Width,Width-5]へ" {count}秒"を文字描画 count = countlimit ●初期化: 全タイマー停止 Stage = 盤面初期化 NumberTimes = [] Who = 1 count = countlimit Observer = 0 盤面描画 "request"を1秒毎 ●チェック: Directionを反復: 定数[ax,ay,bx,by]=対象 counter = 一方(一方(Limit-1,ax,ay),bx,by) もしcounter < 1なら: 全タイマー停止 Observer = 1 Winer = Who 抜ける ●一方(i,x,y): もしi>0ならば: jを1からLimit-1まで繰り返す: もし盤面範囲(X+x*j,Y+y*j)なら: もしStage[X+x*j,Y+y*j] == Whoなら: i=i-1 違えば: iを戻す iを戻す ●手番交代: NumberTimesにYを配列追加 NumberTimesにXを配列追加 Who = ((要素数(NumberTimes)/2)%Type) + 1 ●(x)石落下場所: もしGravity == 0なら: もしStage[x,Y] = 0なら: Yを戻す 違えば: iをVertical_row-1から0まで繰り返す: もしStage[x,i]=0なら: iを戻す ●縦列作成: 縦列 = [] Vertical_row回: 縦列に0を配列追加 縦列を戻す ●(x,y)盤面範囲: もし(x>=0 && x<Horizontal_row && y>=0 && y<Vertical_row)なら: trueを戻す falseを戻す ●盤面初期化: 盤面 = [] 縦列 = 縦列作成 iを0から(Horizontal_row-1)まで繰り返す: 盤面[i] = 縦列を配列複製 盤面を戻す ●盤面描画: 全描画クリア vを1からVertical_rowまで繰り返す: hを1からHorizontal_rowまで繰り返す: 線太設定(2) "#FFFFFF"に塗色設定 [h*Width,v*Width+1,Width,Width]に四角描画 もしStage[h-1,v-1]>0なら: 線太設定(0.1) (Colors["{Stage[(h-1),(v-1)]}"])に塗色設定 [h*Width+Width/2,v*Width+Width/2]へWidth/4の円描画 線太設定(2) "bold {Width}px serif"に描画フォント設定 もしObserver=0なら: Colors[Who]に塗色設定 [Width*3,Width-5]へ" {Who}番です {Type}人用 重力{Gravity} 長さ{Limit}"を文字描画 違えば: Colors[Winer]に塗色設定 [Width*3,Width-5]へ" {Winer} の勝ちです"を文字描画
プログラムを実行
⭐ クレスト 作
タイトル:
n目並べ(m人対戦用) n,m ∈ ℕ, n > 2, m > 1
ライセンス:
MIT (
改変可/表示
)
タイプ:
wnako
タグ:
ゲーム
,
四目並べ
,
五目並べ
,
対戦ゲーム
,
暇つぶし
,
初心者
利用バージョン:
3.4.24
作成日時:
2023/12/14 20:00 (編集: 2024/09/16 16:09)
公開の投稿
⭐⭐
ログイン
して★を付けよう!
📝作品を編集
作品公開情報
📍この作品のURL:
📍アプリ(即時実行)のURL:
📍アプリ(実行ボタンあり)のURL:
📍ブログパーツ:
上記HTML↑をブログに貼り付けることでアプリを埋め込めます。
📍ライブラリ直リンク - 『!「***」を取込』で使うとき:
📍なでしこハブ (最新版の反映は1日後):
ソースの確認
編集履歴の確認
通報数:
0
通報って何?