Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2018/03/02 09:33:22

MixJuice GET URL : kidspod.club/mj/468

IMines

『IMines(あいまいんず)』は、隠された地雷を避けながらマスを開くパズルゲームです。

【ルール】
縦 16 x 横 16 の 256 マスのフィールド上に 40 個の地雷が隠されています。
(昔の「Microsoft Windows」付属「マインスイーパー」の「中級」と同じ)
地雷を避けつつマスを開いて下さい。

開かれたマスに数字が書かれている場合があります。
その数字は、その周囲 8 マスに隠されている地雷の個数を表しています。

地雷のあるマスが判明した場合、そのマスに印を付けることができます。
フィールド右上の数字は、隠されている地雷の個数を示しており、
マスに印を付けることで、この数字が減少します。

開かれたマスに書かれた数字と、地雷の残り個数を手掛かりに、
地雷が置かれていないマスを全て開けばゲームクリアです。

地雷の置かれているマスを開けばゲームオーバーです。

【操作】
矢印 : 現在位置を移動する
SPACE : 現在位置のマスを開く
上記以外のキー : 現在位置のマスに印を付ける(または印を消す)

【更新履歴】
2018/03/04 初版公開
2018/05/11 初手で地雷を踏まないよう修正、印をイチゴに変更、コード最適化

【ソースコード解説】
《変数》
K : Key, キー入力値
X : 現在位置の X 座標
Y : 現在位置の Y 座標
C : Character, 現在位置の本来のキャラクタ
O : Open, 開いたマスの数
M : Mine, 地雷の残り個数
U : 地雷を配置する際の地雷の Y 座標
V : 地雷を配置する際の地雷の X 座標
I,J : Iterator, ループ変数
S : SCR, 一時変数(ゲームオーバー時の地雷配置表示に利用)
H : Hit, 一時変数(ゲームオーバー時の地雷配置表示に利用)

《配列》
[0] ~ [15] : 地雷の配置

《PCGパターン》
#E0 : 現在位置のキャラクタ

《コード》
5 : タイトル
10 : 初期化
20 : フィールド描画
30 : キー入力受付と矢印キー押下時の処理
30 : 矢印キー押下時の処理
40 : マスに印を付けるキー押下時の処理
50 : SPACE キー押下時の処理と地雷の配置
60 : マスを開く処理とゲームクリア判定
70 ~ 80 : ゲームオーバー時の処理
90 : 地雷の残り個数の表示
100 : 現在位置へカーソルを移動
110 : 現在位置のキャラクタ定義
120 : 空いているマスへ地雷を配置

【その他】
容量の都合により「開いたマス周囲に地雷が無い場合に、地雷の無いマスを自動的に開く処理」は実装されていません。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

SOURCE CODE

5 'IMines
10 CLS:CLV:CLP:C=2:M=40
20 FOR I=2 TO 19:FOR J=7 TO 24:LC J,I:?CHR$(2-((I=2)|(I=19)|(J=7)|(J=24)));:NEXT:NEXT:GSB90:GSB100:GSB110:?CHR$(#E0);
30 K=INKEY():IF !K GOTO30 ELSE IF K>27&&K<32 GSB100:?CHR$(C);:X=(X-(K=28)+(K=29))&15:Y=(Y-(K=30)+(K=31))&15:GSB100:C=SCR():GSB110:?CHR$(#E0);:GOTO30
40 IF K!=32&&C=2||C=255 C=(C=2)*255+(C=255)*2:M=M-(C=255)+(C=2):GSB90:GSB110:GOTO30
50 IF C!=2 GOTO30 ELSE IF !O FOR I=1 TO 40:GSB120:NEXT
60 IF !([Y]>>X&1) C=0:FOR I=Y-1 TO Y+1:IF I<0||I>16 NEXT ELSE FOR J=X-1 TO X+1:C=C+[I]>>J&1:NEXT:NEXT:C=C+48*(C>0):GSB100:GSB110:?CHR$(#E0);:O=O+1:IF O<216 GOTO30 ELSE LC 13,21:?"CLEAR!":END
70 C=42:GSB110:FOR Y=0 TO 15:FOR X=0 TO 15:GSB100:S=SCR():H=[Y]>>X&1:IF S=2&&H ?"*"; ELSE IF S=255&&!H ?"x";
80 NEXT:NEXT:LC 11,21:?"GAME OVER!":END
90 LC 23,1:?M," ";:RTN
100 LC X+8,Y+3:RTN
110 FOR I=0 TO 7:POKE #700+I,~PEEK(C*8+I):NEXT:RTN
120 U=RND(16):V=RND(16):IF ABS(X-U)<2&&ABS(Y-V)<2 GOTO120 ELSE IF [U]>>V&1 GOTO120 ELSE [U]=[U]|1<<V:RTN

COMMENT

Kidspod運営チーム
Kidspod運営チーム2018/03/16 11:57:46

windows版と違ってまとめて開くことができない分、こちらの方がより集中力を要求されますね。タイムアタックができるようになったら、一晩中遊んでしまいそうです。あとは、初手は地雷を踏まないという仕様にすると、より一層マインスイーパになりますね。