// - - - - - - - - - - - - - - - - - - // 定数の定義 // - - - - - - - - - - - - - - - - - - #const MAIN_BUFFER_WIDTH 640 #const MAIN_BUFFER_HEIGHT 480 #const WORK_AREA_WIDTH 480 #const WORK_AREA_HEIGHT WORK_AREA_WIDTH #const SEL_MAX_X 3 #const SEL_MAX_Y SEL_MAX_X // must be same value #const WIDTH_PER_SEL_X WORK_AREA_WIDTH / SEL_MAX_X #const WIDTH_PER_SEL_Y WORK_AREA_HEIGHT / SEL_MAX_Y #const NULL 0 #const GOD 1 #const PLAYER 64 #const FALSE 0 #const TRUE 1 #const TMP_BUFFER_ID // - - - - - - - - - - - - - - - - - - // 関数の宣言 // - - - - - - - - - - - - - - - - - - if 0 { #deffunc putOnNull int p1, int p2, int p3 lose = p3 if( sel.p1.p2 ) : else { godxof = p1 godyof = p2 } return } // - - - - - - - - - - - - - - - - - - // プログラム開始位置 // - - - - - - - - - - - - - - - - - - buffer TMP_BUFFER_ID color boxf gsel *head // - - 変数の初期化 - - // dim sel, SEL_MAX_X, SEL_MAX_Y sel = GOD dim lose dim draw dim part dim blinkCount dim blinkXof dim blinkYof // - - サイズ削減用変数 - - // _MSGothic = "MS ゴシック" // - - - - - - - メインルーチン - - - - - - - // repeat // - - 画面初期化 - - // await 30 : redraw 0 color 0xff, 0xff, 0xff boxf // - - マウスがある座標のインデクスを取得 - - // xof = rnd( 3 ) yof = rnd( 3 ) if( started ) { xof = limit( mousex / WIDTH_PER_SEL_X, 0, 2 ) yof = mousey / WIDTH_PER_SEL_Y } // - - で、取得したインデクスを元にますを塗る - - // if( lose | draw ) : else : if( blinkCount >= 20 & started ) { pos xof * WIDTH_PER_SEL_X, yof * WIDTH_PER_SEL_Y gmode 3, WIDTH_PER_SEL_x, WIDTH_PER_SEL_Y, 96 - ( ( sel.xof.yof == NULL ) * 64 ) gcopy TMP_BUFFER_ID } // - - マウスクリックして、かつ、先客が居なければプレイヤのものにする - - // stick key if( ( blinkCount >= 20 ) * ( ( key & 256 ) + ( started == FALSE ) ) ) { if( sel.xof.yof | ( part \ 2 ) ) : else { sel.xof.yof = PLAYER blinkXof = xof blinkYof = yof dim blinkCount part++ } } if( ( started == FALSE ) * ( key & 256 ) ) { started++ dim numLose dim numDraw dialog "このゲームでは常にコンピュータに先攻が与えられます\nご了承ください", 2, "注意" if( stat == 7 ) : dialog "ご了承してください", 0, "そこをなんとか" break } // - - 右クリックしたら - - // if( key & 512 ) { // ブリンク切り替え blinkable ^= TRUE } if( blinkable ) { // ブリンク停止 blinkCount = 255 } if( lose & ( blinkCount > 16 ) ) { repeat 3 _quux = quux.cnt pos _quux \ 3 * WIDTH_PER_SEL_X, _quux / 3 * WIDTH_PER_SEL_Y gmode 3, WIDTH_PER_SEL_X, WIDTH_PER_SEL_Y, 32 gcopy TMP_BUFFER_ID loop } // - - ○、× を描く - - // color font _MSGothic, 160, 16 repeat SEL_MAX_Y _cnt = cnt repeat SEL_MAX_X if( sel.cnt._cnt ) { pos cnt * WIDTH_PER_SEL_X, _cnt * WIDTH_PER_SEL_Y if( sel.cnt._cnt == PLAYER ) { mes "×" } else { mes "○" } } loop loop // - - ブリンク状態なら消す blinkCount++ if( blinkCount < 20 ) { if( blinkCount & 4 ) { color 0xff, 0xff, 0xff boxf blinkxof * WIDTH_PER_SEL_X, blinkyof * WIDTH_PER_SEL_Y, ( blinkxof + 1 ) * WIDTH_PER_SEL_X, ( blinkyof + 1 ) * WIDTH_PER_SEL_Y } } // - - - - 枠線を描く - - - - // repeat SEL_MAX_Y + 1 color foo = WIDTH_PER_SEL_X * cnt line 0, foo, WORK_AREA_WIDTH, foo line foo, 0, foo, WORK_AREA_HEIGHT loop // - - 勝敗結果をかく - - // color 216, 216, 216 boxf WORK_AREA_WIDTH + 1 font _MSGothic, 16 pos WORK_AREA_WIDTH + 8, 4 color mes " - - 勝敗結果 - -" pos WORK_AREA_WIDTH + 16, 36 gosub*getResult mes result // - - プログラム名 - - // font _MSGothic, 12, 17 pos WORK_AREA_WIDTH + 44, WORK_AREA_HEIGHT - 20 mes "まるばつOX Light" // - - クリック - - // if( ( started ) | ( cnt & 8 ) ) : else { color 192, 192, 192 font _MSGothic, 32, 17 pos 124, 244 tmp = "Click to start" mes tmp color 64, 64, 64 font _MSGothic, 32, 17 pos 120, 240 mes tmp } redraw 1 if( blinkCount < 20 ) : continue if( lose ) { numLose++ tmp = "あなたは負け" } if( draw ) { numDraw++ tmp = "引き分け" } if( lose | draw ) { if( started ) : dialog tmp + "ました。もう一度やります?", 2 if( stat == 7 ) { gosub*getResult dialog "- 結果報告 - \n" + result, 0, "お疲れ様でた" end } else { break } } // - - 神様のパート - - // if( part \ 2 ) : else { continue // プレイヤのパートだったらスキップ } // - - 神様専用ルーチン(双方リーチにはなっていない(はず))) - - // dim godxof dim godyof if( sel.1.1 == PLAYER ) { godxof = 2 godyof = 2 } if( sel.2.0 == PLAYER ) { godxof = 0 godyof = 2 } if( sel.0.2 == PLAYER ) { godxof = 2 godyof = 0 } if( sel.2.1 == PLAYER ) { godxof = 0 godyof = 2 } if( sel.1.2 == PLAYER ) { godxof = 2 godyof = 0 } if( sel.1.0 == PLAYER ) { godyof = 2 } if( sel.0.1 == PLAYER ) { godxof = 2 } if( sel.2.2 == PLAYER ) { godxof = 0 godyof = 2 if( sel.0.1 == PLAYER ) { godxof = 2 godyof = 0 } } // - - 水平方向、および垂直方向のリーチを調査 - - // repeat SEL_MAX_X _cnt = cnt dim fh dim fv repeat SEL_MAX_X fv += sel._cnt.cnt fh += sel.cnt._cnt loop // 神様用 if( fh == 2 ) { // 水平 repeat SEL_MAX_X putOnNull cnt, _cnt, TRUE quux.cnt = _cnt * 3 + cnt loop break } if( fv == 2 ) { // 垂直 repeat SEL_MAX_Y putOnNull _cnt, cnt, TRUE quux.cnt = _cnt + cnt * 3 loop break } // プレイヤ側 if( fh == PLAYER * 2 ) { // 水平 repeat SEL_MAX_X putOnNull cnt, _cnt loop } if( fv == PLAYER * 2 ) { // 垂直 repeat SEL_MAX_Y putOnNull _cnt, cnt loop } loop // - - 斜め方向のリーチ検査 - - // if( ( fh != 2 ) & ( fv != 2 ) ) { // 神様勝利確定済につきスキップ  // 神様とプレイヤが同時にリーチを取ることは考えられていない // というより、ありえないはず fl1 = sel.0.0 + sel.1.1 + sel.2.2 // 右肩下がり fl2 = sel.2.0 + sel.1.1 + sel.0.2 // 右肩上がり // プレイヤ側がリーチ if( fl1 == PLAYER * 2 ) { putOnNull putOnNull 1, 1 putOnNull 2, 2 } if( fl2 == PLAYER * 2 ) { putOnNull 2 putOnNull 1, 1 putOnNull 0, 2 } // 神様がリーチ if( fl1 == 2 ) { putOnNull putOnNull 1, 1 putOnNull 2, 2, TRUE quux = 0, 4, 8 } if( fl2 == 2 ) { putOnNull 2 putOnNull 1, 1 putOnNull 0, 2, TRUE quux = 2, 4, 6 } } // 最後のマス if( ( part == 7 ) & ( lose != TRUE ) ) { repeat SEL_MAX_Y _cnt = cnt repeat SEL_MAX_Y putOnNull _cnt, cnt loop loop draw++ } part++ sel.godxof.godyof = GOD blinkXof = godxof blinkYof = godyof dim blinkCount loop goto*head *getResult result = strf( "勝利 : %9d\n", 0 ) + strf( "敗北 : %9d\n", numLose ) + strf( "引分 : %9d", numDraw ) return