テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しろ

テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#1

投稿記事 by しろ » 15年前

DXライブラリでテトリスもどきを作ろうと思い、プログラムを組み始めました。最初はいろんな形のブロックを使うのは難しいだろうと思い、1×1のブロックのみを落とすような感じのテトリスを想定していたのですが、そもそもブロックをどういうふうに落とせばいいのかわからない始末です。一応落とすブロック以外の描画をしたプログラムが以下になります。


#include "DxLib.h"

char Key[256];
int a[24][32]={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,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,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,
};

int can(int x1, int y1){ //can関数の定義・落ちているブロックの直下にブロックがあるとそれ以上落下しない。

if(a[y1/20][x1/20+1]==1 || a[y1/20][x1/20+1]==2)
return 0;

return 1;
}

typedef struct{

int x; //x座標
int y; //y座標
int image; //画像イメージ
int fall_flag; //落ちるフラグ

}Block;

しろ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#2

投稿記事 by しろ » 15年前

上のつづきです。

-----------


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理

int i,j,k; //for文用

int red_image; //red_imageを宣言
Block blk[100]; //ブロックを宣言


red_image=LoadGraph("block.png",TRUE); //ブロック画像1を読み込み

for(i=0;i<100;i++){ //ブロック画像2に座標等の値をいれる。
blk.x=320;  //落ちるブロックのスタートのx座標
blk.y=60; ////落ちるブロックのスタートのy座標
blk.image=LoadGraph("block1.png",TRUE); //ブロックの画像を代入
blk.fall_flag=0; //フラグをゼロにする。
}

SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

for(i=0;i<24;i++) //もともとあるブロックを描画
for(j=0;j<32;j++)
if(a[j]==1)
DrawGraph(20*j,20*i,red_image,TRUE);

for(i=0;i<100;i++){ //blkの中から0のものを見つけ出し、1にし、発射フラグをたてる。
if(blk.fall_flag==0){
blk.fall_flag=1;
break;
}
}


ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}



block.pngが周りを囲むブロック。block1.pngが落ちるブロックです。
can関数はまだ使っておりませんが、落ちてきたブロックが積んであるブロックを透過しないように作った物です。

とりあえずブロックは構造体で100コ準備しました。(1コで十分な気もしないでもないですが)
基本的に最初にまわりにあるブロックは値1を、積んでいくブロックには値2をいれようと思っています。そして1行の和が26になったらブロックが1行全部ブロックで埋まっていると判定して、ブロックを消すみたいな感じじゃないかと。

とりあえずブロックの発射フラグをたてたところまできたのですが、(フラグが1になったらブロックをおとすつもりです)そのあとどうしたらいいのかさっぱりです。
上下左右のボタン押し移動はとりあえず後回しでいいので、まずはブロックをおとし、積んでいくところまで完成させたいと思っております。

なおブロック1コの縦横の幅は20です。

皆様お忙しいところ大変恐縮ではございますが、知恵をお貸しくださいますようお願いいたします。
(なお、私も一応社会人ということもあり、昼間の書き込みは難しい状況です。こちらも何とぞご理解賜りますようよろしくお願いいたします。)

ぬるぽ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#3

投稿記事 by ぬるぽ » 15年前

テトリスといったらこの動画が非常に参考になると思いますよ。

【プログラミング】テトリスを1時間強で作ってみた【実況解説】
[nico]http://www.nicovideo.jp/watch/sm8517855[/nico]

ちなみに解説している方は
携帯電話向けのソフトウエア開発会社ブロードテイルを
経営するプログラマCEO(最高経営責任者)だそうです。

シエル

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#4

投稿記事 by シエル » 15年前

>>ぬるぽさん

この人CEOだったんですか!?

前にこの動画見て、こんなスムーズに作れてすごいな~と思ってましたが、
やっぱりすごい人だったんですね。
びっくりしたんでつい書いちゃいました;

しろ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#5

投稿記事 by しろ » 15年前

>ぬるぽさん

動画を教えてくださりありがとうございます。
ただ、私の今の実力からはちょっと離れすぎてますね。

後半部は参考になるところもあるかもですが、
前半はさっぱりです。WINAPIは勉強したことがありません。

>シエルさん

凄いですよね~。自分もいつかはこんな感じにプログラムを組んでみたいものです。

バグ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#6

投稿記事 by バグ » 15年前

同じテトリスを作るにしても、人それぞれ違う作り方をしますからね。
私はテトリミノ(落下ブロック)、ゲームフィールド、ゲーム進行制御、グラフィック描画などをそれぞれ役割分担させて作りましたね。

C#で組んだのであまり参考にはならないかもしれませんが、ソースごとアップしてますので、よければどうぞ(^_^;)

http://park.geocities.jp/bugbugbugbug2001/

パコネコ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#7

投稿記事 by パコネコ » 15年前

墜ちものパズルのアルゴリズム書いてみますね…テトリスじゃないので少し変えないとですが、
1、ブロックの色を選択・・・この場合必要ないですかね。もしくは形を決めるとか?
2、ブロック回転・・・1*1のブロックだけならいらないですね。
3、ブロックを左右に移動・・・いるですよね。
4、ブロックの落下・・・いりますね

5、浮いてるブロックを自動落下させる
6、同色のブロックが3個以上そろうと消える・・・この場合一行消した場合ですね。
消えた場合・・・@へ戻る
7、お邪魔ブロックの場合…いらないです、もう関係ないですね

7はともかく残りは参考ぐらいにはなると思うんですが…どうですか…
あれ?ほとんどいらない?

Poco

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#8

投稿記事 by Poco » 15年前

取り敢えず、落ちるだけのプログラムを作りました。
参考になるか分かりませんが、どうぞ。

しろ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#9

投稿記事 by しろ » 15年前

>バグさん

おおぉぉぉ、これは凄い! 参考にさせていただきます!  

ただC#も学んだこともなく、見てもよくわからないです……勉強不足で自分が情けなくなってきます。

>ぽこさん

おお、これならばなんとか理解できるかも知れません。ちょっと読み込んでみます。一応読み込んだあとにもしわからなければ、質問等をさせていただくかもしれませんので、解決とはしないでおきます。

しろ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#10

投稿記事 by しろ » 15年前

>パコネコさん

ご親切にどうもありがとうございます。
こちらも参考にさせていただきます!

yu

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#11

投稿記事 by yu » 15年前

結構前に Win32API と C++ でテトリスを作ったので、ソースコードと実行ファイルを置いておきます。
後、GDI+も利用してますね。
ソースコードが汚いですが、良かったら参考にしてください。

普通のテトリスとは少しルールが違うので注意してください;
これはクリア型のテトリスとなっています。クリアしても特に何もありませんが orz

忘れてしまってすみませんが、
このソースコードはバグさんのコードを参考にしていたような…w

バグ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#12

投稿記事 by バグ » 15年前

>>yuさん
うは、これは懐かしい。そしてちょっと恥ずかしい(笑)
というのも、実は私、テトリスだけでかなりのバージョンを作成しているのですが、これはDXライブラリ用に作った奴かな?私のPCには既にオリジナルソースは存在しませんが…(^_^;)
私の記憶違いでなければ、オリジナルはC++でクラスを使用していたと思いますが、C言語仕様に書き換えたんですね。製作お疲れ様です。

バグ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#13

投稿記事 by バグ » 15年前

>>パコネコさん

>>墜ちものパズルのアルゴリズム書いてみますね…テトリスじゃないので少し変えないとですが、
>>1、ブロックの色を選択・・・この場合必要ないですかね。もしくは形を決めるとか?
>>2、ブロック回転・・・1*1のブロックだけならいらないですね。
>>3、ブロックを左右に移動・・・いるですよね。
>>4、ブロックの落下・・・いりますね
>>@
>>5、浮いてるブロックを自動落下させる
>>6、同色のブロックが3個以上そろうと消える・・・この場合一行消した場合ですね。
>>消えた場合・・・@へ戻る
>>7、お邪魔ブロックの場合…いらないです、もう関係ないですね

>>7はともかく残りは参考ぐらいにはなると思うんですが…どうですか…
>>あれ?ほとんどいらない?

2、3、4、5は間違いなく必要ですね。
1は、7種類の中から1つを選択する事になります。
6は、テトリスでは連鎖がないのでちょっと考え方が違います。
7は不要ですね。

大雑把に書くと、下記のような感じかな?

1、テトリミノ(落ちてくるブロックのことです)を7種類の中から1つ選択する。
2、キー入力によるテトリミノの移動処理(入力を受け付ける時間を変える事で落下スピードを調整できる)
3、テトリミノを1段落下させる(自動落下処理)
4、これ以上落下できなければ5へ、そうでなければ2へ。
5、揃っているラインを消去して、消えたラインの分だけ全体を下へずらす。
6、ゲームオーバーの判定を行う。ゲームオーバーであれば終了、そうでなければ1へ。

パコネコ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#14

投稿記事 by パコネコ » 15年前

やっぱり結構変えないとだめでしたね…
確かに「ぷよ○よ」みたいに連鎖ないですもんね。

墜ちるブロックのこと、テトリミノっていうんですね知りませんでした。
適切なものに書き換えていただきありがとうございました。
勉強になりました。

しろ

Re:テトリスもどきを作ろうとしているのですが、初っぱなでつまずきました。

#15

投稿記事 by しろ » 15年前

>yuさん

これも参考になりそうです。ありがとうございます!

先ほどようやく悩んでいたところが解決しましたので、これにて解決とさせていただきます。皆様どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る