インべーダーゲーム

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

インべーダーゲーム

#1

投稿記事 by ひよこ » 16年前

インべーダーゲームをつくろうと思ったのですが敵の動きについてうまくいかないので質問します。
裏画面を使うんですが最初に真ん中からはじまって右や左に行かせるのですが、真ん中 右 真ん中 左って動かしたいんですけど、i++とかで座標を増やしたあと自然に左へ行く方法がわかりません。ifとか使うとおもうと思うのですが、指定のしかたがわかりません。どうすればいいでしょうか。

Dixq (管理人)

Re:インべーダーゲーム

#2

投稿記事 by Dixq (管理人) » 16年前

敵がいる位置は
左 中 右
の3種類だけですか?
それとも少しずつ左に移動していき、ある程度左まで来たら右に移動するのでしょうか?

どちらにしても「現在向いている方向」なる変数を用意し、そこに方向を指す数値を入れ、
それに従って計算すればいいと思います。
#include <stdio.h>
#include <windows.h>

int main(){
	int Dir=1;
	int i,x=0;

	while(1){
		x += Dir;
		if( x<0 || x>2){
			x = 1;
			Dir *= -1;
		}
		for(i=0; i<x; i++)
			printf(" ");
		printf("●\n");
		Sleep(500);
		system("cls");
	}
}

実行結果

略

後者でもやり方は同じ

#include <stdio.h>
#include <windows.h>

int main(){
	int Dir=1;
	int i,x=0;

	while(1){
		x += Dir;
		if( x<0 || x>50){
			Dir *= -1;
		}
		for(i=0; i<x; i++)
			printf(" ");
		printf("*\n");
		Sleep(1);
		system("cls");
	}
}

実行結果

略
 

ひよこ

Re:インべーダーゲーム

#3

投稿記事 by ひよこ » 16年前

上のプログラムについてわからないところがあるんですけどint i,x=0;でiとx=0を宣言しているのはわかるのですがx += Dir;これのいみがわかりません。

Dixq (管理人)

Re:インべーダーゲーム

#4

投稿記事 by Dixq (管理人) » 16年前

xは座標、Dirは方向を表す変数です。

Dirが-1の時左に進み、1の時右に進みます。
これを利用してxの値を増減させているのです。

ひよこ

Re:インべーダーゲーム

#5

投稿記事 by ひよこ » 16年前

ではiは何を意味するんですか。

Mist

Re:インべーダーゲーム

#6

投稿記事 by Mist » 16年前

管理人さんのソースにコメント付けたよ。
#include <stdio.h>
#include <windows.h>

int main(){
	int Dir=1;                  // *の移動方向 1=右, -1=左
	int i;                      // ループカウンタ
    int x = 0;                  // *の現在位置(左端からのX座標)

	while(1){
		x += Dir;               // *の位置を更新(移動方向を加算)
		if( x<0 || x>50){       // *を0<=x<=50の範囲で移動させたいので
			Dir *= -1;          // 範囲を超えたときに方向を逆転させる
		}
		for(i=0; i<x; i++)      // *の現在位置手前まで空白を入出力する
			printf(" ");
		printf("*\n");          // *出力
		Sleep(1);               // 一瞬待つ
		system("cls");          // 画面クリア
	}
}

ひよこ

Re:インべーダーゲーム

#7

投稿記事 by ひよこ » 16年前

コメントありがとうございます。なぜか system("cls"); がプログラムに入るとMS-DOSがたくさん出てくるんですが(消えたり出たり)どうしてでしょうか

lbfuvab

Re:インべーダーゲーム

#8

投稿記事 by lbfuvab » 16年前

>なぜか system("cls"); がプログラムに入るとMS-DOSがたくさん出てくるんですが(消えたり出たり)どうしてでしょうか
良く分かりませんが、これではどうですか
#include <stdio.h>
#include <windows.h>

int main(){
	int Dir=1;					// *の移動方向 1=右, -1=左
	int i;						// ループカウンタ
	int x = 0;					// *の現在位置(左端からのX座標)

	while(1){
		x += Dir;				// *の位置を更新(移動方向を加算)
		if( x<=0 || x>=50){		// *を0<=x<=50の範囲で移動させたいので
			Dir *= -1;			// 範囲を超えたときに方向を逆転させる
		}
		printf("                                                       \r");
		for(i=0; i<x; i++)		// *の現在位置手前まで空白を入出力する
			printf(" ");
		printf("*\r");			// *出力
		Sleep(80);				// 一瞬待つ
	}
}

Dixq (管理人)

Re:インべーダーゲーム

#9

投稿記事 by Dixq (管理人) » 16年前

DXライブラリで実装するんですよね?
上のサンプルはコンソールでの単なるサンプルなので。

Dixq (管理人)

Re:インべーダーゲーム

#10

投稿記事 by Dixq (管理人) » 16年前

for文で書くなら

if( x<=0 || x>=50){

ここにイコール必要でしたね。
 
まぁDXライブラリで使うなら関係ないと思いますが。

ひよこ

Re:インべーダーゲーム

#11

投稿記事 by ひよこ » 16年前

サンプルを見て作ってみたんですがなぜか絵が絵画されません。どうすればいいでしょうか。
#include "DxLib.h"
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                  // ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1 ;        // DXライブラリ初期化処理


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


	int i,x=0;
  int  White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
	        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア           ↑キーボード入力状態取得        ↑ESCが押されていない

		 for (x>0;x<=50;x++)
			 if(x=50){ for (x=50;x>0;x--);	
		}	
				 
		for(i=0;i<x; i++) 
      
	

                ClearDrawScreen();                            // 裏画面のデータを全て削除
                LoadGraphScreen( x, i, "char.png" , TRUE ) ; //裏画面へ画像を描写
                ScreenFlip() ;  
				 
              
			}		 
   
     
                        // キーの入力待ち(『WaitKey』を使用)
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

Mist

Re:インべーダーゲーム

#12

投稿記事 by Mist » 16年前

for (x>0;x<=50;x++)
			 if(x=50){ for (x=50;x>0;x--);	
		}	
				 
		for(i=0;i<x; i++)
この部分、間違いだらけの上に何をどうしたいのかがさっぱりわからないんですけど。

ロム

Re:インべーダーゲーム

#13

投稿記事 by ロム » 16年前

根本的に全く理解せずに書いてるのがわかります。
まず、ゲームを作るどうこうより、C言語の基本をしっかり理解する必要があるでしょう。
あてずっぽで書いたらまず期待する動作はしてくれません。

ひよこ

Re:インべーダーゲーム

#14

投稿記事 by ひよこ » 16年前

まず真ん中に行くプログラムを作ったつもりなんですがなぜかエラーが出ます。どうすればいいでしょうかif( x=0 || x=10 || x=20 || x=30 || x=40 || x=50 || x=60 || x=70 || x=80 || x=90 || x=100){x=x+10;}

Mist

Re:インべーダーゲーム

#15

投稿記事 by Mist » 16年前

C言語の基礎を勉強しなおす必要があると思いますが。
前のプログラムでもそうでしたがif分の条件を書く場合は「X==0」というように=を2個書かないとだめです。

> エラーが出ます。
エラーが出たならエラー内容ぐらい書きましょうよ。
規約読まれましたか?

御津凪

Re:インべーダーゲーム

#16

投稿記事 by 御津凪 » 16年前

その文はエラーではなくバグです。(コンパイルはちゃんと通るはずです)

条件で一致するようにする書き方は、 = 記号二つです。
その式ではxに値を代入してしまいます。

で、その文だとxは常に20になります。

素直に上の文は
if ( x <= 100 ) { x += 10; }
でいいと思いますよ。

ひよこ

Re:インべーダーゲーム

#17

投稿記事 by ひよこ » 16年前

御津凪さんありがとうございます。
しかし中から右に行くようにしたいのですが、
if (x=110 x <= 209 ) { x += 10; }という意味で左のプログラムを作ったのですが、うまくいかなくて困っています。
2つの条件を表すにはどうすればいいでしょうか?

ロム

Re:インべーダーゲーム

#18

投稿記事 by ロム » 16年前

とてもアドバイス受けたいと思ってるように見えないんですが。。

とりあえず人の話聞きましょうよ(よく読みましょうよ)。

上でも書きましたが、あてずっぽで書いてもなんにもなりませんよ。

御津凪

Re:インべーダーゲーム

#19

投稿記事 by 御津凪 » 16年前

複数の条件を表すには、各条件の間に && あるいは || を書きます。

条件1 && 条件2 で、条件1 かつ 条件2の場合、となり、
条件1 || 条件2 で、条件1 または 条件2の場合、となります。

上記の式は 110 と x の間に何も無いのが原因ですね。
恐らく && だと思います。

あと、また = 記号が一個ですよ…。(VisualBasic使ってました?)
if ( 110 <= && x < 210 ) { x += 10; }
分かりやすく書くならこうですかね。

Mist さんの通り、規約読まれましたか?
ひよこさんがどの程度の知識を持っているのか、などがないと、
解決しにくいです。

質問を質問で返されてしまいますし、最善の答えも得られません。

詳しくは規約をよーく読んでください。

Mist

Re:インべーダーゲーム

#20

投稿記事 by Mist » 16年前

> if ( 110 <= && x < 210 ) { x += 10; }

x抜けてるよ。

正しくは
if ( 110 <=x && x < 210 ) { x += 10; }

ロム

Re:インべーダーゲーム

#21

投稿記事 by ロム » 16年前

ものすごい速さで敵が動くインベーダーが出来そうだw

ひよこ

Re:インべーダーゲーム

#22

投稿記事 by ひよこ » 16年前

すみませんでした。規約読んできました。
自分はインベーダーゲームの敵の動きを作りたいと思っています。自分は最近C言語を勉強しだした初心者です。
ソースはx座標をまず110まで10ずつ増やしそれから220まで11ずつ増やし220から120になるように10ずつ減らし120から11減らし109から10減らし99にして11ずつへらして0にしておなじ動きを繰り返させようと思っています。しかし途中で止まってしまうので今ここに書かせてもらってます。止まらないようにするにはどうすればいいでしょうか?
ソース
#include "DxLib.h"
char Key[256];

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                  // ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1 ;        // DXライブラリ初期化処理


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


	int i; int x; x=0;
  int  White   = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
	        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア           ↑キーボード入力状態取得        ↑ESCが押されていない
		if ( x <= 100 ) { x += 10; }//xが110になるように
		
       if ( 110 >=x && x <= 209 ) { x += 11; }//xが110から210になるように座標を11ずつ加算


		if ( 210 ==x && x == 130 ) { x -= 10; }//210から120まで10ずつ座標を減らす

		if ( 120 ==x ) { x -= 11; }//109にする

		if ( 109 ==x ) { x -= 10; } //99にする
	

		if ( 99==x && x ==11  ) { x -= 11; } //99から0になるように11ずつ座標を減らす
                ClearDrawScreen();                            // 裏画面のデータを全て削除
                LoadGraphScreen( x, 10, "char.png" , TRUE ) ; //裏画面へ画像を描写
                ScreenFlip() ;  
				 
              
			}		 
   
     
                        // キーの入力待ち(『WaitKey』を使用)
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}
どうぞよろしくお願いします。

yu

Re:インべーダーゲーム

#23

投稿記事 by yu » 16年前

if ( 210 ==x && x == 130 )//xが210かつ130なら
if ( 99==x && x ==11  )//xが99かつ11なら


の部分ですが、xが210かつ130なら、ということになるので成り立ちませんよ。


 if ( 110 >=x && x <= 209 )//xが110以上かつ209以下なら

ここで書かれているように、これと同じことをすればできると思います。


if文は もし~が真(成立している)ならば...する ということです。

if(~){

...

}
御津凪様が書いてくださったことをもう一度よく読んで、
理解したほうが良いと思います。


僕も3か月前までは全くプログラムが分かりませんでした。
(今も分からないことだらけですが・・・;)

プログラムは楽しくすれば早く身に付きますよ。

ひよこ

Re:インべーダーゲーム

#24

投稿記事 by ひよこ » 16年前

今だぶらないように何度も実験しているのですが、x=の値を画面に出力するにはどうすればいいでしょうか

Dixq (管理人)

Re:インべーダーゲーム

#25

投稿記事 by Dixq (管理人) » 16年前

本家HPにてリファレンスをご覧下さい。
DrawFormatString
printfDx
等を使うといいですよ。

Mist

Re:インべーダーゲーム

#26

投稿記事 by Mist » 16年前

まずC言語の基本の学習から始められては?
条件式の書き方の基本も分からずにやっていても時間の無駄だと思いますけど。

以下のページの23章ぐらいまでやれば簡単なプログラムを組む分には困らないようにはなると思います。
http://www.kumei.ne.jp/c_lang/index_c.html

ひよこ

Re:インべーダーゲーム

#27

投稿記事 by ひよこ » 16年前

いろいろ考えたんですけどなぜか真ん中で止まってしまうのですが。どこで値がおかしくなっているのでしょうか?
if ( x <= 100 ) { x += 10; }//xが110になるように
		
       if ( 110 <=x && x <= 209 ) { x += 1; }//xが110から210になるように座標を11ずつ加算


	   //
 if( 210>=x && x>=120 && x==210){ x -=-10;}
 if( 210>=x && x>=120 && x==200){ x -=-10;}
 if( 210>=x && x>=120 && x==190){ x -=-10;}
 if( 210>=x && x>=120 && x==180){ x -=-10;}
 if( 210>=x && x>=120 && x==170){ x -=-10;}
 if( 210>=x && x>=120 && x==160){ x -=-10;}
 if( 210>=x && x>=120 && x==150){ x -=-10;}
 if( 210>=x && x>=120 && x==140){ x -=-10;}
 if( 210>=x && x>=120 && x==130){ x -=-10;}

//
if( 210>=x && x>=120 && x==120){ x -=-11;}

if( 210>=x && x>=109 && x==109){ x -=-10;}

//
 if( 210>=x && x>=11 && x==99){ x -=-11;}  
if( 210>=x && x>=11 && x==88){ x -=-11;}  
if( 210>=x && x>=11 && x==77){ x -=-11;}  
if( 210>=x && x>=11 && x==66){ x -=-11;}  
if( 210>=x && x>=11 && x==55){ x -=-11;}  
if( 210>=x && x>=11 && x==44){ x -=-11;}  
if( 210>=x && x>=11 && x==33){ x -=-11;}  
if( 210>=x && x>=11 && x==22){ x -=-11;}  
if( 210>=x && x>=11 && x==11){ x -=-11;}
どこがおかしいのでしょうか。

lbfuvab

Re:インべーダーゲーム

#28

投稿記事 by lbfuvab » 16年前

> if( 210>=x && x>=120 && x==210){ x -=-10;}

これではxが210の時しかx-=-10;が実行されませんね。

あと、x-=-10;はx+=10;と同じです。

ひよこ

Re:インべーダーゲーム

#29

投稿記事 by ひよこ » 16年前

最初の2つで210になると思うのですが。
なぜか止まってしまうんです。

lbfuvab

Re:インべーダーゲーム

#30

投稿記事 by lbfuvab » 16年前

if(x==210)

if( 210>=x && x>=120 && x==210)
が結果的に等価であることは理解できますか?
理解できないようであれば、http://www.kumei.ne.jp/c_lang/index.html等でみっちり基礎から勉強しなおす事をお薦めします。

ひよこ

Re:インべーダーゲーム

#31

投稿記事 by ひよこ » 16年前

結果的に等価ってなんですか?

ロム

Re:インべーダーゲーム

#32

投稿記事 by ロム » 16年前

問題はCについての知識が少ないという事じゃないと思うんですが。

まぁそれはいいとして、言葉がわからないなら辞書で調べるなりしたらどうですか。

結果的に等しいと書いてあったらわかるんでしょうか。

ひよこ

Re:インべーダーゲーム

#33

投稿記事 by ひよこ » 16年前

それってxの値が変わらないってことですか?

Dixq (管理人)

Re:インべーダーゲーム

#34

投稿記事 by Dixq (管理人) » 16年前

では、

「Xが10以上100以下であり、かつ100と等しい時」



「Xが100と等しい時」

という条件式は結果的に同じ効果をもたらすという事は理解できますか?

Mist

Re:インべーダーゲーム

#35

投稿記事 by Mist » 16年前

えっとね、算数に例えると足し算も引き算も出来ないような人に面積の計算の仕方を理解させることは出来ないでしょ。
今のあなたの実力では、自らオリジナルなプログラムを書くことは無理ですからアドバイスどおり基礎の勉強から始めてください。

ひよこ

Re:インべーダーゲーム

#36

投稿記事 by ひよこ » 16年前

わかりました。またわからなくなったらよろしくおねがいします。

閉鎖

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