マインスイーパの概要 マインスイーパの準備 マインスイーパの完成 マインスイーパの改良

Slides:



Advertisements
Similar presentations
プログラミング演習( 2 組) 第 9 回
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
4章 制御の流れ-3.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
基礎プログラミングおよび演習 第8回.
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
配列の扱い、探索 有効範囲と記憶域期間 第12回 [7月10日、H.15(‘03)] 今日のメニュー 1 前回の課題の復習
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
第7回 条件による繰り返し.
C言語講座 第3回 ポインタ、配列.
プログラミング演習 バージョン1 担当教員:綴木 馴.
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング論 ファイル入出力
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
Cプログラミング演習 第7回 メモリ内でのデータの配置.
木の走査.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
第17章 その他の制御文 17.1 do-while文 17.2 goto文とラベル 17.3 break文による繰返し制御
プログラミング入門2 第11回 情報工学科 篠埜 功.
今までの練習問題の復習.
前回の練習問題.
第7回 条件による繰り返し.
プログラミング入門2 第11回 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
16.3 関数と構造体 ■ 乱数の発生 ■ 制御コード ■ 列挙型 ■ system関数
第11回 プログラミングⅡ 第11回
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
疑似乱数, モンテカルロ法によるシミュレーション
演習0 func0, func1, func2を作成せよ. main()関数の中で,func0()を呼び出しを実行せよ.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
GUI部品とイベント処理の例 マインスィーパもどきの作成 倉敷芸術科学大学 産業科学技術学部 梶浦文夫.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
プログラミング 2 静的変数.
Presentation transcript:

マインスイーパの概要 マインスイーパの準備 マインスイーパの完成 マインスイーパの改良 ゲームの作成 マインスイーパの概要 マインスイーパの準備 マインスイーパの完成 マインスイーパの改良

マインスイーパの概要 ゲームの目的 ゲームの勝敗・スコア ゲームのやり方 地雷が隠れているマス目を開けずに、(できるだけ早く)すべての地雷を見つけること ゲームの勝敗・スコア 地雷を掘り出したら負け 地雷以外を全部開けたら勝ち (所要時間は短いほうが良い) ゲームのやり方 マス目の座標を入力してマス目を開く 表示される数字は隣接する周囲のマス目に隠れている地雷の数を示す

マイン・スイーパの準備 m[5]: 5つの地雷の位置 map[5][5]: 地雷マップ用配列 status[5][5]: 隣接地雷数情報(ゲームボードの状況) status[][] map[][] A B C D E 1 0 1 0 0 0 2 0 0 0 0 1 3 1 0 0 0 0 4 0 0 0 0 0 5 1 0 0 1 0 A B C D E 1 -1-1-1-1-1 2 -1-1-1-1-1 3 -1-1-1-1-1 4 -1-1-1-1-1 5 -1-1-1-1-1 Mine m[] m[0]={4,1} m[1]={1,0} m[2]={3,4} m[3]={0,4} m[4]={0,2}

マイン・スイーパの準備(mines0.c) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define TRUE 1 #define BSIZE 5 // ゲームボードのサイズ #define MINENUM 5 // 地雷の数 // 地雷の位置座標の構造体 typedef struct { int x, y; } Mine; 整数値の座標で表現 Mine 型としてユーザー定義

マイン・スイーパの準備(mines0.c) static にしておくと初期化される // ゲームボード用データ構造 int status[BSIZE][BSIZE]; // 状況マップ(ゲームボード) static int map[BSIZE][BSIZE]; // 地雷マップ Mine m[MINENUM]; // 地雷の位置座標の配列 // 地雷を追加する関数 void Mine_set(Mine *p) { do { p??x = rand() % BSIZE; p??y = rand() % BSIZE; } while (map[p??y][p??x]); map[p??y][p??x] = TRUE; } 乱数で0~(BSIZE-1)を発生 すでに配置されている地雷と重複しないようチェック 地雷マップに登録

マイン・スイーパの準備(mines0.c) // ゲームボードの初期化関数 void Board_init(void) { int x, y, i; // 状況マップの初期化 for (y = 0; y < BSIZE; y++) for (x = 0; x < BSIZE; x++) status[y][x] = -1; // 地雷のセット for (i = 0; i < MINENUM; i++) Mine_set(&(m[i])); } 未探査状態は -1 地雷の数だけ呼び出す ポインタを渡す

マイン・スイーパの準備(mines0.c) // ゲームボードを画面に表示する関数 void Board_show(int status[BSIZE][BSIZE]) { int i, x, y; printf(" "); for (i = 0; i < BSIZE; i++) printf("%c", 'A' + i); printf("\n"); for (y = 0; y < BSIZE; y++) { printf("%d ", y + 1); for (x = 0; x < BSIZE; x++) { if (status[y][x] < 0) printf("#"); else printf("%1d", status[y][x]); } ボードの x 座標 A~E の表示 y 座標の数字表示 未探査なら # を表示 探査済みなら 隣接地雷数を表示

マイン・スイーパの準備(mines0.c) int main(void) { srand(time(NULL) % 100); // 乱数の初期化 Board_init(); Board_show(map); Board_show(status); return 0; } ゲームボードの初期化 地雷マップの表示(確認用) ゲームボードの表示

マイン・スイーパ(mineswpr.c) 前ページの main の代わりに以下のプログラムを差し替え enum MSTAT { MISS, NEAR, HIT }; // 地雷チェック結果 enum BSTAT { ALREADY, OPEN, BOMB }; // ボードオープン結果 // 地雷に近いかどうかをチェックする関数 enum MSTAT Mine_check(int cx, int cy, Mine *p) { int distX, distY; if (p??x == cx && p??y == cy) return HIT; distX = p??x - cx; // 地雷とのx方向の距離 distY = p??y - cy; // 地雷とのy方向の距離 if (-1 <= distX && distX <= 1 && -1 <= distY && distY <= 1) return NEAR; return MISS; } 地雷の位置と一致 地雷に隣接 周囲に地雷なし

マイン・スイーパ(mineswpr.c) // 指定された座標を開く関数 enum BSTAT Board_open(int x, int y) { int i, nearCount = 0; enum MSTAT ms; if (status[y][x] >= 0) return ALREADY; for (i = 0; i < MINENUM; i++) { ms = Mine_check(x, y, &m[i]); // 地雷チェック if (ms == HIT) return BOMB; if (ms == NEAR) nearCount++; // 隣接地雷のカウント } status[y][x] = nearCount; return OPEN; すでに開いた場所 地雷 地雷なし

PAD 乱数シードセット ゲームボードの初期化 Board_init() Board_show(status) ゲームボードの表示 座標入力 X座標チェック Y座標チェック メイン TRUE 入力座標を開く bs=Board_open(x,y) 無限ループ "地雷を踏んでしまいました!" break bs==BOMB? bs==ALREADY? (bs==OPEN?) 判定 continue "クリアしました!" openCount++ Board_show(status) 地雷座標の出力 残り==地雷数? break

マイン・スイーパ(mineswpr.c) int main(void) { int i, x, y, openCount = 0; char charX, charY, key[100]; enum BSTAT bs; srand(time(NULL) % 100); // 乱数シードセット Board_init(); // ゲームボードの初期化 // メインループ while (TRUE) { Board_show(status); printf("座標を入力してください(例 A1): "); fgets(key, 100, stdin); if (strlen(key) < 2) continue; // 入力されたX座標をチェックする charX = key[0]; if (charX < 'A' || charX > 'A' + BSIZE-1) continue; x = charX - 'A';

マイン・スイーパ(mineswpr.c) // 入力されたY座標をチェックする charY = key[1]; if (charY < '1' || charY > '1' + BSIZE-1) continue; y = charY - '1'; // オープン・判定 bs = Board_open(x, y); if (bs == BOMB) { printf("\a\a\a\a地雷を踏んでしまいました!\n"); break; } else if (bs == ALREADY) continue; else { openCount++; if (BSIZE*BSIZE - openCount == MINENUM) { printf("\aクリアしました!\n"); Board_show(status); }

マイン・スイーパ(mineswpr.c) // 地雷座標の出力 printf("\n"); for (i=0; i<MINENUM; i++) printf(" %c%d", 'A'+m[i]?x, 1+m[i]?y); return 0; }

スキルアップタイム1 マイン・スイーパの準備(mines0.c)をコンパイルし、地雷の位置が毎回異なることを確認せよ srand(…)の行をコメントアウトすると、どうなるか、確認せよ ゲームボードのサイズや地雷の数を変えてみよ

スキルアップタイム2 マイン・スイーパ(mineswpr.c)を完成させ、動作を確認せよ 地雷にヒットしたときの連続ビープ音を爆発音(EXPLODE.WAV)に変更せよ クリアしたときのビープ音をTa-dah!(ジャジャーン)に変更せよ(C:\WINDOWS\Media\TADA.WAV) 開始からクリアまでの時間を計測し、表示せよ

WAVファイルの再生 /* WAVファイルの再生 */ #include <windows.h> スキルアップタイム2のヒント /* WAVファイルの再生 */ #include <windows.h> #pragma comment(lib,"winmm") // winmm.lib をリンクする int main(void) { if (!PlaySound("EXPLODE.WAV", 0, SND_FILENAME)) printf("The sound didn't play."); if (!PlaySound("TADA.WAV", 0, SND_FILENAME)) return 0; } P:\2010年度後期\プログラミング入門2 フォルダに EXPLODE.WAV がある。 C:\WINDOWS\Media フォルダに TADA.WAV がある。

時間計測:秒単位(time1.c) #include <stdio.h> #include <stdlib.h> スキルアップタイム2のヒント #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, N=100000; int t1, t2; t1 = time(NULL); for (i=0; i<N; i++) printf(" %d", rand()%6 + 1); printf("\n"); t2 = time(NULL); printf("%d sec\n", t2-t1); return 0; } 時間関数用ヘッダ 変数宣言 計測対象 計測開始 計測終了 実行時間(秒数)

本日のパズル 次のプログラムは何を出力するか? #include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);} phillipps.c