こちらで質問させていただいたところ、こちらの方が良いということでしたので、質問させていただきます。
利用規約には相互リンクが必要、とのことですが、利用規約を読む前にYahoo!知恵袋の回答を解決済みにしてしまったために、相互リンクが出来ませんでした。
御無礼申し訳ありません。
- OS Windows 7 Home Premium(32 bit)
- Compiler Microsoft Visual C++ 2010 Express
- library DXライブラリ
また、C言語のレベルに関しては、初心者レベルです。
具体的なソースコードは以下のようになります。
宣言部がやや怪しくなっていますが、知識不足です。
#include "DxLib.h"
#define ELEMENTS 6 //data.popの要素数
#define CROSS ELEMENTS-1 //×
#define BLOCK CROSS-1 //BLOCK
#define RAND BLOCK-2 //乱数に使う
//プロトタイプ宣言
typedef unsigned int natural;
typedef const int equable;
typedef struct{
natural m[14][6],e[14][6];
}MASS;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);
static void UpdateKey(char *KeyStateBuf);
static int Fall(MASS &mass,bool flag,natural mNext[2],natural eNext[2],natural linkage[2]);
static int Link(MASS mass,int x,int y,int kind,MASS &checked,bool flag);
static void Delete(MASS &mass,int x,int y,int kind,bool flag);
static int PopJelly(natural level);
static int StoryMode(void);
static int FreeMode(void);
static int ConfigMode(void);
typedef struct{
int image[6],pop[ELEMENTS],character[5],effect[4],music[1];
}DATA;
DATA data;
/*Music http://nochiko.websozai.jp/
~~~:(width,height)
スクリーン:640,480
ぷよ:38,38
ぷよが置けるエリア:228,456
余白:46,12
プレイヤーと敵の間:92
~~~:自分(x,y) 敵(x,y)
ぷよが置けるエリア:46,12 366,12
×の位置:122,12と160,12 442,12と480,120
~~~:補足
横のマス数 6
縦のマス数 12 (+1 {非表示})
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
【要注意】
Releaseする時には、pop-jellyフォルダを
ドキュメント/DxLib_VC/Toolにあるやつでdxaファイルにし、
D:\pop-jellyにコピーして、圧縮すること。
SetOutApplicationLogValidFlagをFALSEに設定すること。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
*/
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
if(ChangeWindowMode(TRUE)==-1 || SetGraphMode(640,480,16)!=DX_CHANGESCREEN_OK || DxLib_Init()==-1)return -1;
if(SetOutApplicationLogValidFlag(TRUE)==-1 || SetAlwaysRunFlag(TRUE)==-1 || SetDrawScreen(DX_SCREEN_BACK)==-1 || SetWindowText("ポップ ゼリー")==-1)goto last;
//宣言
//画像全般
data.image[0]=LoadGraph("./pop-jelly/Image/background/title.png"); //タイトル
data.image[1]=LoadGraph("./pop-jelly/Image/background/background.png"); //ポップゼリー メイン背景
data.image[2]=LoadGraph("./pop-jelly/Image/background/frame.png"); //ポップゼリー フレーム部分
data.image[3]=LoadGraph("./pop-jelly/Image/message.png"); //メッセージ表示領域
data.image[4]=LoadGraph("./pop-jelly/Image/select.png"); //選択ボタン
data.image[5]=LoadGraph("./pop-jelly/Image/select_now.png"); //現在選択中のもの
//ポップ画像
data.pop[0]=0;
data.pop[1]=LoadGraph("./pop-jelly/Image/pop/red.png"); //赤ポップ
data.pop[2]=LoadGraph("./pop-jelly/Image/pop/blue.png"); //青ポップ
data.pop[3]=LoadGraph("./pop-jelly/Image/pop/green.png"); //緑ポップ
// data.pop[4]=LoadGraph("./pop-jelly/Image/pop/pink.png"); //ピンクポップ
data.pop[4]=LoadGraph("./pop-jelly/Image/pop/block.png"); //ブロックポップ
data.pop[5]=LoadGraph("./pop-jelly/Image/pop/cross.png"); //×
//キャラクター画像
data.character[0]=LoadGraph("./pop-jelly/Image/character/slime1.png"); //アースLv1
data.character[1]=LoadGraph("./pop-jelly/Image/character/slime2.png"); //アースLv2
data.character[2]=LoadGraph("./pop-jelly/Image/character/slime3.png"); //アースLv3
data.character[3]=LoadGraph("./pop-jelly/Image/character/slime4.png"); //アースLv4
data.character[4]=LoadGraph("./pop-jelly/Image/character/sun.png"); //サン
//効果音
data.effect[0]=LoadSoundMem("./pop-jelly/Music/message.ogg"); //次のメッセージへ移る時
data.effect[1]=LoadSoundMem("./pop-jelly/Music/select.ogg"); //選択効果音
data.effect[2]=LoadSoundMem("./pop-jelly/Music/enter.ogg"); //決定音
data.effect[3]=LoadSoundMem("./pop-jelly/Music/story/vire.ogg"); //剣が当たる音
//音楽
data.music[0]=LoadSoundMem("./pop-jelly/Music/title.ogg"); //タイトル
int flag=0;
//此処にタイトル描写処理がありますが、省きます。
flag=FreeMode();
if(flag==1)goto title;
last:
DxLib_End();
return 0;
}
static void UpdateKey(char *KeyStateBuf){
char key[256];
GetHitKeyStateAll(key);
for(int i=0;i<256;i++){
if(key[i]==0)KeyStateBuf[i]=0;
else KeyStateBuf[i]++;
}
}//完全実装 不具合なし
static int Fall(MASS &mass,bool flag,natural mNext[2],natural eNext[2],natural linkage[2]){
int n=0;
char string[2][3];
sprintf_s(string[0],"%d",linkage[0]);
sprintf_s(string[1],"%d",linkage[1]);
if(flag) //自分
for(int x=0;x<6;x++) //一番左から
for(int y=13,i;y>=0;y--){ //一番下から
if(mass.m[y][x]==0){ //空のマスなら
for(i=y-1;i>=0 && (mass.m[i][x]==0 || mass.m[i][x]==CROSS);i--); //空のマスと、×は飛ばす
if(i<0)break; //上にポップがない
if(!n)n=1; //ループ用
for(i=y;i>=0;i--)
if(mass.m[i][x]!=CROSS)
mass.m[i][x]=i>0 && mass.m[i-1][x]!=CROSS ? mass.m[i-1][x] : 0; //このマスをすぐ上のマスに。一番上か、上が×なら、空にする
if(mass.m[2][2]==0)mass.m[2][2]=CROSS; //×の位置
if(mass.m[2][3]==0)mass.m[2][3]=CROSS;
if(mass.e[2][2]==0)mass.e[2][2]=CROSS;
if(mass.e[2][3]==0)mass.e[2][3]=CROSS;
for(int y=-64,i=0;y<=430;y+=38,i++){
for(int x=46,j=0;x<=236;x+=38,j++)mass.m[i][j] && DrawGraph(x,y,data.pop[mass.m[i][j]],TRUE);
for(int x=366,j=0;x<=556;x+=38,j++)mass.e[i][j] && DrawGraph(x,y,data.pop[mass.e[i][j]],TRUE);
}
DrawGraph(0,0,data.image[2],TRUE); //枠(背景)
DrawGraph(278,10,data.pop[mNext[0]],TRUE); //次のポップを表示(自分)
DrawGraph(278,48,data.pop[mNext[1]],TRUE);
DrawGraph(321,10,data.pop[eNext[0]],TRUE); //次のポップを表示(敵)
DrawGraph(321,48,data.pop[eNext[1]],TRUE);
linkage[0] && DrawString(278,400,string[0],0x000000); //連鎖数を表示(自分)
linkage[1] && DrawString(321,400,string[1],0x000000); //連鎖数を表示(敵)
if(!(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0))return 0;
DrawGraph(0,0,data.image[1],TRUE); //枠(メイン)
Sleep(50);
break;
}
}
else //敵
for(int x=0;x<6;x++)
for(int y=13,i;y>=0;y--){
if(mass.e[y][x]==0){
for(i=y-1;i>=0 && (mass.e[i][x]==0 || mass.e[i][x]==CROSS);i--);
if(i<0)break;
if(!n)n=1;
for(i=y;i>=0;i--)
if(mass.e[i][x]!=CROSS)
mass.e[i][x]=i>0 && mass.e[i-1][x]!=CROSS ? mass.e[i-1][x] : 0;
if(mass.m[2][2]==0)mass.m[2][2]=CROSS;
if(mass.m[2][3]==0)mass.m[2][3]=CROSS;
if(mass.e[2][2]==0)mass.e[2][2]=CROSS;
if(mass.e[2][3]==0)mass.e[2][3]=CROSS;
for(int y=-64,i=0;y<=430;y+=38,i++){
for(int x=46,j=0;x<=236;x+=38,j++)mass.m[i][j] && DrawGraph(x,y,data.pop[mass.m[i][j]],TRUE);
for(int x=366,j=0;x<=556;x+=38,j++)mass.e[i][j] && DrawGraph(x,y,data.pop[mass.e[i][j]],TRUE);
}
DrawGraph(0,0,data.image[2],TRUE);
DrawGraph(278,10,data.pop[mNext[0]],TRUE);
DrawGraph(278,48,data.pop[mNext[1]],TRUE);
DrawGraph(321,10,data.pop[eNext[0]],TRUE);
DrawGraph(321,48,data.pop[eNext[1]],TRUE);
linkage[0] && DrawString(278,400,string[0],0x000000);
linkage[1] && DrawString(321,400,string[1],0x000000);
if(!(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0))return 0;
DrawGraph(0,0,data.image[1],TRUE);
Sleep(35);
break;
}
}
return n;
}// この関数内では、Sleepが使われていて、(一応)時間制御をしています。
static int Link(MASS mass,int x,int y,int kind,MASS &checked,bool flag){
int number=1;
if(flag){
if(checked.m[y][x]==1)return 0; //既にチェック済み
checked.m[y][x]=1;
if(mass.m[y][x]==0 || mass.m[y][x]==BLOCK || mass.m[y][x]==CROSS)return 0; //空かブロックポップか×
if(y>2 && mass.m[y-1][x]==kind)number+=Link(mass,x,y-1,kind,checked,flag); //上
if(x<5 && mass.m[y][x+1]==kind)number+=Link(mass,x+1,y,kind,checked,flag); //右
if(x>0 && mass.m[y][x-1]==kind)number+=Link(mass,x-1,y,kind,checked,flag); //左
if(y<13 && mass.m[y+1][x]==kind)number+=Link(mass,x,y+1,kind,checked,flag); //下
}
else{
if(checked.e[y][x]==1)return 0; //既にチェック済み
checked.e[y][x]=1;
if(mass.e[y][x]==0 || mass.e[y][x]==BLOCK || mass.e[y][x]==CROSS)return 0; //空かブロックポップか×
if(y>2 && mass.e[y-1][x]==kind)number+=Link(mass,x,y-1,kind,checked,flag); //上
if(x<5 && mass.e[y][x+1]==kind)number+=Link(mass,x+1,y,kind,checked,flag); //右
if(x>0 && mass.e[y][x-1]==kind)number+=Link(mass,x-1,y,kind,checked,flag); //左
if(y<13 && mass.e[y+1][x]==kind)number+=Link(mass,x,y+1,kind,checked,flag); //下
}
return number; //結合数
}//微妙 ポップがくっついた時の画像変更 要実装
static void Delete(MASS &mass,int x,int y,int kind,bool flag){
if(flag){
if(mass.m[y][x]==kind){
mass.m[y][x]=0; //消す
if(y>2 && mass.m[y-1][x]==kind)Delete(mass,x,y-1,kind,flag); //上
if(x<5 && mass.m[y][x+1]==kind)Delete(mass,x+1,y,kind,flag); //右
if(x>0 && mass.m[y][x-1]==kind)Delete(mass,x-1,y,kind,flag); //左
if(y<13 && mass.m[y+1][x]==kind)Delete(mass,x,y+1,kind,flag); //下
}
}
else{
if(mass.e[y][x]==kind){
mass.e[y][x]=0; //消す
if(y>2 && mass.e[y-1][x]==kind)Delete(mass,x,y-1,kind,flag); //上
if(x<5 && mass.e[y][x+1]==kind)Delete(mass,x+1,y,kind,flag); //右
if(x>0 && mass.e[y][x-1]==kind)Delete(mass,x-1,y,kind,flag); //左
if(y<13 && mass.e[y+1][x]==kind)Delete(mass,x,y+1,kind,flag); //下
}
}
}
static int PopJelly(natural level=0){
//宣言
int count[2]={60,60}; //ポップが床等に最初に付いてからの経過時間 再度離れた場合は、少し減らす(未実装) ついてから下を押すと増やす(未実装)
natural time[2]={1,1}; //1/60秒に一回1増加。 1秒たつと、1に初期化。(自分,敵)
natural process[2]={0,0}; //時間制御用変数 //未使用。。。。
natural turn[2]={0,0}; //回転回数(自分,敵)
natural linkage[2]={0,0}; //連鎖数(自分,敵)
natural block={0,0}; //BLOCK ポップの数(自分,敵)
bool chain[2]={false,false}; //連鎖フラグ(自分,敵)
bool countflag[2]={false,false}; //カウントフラグ(自分,敵)
char key[256]; //キー保存用
natural mKind[2]={GetRand(RAND)+1,GetRand(RAND)+1}; //ポップの種類(上,下)(自分)
natural eKind[2]={GetRand(RAND)+1,GetRand(RAND)+1}; //ポップの種類(上,下)(敵)
natural mNext[2]={GetRand(RAND)+1,GetRand(RAND)+1}; //次のポップ(上,下)(自分)
natural eNext[2]={GetRand(RAND)+1,GetRand(RAND)+1}; //次のポップ(上,下)(敵)
POINT mPosition[2]={{2,0},{2,1}}; //ポップの場所(x,y)(自分)
POINT ePosition[2]={{2,0},{2,1}}; //ポップの場所(x,y)(敵)
const MASS copy={}; //チェック用変数の初期化コピー用
MASS checked; //チェック用
MASS mass={ //フィールド用
{ //自分
{0,0,0,0,0,0}, //この列に積んだら消す
{3,1,0,0,1,1}, //とりあえず、まずは連鎖を組んでみたところから
{3,3,3,2,1,3},
{2,3,1,1,2,1},
{3,1,2,2,1,3},
{1,2,1,3,2,3},
{2,1,3,2,1,3},
{1,2,1,3,2,1},
{1,2,1,3,2,1},
{1,3,3,2,1,2},
{3,1,2,3,2,2},
{2,3,1,2,3,1},
{2,3,1,2,3,1},
{2,3,1,2,3,1}
},
{ //敵
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0}
}
};
do{
if(ProcessMessage()!=0)return 0;
UpdateKey(key);
DrawGraph(0,0,data.image[1],TRUE); //枠(背景)
natural my1=mPosition[0].y,mx1=mPosition[0].x,my2=mPosition[1].y,mx2=mPosition[1].x;
natural ey1=ePosition[0].y,ex1=ePosition[0].x,ey2=ePosition[1].y,ex2=ePosition[1].x;
if(count[0]==60){ //次のポップ(自分)
while(Fall(mass,true,mNext,eNext,linkage)); //浮いているポップがなくなるまで落とす
mass.m[0][0]=0; //14段目のポップは消す。
mass.m[0][1]=0;
mass.m[0][2]=0;
mass.m[0][3]=0;
mass.m[0][4]=0;
mass.m[0][5]=0;
Sleep(100);
do{
checked=copy;
for(natural x=0;x<6;x++){ //一番左の
for(natural y=13;y>1;y--){ //一番下から上から三番目迄
natural temp=mass.m[y][x];
if(temp && temp!=CROSS && temp!=BLOCK && Link(mass,x,y,temp,checked,true)>=4){ //空白、×、BLOCKでなく、4つ以上繋がっている
Delete(mass,x,y,temp,1);
if(!chain[0])chain[0]=true; //ポップが消えた
}
}
}
if(!chain[0])break; //ポップが消えなかったら終了
linkage[0]++; //連鎖数を増やす
chain[0]=false;
checked=copy;
while(Fall(mass,true,mNext,eNext,linkage)); //落とす & 描写
for(natural x=0;x<6;x++){ //もう一回連鎖しそうかチェック
for(natural y=13;y>1;y--){
natural temp=mass.m[y][x];
if(temp && temp!=CROSS && temp!=BLOCK && Link(mass,x,y,temp,checked,true)>=4)goto mOut; //空白、×、BLOCKでなく、4つ以上繋がっている場合は、ループを抜ける
}
}
break; //連鎖できない場合は終了
mOut: //連鎖できる場合
Sleep(850); //少し待ってから、もう一度
}while(1);
if((mass.m[2][2] && mass.m[2][2]!=CROSS) || (mass.m[2][3] && mass.m[2][3]!=CROSS)){ //×に積んだ
DrawString(30,50,"Game Over!! 3秒後に戻ります。",0x000000);
DrawGraph(0,0,data.image[2],TRUE);
ScreenFlip();
Sleep(3000);
break;
}
time[0]=1;
mKind[0]=mNext[0];
mKind[1]=mNext[1];
mNext[0]=GetRand(RAND)+1;
mNext[1]=GetRand(RAND)+1;
mPosition[0].x=2;
mPosition[0].y=0;
mPosition[1].x=2;
mPosition[1].y=1;
count[0]=0;
countflag[0]=false;
turn[0]=0;
}
else{
if(mass.m[2][2]==0)mass.m[2][2]=CROSS; //×の位置
if(mass.m[2][3]==0)mass.m[2][3]=CROSS;
if(time[0]%60==0){
if(my1!=13 && my2!=13){ //一秒ごとにポップを下へ移動(自分)
if(turn[0]%2==0){
if(!mass.m[my1+1][mx1] || !mass.m[my2+1][mx2] || mass.m[my1+1][mx1]==CROSS || mass.m[my2+1][mx2]==CROSS){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].y=++my1;
mPosition[1].y=++my2;
}
}
else if((!mass.m[my1+1][mx1] || mass.m[my1+1][mx1]==CROSS) && (!mass.m[my2+1][mx2] || mass.m[my2+1][mx2]==CROSS)){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].y=++my1;
mPosition[1].y=++my2;
}
}
}
if(key[KEY_INPUT_RIGHT] && key[KEY_INPUT_RIGHT]%5==1 && mx1!=5 && mx2!=5){
if(turn[0]%2==0){
if((!mass.m[my1][mx1+1] || mass.m[my1][mx1+1]==CROSS) && (!mass.m[my2][mx2+1] || mass.m[my2][mx2+1]==CROSS)){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].x=++mx1;
mPosition[1].x=++mx2;
}
}
else if(!mass.m[my1][mx1+1] || !mass.m[my2][mx2+1] || mass.m[my1][mx1+1]==CROSS || mass.m[my2][mx2+1]==CROSS){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].x=++mx1;
mPosition[1].x=++mx2;
}
}
else if(key[KEY_INPUT_LEFT] && key[KEY_INPUT_LEFT]%5==1 && mx1 && mx2){
if(turn[0]%2==0){
if((!mass.m[my1][mx1-1] || mass.m[my1][mx1-1]==CROSS) && (!mass.m[my2][mx2-1] || mass.m[my2][mx2-1]==CROSS)){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].x=--mx1;
mPosition[1].x=--mx2;
}
}
else if(!mass.m[my1][mx1-1] || !mass.m[my2][mx2-1] || mass.m[my1][mx1-1]==CROSS || mass.m[my2][mx2-1]==CROSS){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].x=--mx1;
mPosition[1].x=--mx2;
}
}
else if(key[KEY_INPUT_DOWN] && key[KEY_INPUT_DOWN]%5==1 && my1!=13 && my2!=13){
if(turn[0]%2==0){
if(!mass.m[my1+1][mx1] || !mass.m[my2+1][mx2] || mass.m[my1+1][mx1]==CROSS || mass.m[my2+1][mx2]==CROSS){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].y=++my1;
mPosition[1].y=++my2;
}
}
else if((!mass.m[my1+1][mx1] || mass.m[my1+1][mx1]==CROSS) && (!mass.m[my2+1][mx2] || mass.m[my2+1][mx2]==CROSS)){
mass.m[my1][mx1]=0;
mass.m[my2][mx2]=0;
mPosition[0].y=++my1;
mPosition[1].y=++my2;
}
}
else if(key[KEY_INPUT_A]==1){ //回転判定(右回転)
switch(turn[0]){
case 0: // 縦 mPosition[0],[1] (1,2)
if(mx2==5 || mass.m[my2][mx2+1] && mass.m[my2][mx2+1]!=CROSS){ //右がポップか壁で
if(mx1 && (!mass.m[my2][mx2-1] || mass.m[my2][mx2-1]==CROSS)){ //左が空か×なら
mass.m[my1][mx1]=0;
mPosition[0].y=++my1;
mPosition[1].x=--mx2;
}
else{ //どっちもポップ or 壁なら
if(my2==13 || mass.m[my2+1][mx2]){ //下にポップか壁があるなら
mPosition[0].y=++my1; //上のポップを下へ
mPosition[1].y=--my2; //下のポップを上へ
}
else{
mass.m[my1][mx1]=0;
++my1;
mPosition[0].y=++my1; //上のポップを二つ下へ
}
turn[0]++; //case 2まで飛ばす。
}
}
else{ //右が空 もしくは ×
mass.m[my1][mx1]=0;
mPosition[0].x=++mx1;
mPosition[0].y=++my1;
}
turn[0]++;
break;
case 1: // 横 mPosition[1],[0] (2,1)
mass.m[my1][mx1]=0;
if(my2==13 || mass.m[my2+1][mx2] && mass.m[my2+1][mx2]!=CROSS){ //左ポップの下がポップか壁なら
mPosition[0].x=--mx1;
mPosition[1].y=--my2;
}
else{ //左ポップの下が空 もしくは ×
mPosition[0].x=--mx1;
mPosition[0].y=++my1;
}
turn[0]++;
break;
case 2: // 縦 mPosition[1],[0] (2,1)
if(!mx1 || mass.m[my1][mx1-1] && mass.m[my1][mx1-1]!=CROSS){ //左がポップか壁で
if(mx1!=5 && (!mass.m[my1][mx1+1] || mass.m[my1][mx1+1]==CROSS)){ //右が空か×なら
mass.m[my2][mx2]=0;
mPosition[1].y=++my2;
mPosition[1].x=++mx2;
turn[0]=3;
}
else{ //どっちもポップ or 壁なら
if(my1==13 || mass.m[my1+1][mx1]){ //下にポップか壁があるなら
mPosition[1].y=++my2; //上のポップを下へ
mPosition[0].y=--my1; //下のポップを上へ
}
else{
mass.m[my1][mx1]=0;
--my1;
mPosition[0].y=--my1; //下のポップを二つ上へ
}
turn[0]=0;
}
}
else{ //左が空 もしくは ×
mass.m[my1][mx1]=0;
mPosition[0].x=--mx1;
mPosition[0].y=--my1;
turn[0]=3;
}
break;
default: // 横 mPosition[0],[1] (1,2)
mass.m[my1][mx1]=0;
mPosition[0].x=++mx1;
mPosition[0].y=--my1;
turn[0]=0;
}
}
else if(key[KEY_INPUT_D]==1){ //回転判定(左回転)
switch(turn[0]){
case 0: // 縦 mPosition[0],[1] (1,2)
if(mx1==0 || mass.m[my2][mx2-1] && mass.m[my2][mx2-1]!=CROSS){ //左がポップか壁で
if(mx1!=5 && (!mass.m[my1][mx1+1] || mass.m[my1][mx1+1]==CROSS)){ //右が空か×なら
mass.m[my1][mx1]=0;
mPosition[0].y=++my1;
mPosition[1].x=++mx2;
turn[0]=3;
}
else{ //どっちもポップ or 壁なら
if(my2==13 || mass.m[my2+1][mx2]){ //下にポップか壁があるなら
mPosition[0].y=++my1; //上のポップを下へ
mPosition[1].y=--my2; //下のポップを上へ
}
else{
mass.m[my1][mx1]=0;
++my1;
mPosition[0].y=++my1; //上のポップを二つ下へ
}
turn[0]=2;
}
}
else{ //左が空 もしくは ×
mass.m[my1][mx1]=0;
mPosition[0].x=--mx1;
mPosition[0].y=++my1;
turn[0]=3;
}
break;
case 1: // 横 mPosition[1],[0] (2,1)
mass.m[my1][mx1]=0;
mPosition[0].x=--mx1;
mPosition[0].y=--my1;
turn[0]--;
break;
case 2: // 縦 mPosition[1],[0] (2,1)
if(mx2==5 || mass.m[my2][mx2+1] && mass.m[my2][mx2+1]!=CROSS){ //右がポップか壁で
if(mx1 && (!mass.m[my1][mx1-1] || mass.m[my1][mx1-1]==CROSS)){ //左が空か×なら
mass.m[my2][mx2]=0;
mPosition[1].y=++my2;
mPosition[1].x=--mx2;
}
else{ //どっちもポップ or 壁なら
if(my1==13 || mass.m[my1+1][mx1]){ //下にポップか壁があるなら
mPosition[0].y=--my1; //上のポップを下へ
mPosition[1].y=++my2; //下のポップを上へ
}
else{
mass.m[my1][mx1]=0;
--my1;
mPosition[0].y=--my1; //下のポップを二つ上へ
}
turn[0]--; //case 0まで飛ばす。
}
}
else{ //右が空 もしくは ×
mass.m[my1][mx1]=0;
mPosition[0].x=++mx1;
mPosition[0].y=--my1;
}
turn[0]--;
break;
default: // 横 mPosition[0],[1] (1,2)
mass.m[my1][mx1]=0;
if(my2==13 || mass.m[my2+1][mx2] && mass.m[my2+1][mx2]!=CROSS){ //右ポップの下がポップか壁なら
mPosition[0].x=++mx1;
mPosition[1].y=--my2;
}
else{ //左ポップの下が空 もしくは ×
mPosition[0].x=++mx1;
mPosition[0].y=++my1;
}
turn[0]--;
}
}
mass.m[my1][mx1]=mKind[0];
mass.m[my2][mx2]=mKind[1];
}
if(count[1]==60){ //次のポップ(敵)
while(Fall(mass,false,mNext,eNext,linkage));
Sleep(100);
do{
checked=copy;
for(natural x=0;x<6;x++){
for(natural y=13;y>1;y--){
natural temp=mass.e[y][x];
if(temp && temp!=CROSS && temp!=BLOCK && Link(mass,x,y,temp,checked,false)>=4){
Delete(mass,x,y,temp,false);
if(!chain[1])chain[1]=true;
}
}
}
if(!chain[1])break;
chain[1]=false;
checked=copy;
while(Fall(mass,false,mNext,eNext,linkage));
for(natural x=0;x<6;x++){
for(natural y=13;y>1;y--){
natural temp=mass.e[y][x];
if(temp && temp!=CROSS && temp!=BLOCK && Link(mass,x,y,temp,checked,false)>=4)goto eOut;
}
}
break;
eOut:
Sleep(800);
}while(1);
// if((mass.e[2][2] && mass.e[2][2]!=CROSS) || (mass.e[2][2] && mass.e[2][3]!=CROSS)){
// DrawString(30,50,"Game Clear!! おめでとう。 3秒後に戻ります。",0x000000);
// DrawGraph(0,0,background[1],TRUE);
// ScreenFlip();
// Sleep(3000);
// break;
// }
time[1]=1;
eKind[0]=eNext[0];
eKind[1]=eNext[1];
eNext[0]=GetRand(RAND)+1;
eNext[1]=GetRand(RAND)+1;
ePosition[0].x=2;
ePosition[0].y=0;
ePosition[1].x=2;
ePosition[1].y=1;
count[1]=0;
countflag[1]=false;
turn[1]=0;
}
else{
if(mass.e[2][2]==0)mass.e[2][2]=CROSS;
if(mass.e[2][3]==0)mass.e[2][3]=CROSS;
if(time[1]%60==0){
if(ey1!=13 && ey2!=13){ //一秒ごとにポップを下へ移動(敵)
if(turn[1]%2==0){
if(!mass.e[ey1+1][ex1] || !mass.e[ey2+1][ex2] || mass.e[ey1+1][ex1]==CROSS || mass.e[ey2+1][ex2]==CROSS){
mass.e[ey1][ex1]=0;
mass.e[ey2][ex2]=0;
ePosition[0].y=++ey1;
ePosition[1].y=++ey2;
}
}
else if((!mass.e[ey1+1][ex1] || mass.e[ey1+1][ex1]==CROSS) && (!mass.e[ey2+1][ex2] || mass.e[ey2+1][ex2]==CROSS)){
mass.e[ey1][ex1]=0;
mass.e[ey2][ex2]=0;
ePosition[0].y=++ey1;
ePosition[1].y=++ey2;
}
}
}
mass.e[ey1][ex1]=eKind[0];
mass.e[ey2][ex2]=eKind[1];
}
for(int y=-64,i=0;y<=430;y+=38,i++){ //ポップを描く
for(int x=46,j=0;x<=236;x+=38,j++)mass.m[i][j] && DrawGraph(x,y,data.pop[mass.m[i][j]],TRUE);
for(int x=366,j=0;x<=556;x+=38,j++)mass.e[i][j] && DrawGraph(x,y,data.pop[mass.e[i][j]],TRUE);
}
DrawGraph(0,0,data.image[2],TRUE); //枠(メイン)
DrawGraph(278,10,data.pop[mNext[0]],TRUE); //次のポップを表示(自分)
DrawGraph(278,48,data.pop[mNext[1]],TRUE);
DrawGraph(321,10,data.pop[eNext[0]],TRUE); //次のポップを表示(敵)
DrawGraph(321,48,data.pop[eNext[1]],TRUE);
{ // もし時間管理を変数で管理して行う場合は、このwhileループを使うため、↓
char string[2][3];
if(linkage[0]){
sprintf_s(string[0],"%d",linkage[0]);
linkage[0] && DrawString(278,400,string[0],0x000000); //連鎖数を表示(自分)
linkage[0]=0;
}
if(linkage[1]){
sprintf_s(string[1],"%d",linkage[1]);
linkage[1] && DrawString(321,400,string[1],0x000000); //連鎖数を表示(敵)
linkage[1]=0;
}
}
if(key[KEY_INPUT_ESCAPE]==1)return 0;
else if(key[KEY_INPUT_RETURN]==1){
int waitkey;
DrawString(0,0,"一時停止",0xffffff);
ScreenFlip();
while(1){
waitkey=WaitKey();
if(waitkey==KEY_INPUT_RETURN)break;
else if(waitkey==KEY_INPUT_SPACE)goto end;
};
}
if(turn[0]%2==0)if(my1==13 || my2==13 || mass.m[my1+1][mx1] && mass.m[my1+1][mx1]!=CROSS && mass.m[my2+1][mx2] && mass.m[my2+1][mx2]!=CROSS)count[0]++;
else if(my1==13 && my2==13 || (mass.m[my1+1][mx1] && mass.m[my1+1][mx1]!=CROSS) || (mass.m[my2+1][mx2] && mass.m[my2+1][mx2]!=CROSS))count[0]++;
if(turn[1]%2==0)if(ey1==13 || ey2==13 || mass.e[ey1+1][ex1] && mass.e[ey1+1][ex1]!=CROSS && mass.e[ey2+1][ex2] && mass.e[ey2+1][ex2]!=CROSS)count[1]++;
else if(ey1==13 && ey2==13 || (mass.e[ey1+1][ex1] && mass.e[ey1+1][ex1]!=CROSS) || (mass.e[ey2+1][ex2] && mass.e[ey2+1][ex2]!=CROSS))count[1]++;
time[0]++;
time[1]++;
if(time[0]>60)time[0]=1;
if(time[1]>60)time[1]=1;
}while(ScreenFlip()==0 && ClearDrawScreen()==0);
end:
return 1;
}
static int StoryMode(void){
return 1;
}
static int FreeMode(void){
return PopJelly();
}
static int ConfigMode(void){
return 1;
}
質問は、
プレイヤーが連鎖中等のときに、敵の自由落下やその他の動作を動くようにしたい、というものです。
今はSleepで制御しているので、スレッド(?というんでしょうか;)全体を止めることになり、できません。
時間管理用のprocess変数を作って、試行錯誤してみたものの、何が分からないのかも分からなくなるぐらいパニックになってしまい、元に戻しました。。
一応、PopJelly関数にはprocess変数があります。
具体的にどの様に時間管理を実装しようとしたかといいますと、
- Sleepを使っている関数 全ての引数にnatural process[2]を追加。
- PopJelly関数 メイン描写を担当している whileループ末端にprocess[0]++とprocess[1]++を追加。 (オーバーフローしないようにする方法が分かりませんでした)
- 呼び出すときに、processを追加して、其々の関数内で時間をチェックするようにしました。
- が! しかし、ループ中にSleep関数があることが多いために、どうすればいいか全く見当がつかず、断念。
具体的にどのようにしたらよいのか、ご教示宜しくお願いします。
後書き:
仕様は次の通りです。
- タイトルがぷよぷよではなく、ポップ ゼリー
- ぷよではなく、ポップ
- おじゃまぷよではなく、ブロックポップ
- 14段目のポップは連鎖直前に消されます。(ぷよぷよ フィーバー含む、それ以降の仕様?)
- ブロックポップは連鎖中に相殺、そして、連鎖直後に14段目に配置されて、Fall関数を実行、それを繰り返して降ってきます。(※ 未実装)
- (注意)このまま実行しても、画像が無いので真っ黒になります。

