こんばんわ。
私は今、バラバラになった絵をスライドさせて元の絵に直すパズルを作っています。
一応タイトル画面→ゲーム画面→操作と今のところ遊ぶ事は出来るのですが、
それだけでは物足りないので、絵が完成するとクリア画面になり、次のステージへ続く風にした
いのです・・・。
void InitGame(void){
int y,x,yy,xx,temp;
for(y=0;y<4;y++){
for(x=0;x<4;x++){
st[y][x]=y*4+x;}
}
srand((unsigned)time(NULL)); //乱数パターンの初期化
for(y=0;y<4;y++){
for(x=0;x<4;x++){
xx=rand()%4; //ランダムな位置を求める
yy=rand()%4;
temp=st[y][x];//入れ替え
st[y][x]=st[yy][xx]; st[yy][xx]=temp;}
}
}
BOOL Checknumber(void){
BOOL n; int x,y,cnt=0;
n=TRUE;//TRUE;そろった、FALSE;そろっていない。
for(y=0;y<4;y++){
for(x=0;x<4;x++){
if(st[y][x]!=cnt){
n=FALSE;}
cnt++;}
}
return n;}
クリア画面に切り替わり、次のステージへ続けさせるにはどういったプログラムを組めば良いの
でしょうか?
頼りきったような質問で申し訳無いのですが出来たらご教授お願い致します。m(__)m
いわゆる「16パズル」ってやつを作ったことがあります。
私の場合はゲームではなくスクリーンセーバで、勝手に絵を組み立てていき、
完成したら次の画面で同じように...の繰り返しです。
その時は、WM_TIMERイベントを利用しました。
絵を復元する関数を用意しておきます。
(復元関数内で)絵が完成したら、n秒間隔のタイマーを生成し、関数は終了です。
n秒後にイベントが発生したら、そのタイマーは即刻廃棄し、
復元関数をコールします(いわゆる次のステージ)。
私がこれを作った時は、Windowsアプリなので、
何をするにも何らかのイベント発生をトリガにしたかったという思いがあり、
こういう手段をとってみましたが、
これはあくまで一例ですので、他にもやり方は色々あるはずです。
参考になればよいのですが。
早速のお返事ありがとうございます!
スクリーンセーバでも「16パズル」が作れるのですねぇ。(・o・)
私のはVisual C++を使ってマウスで動かし、絵が揃い完成したら今度は数が縦横4ブロッ
クだったのが5ブロックと細かくなり、難易度を増せるようにしたいんです・・・。
それが頭では分っかているつもりでもいざ、プログラムを組み立て始めようとすると、
どうやってプログラムを組めばいいのか迷い行き詰まってしまったのです・・・。(__),
>参考になればよいのですが。
いえいえ、返事を貰えただけでも有難いです。(^-^)
手順だけならばこうですね。
下記を一つのダイアログ等で処理すれば簡単に出来るはず・・
メイン処理 {
// タイトル表示
// メインループ開始( while(1)等のループ
// 初期化処理(一回目は4で以降5・6・・)で初期化(initgemeに引数を渡そう
// サブルーチンへ
// 終了ならメインループを抜ける
// メインループ終了
}
サブルーチン{
// 入力判定
// チェックナンバー
}
CheckNumber()関数はFALSEになった時点でreturnするなりして
ループから抜けないとまずくないですか?
あ、なるほど!
確かにループから抜けないとまずかったですね・・・。
TAKAさんのやり方にしてみたらうまくいきました!
sugarさん、TAKAさん、EIJIさん親切に教えていただき、ありがとうございましたぁ。
m(__)m