ページ 1 / 1
インべーダーゲーム
Posted: 2009年1月14日(水) 16:43
by ひよこ
インべーダーゲームをつくろうと思ったのですが敵の動きについてうまくいかないので質問します。
裏画面を使うんですが最初に真ん中からはじまって右や左に行かせるのですが、真ん中 右 真ん中 左って動かしたいんですけど、i++とかで座標を増やしたあと自然に左へ行く方法がわかりません。ifとか使うとおもうと思うのですが、指定のしかたがわかりません。どうすればいいでしょうか。
Re:インべーダーゲーム
Posted: 2009年1月14日(水) 16:58
by Dixq (管理人)
敵がいる位置は
左 中 右
の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:インべーダーゲーム
Posted: 2009年1月14日(水) 17:35
by ひよこ
上のプログラムについてわからないところがあるんですけどint i,x=0;でiとx=0を宣言しているのはわかるのですがx += Dir;これのいみがわかりません。
Re:インべーダーゲーム
Posted: 2009年1月14日(水) 19:08
by Dixq (管理人)
xは座標、Dirは方向を表す変数です。
Dirが-1の時左に進み、1の時右に進みます。
これを利用してxの値を増減させているのです。
Re:インべーダーゲーム
Posted: 2009年1月14日(水) 19:31
by ひよこ
ではiは何を意味するんですか。
Re:インべーダーゲーム
Posted: 2009年1月14日(水) 19:48
by Mist
管理人さんのソースにコメント付けたよ。
#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:インべーダーゲーム
Posted: 2009年1月14日(水) 19:53
by ひよこ
コメントありがとうございます。なぜか system("cls"); がプログラムに入るとMS-DOSがたくさん出てくるんですが(消えたり出たり)どうしてでしょうか
Re:インべーダーゲーム
Posted: 2009年1月14日(水) 23:12
by lbfuvab
>なぜか 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); // 一瞬待つ
}
}
Re:インべーダーゲーム
Posted: 2009年1月15日(木) 00:01
by Dixq (管理人)
DXライブラリで実装するんですよね?
上のサンプルはコンソールでの単なるサンプルなので。
Re:インべーダーゲーム
Posted: 2009年1月15日(木) 03:41
by Dixq (管理人)
for文で書くなら
if( x<=0 || x>=50){
ここにイコール必要でしたね。
まぁDXライブラリで使うなら関係ないと思いますが。
Re:インべーダーゲーム
Posted: 2009年1月15日(木) 19:15
by ひよこ
サンプルを見て作ってみたんですがなぜか絵が絵画されません。どうすればいいでしょうか。
#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 ; // ソフトの終了
}
Re:インべーダーゲーム
Posted: 2009年1月15日(木) 19:35
by Mist
for (x>0;x<=50;x++)
if(x=50){ for (x=50;x>0;x--);
}
for(i=0;i<x; i++)
この部分、間違いだらけの上に何をどうしたいのかがさっぱりわからないんですけど。
Re:インべーダーゲーム
Posted: 2009年1月15日(木) 20:00
by ロム
根本的に全く理解せずに書いてるのがわかります。
まず、ゲームを作るどうこうより、C言語の基本をしっかり理解する必要があるでしょう。
あてずっぽで書いたらまず期待する動作はしてくれません。
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 17:51
by ひよこ
まず真ん中に行くプログラムを作ったつもりなんですがなぜかエラーが出ます。どうすればいいでしょうか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;}
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:06
by Mist
C言語の基礎を勉強しなおす必要があると思いますが。
前のプログラムでもそうでしたがif分の条件を書く場合は「X==0」というように=を2個書かないとだめです。
> エラーが出ます。
エラーが出たならエラー内容ぐらい書きましょうよ。
規約読まれましたか?
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:06
by 御津凪
その文はエラーではなくバグです。(コンパイルはちゃんと通るはずです)
条件で一致するようにする書き方は、 = 記号二つです。
その式ではxに値を代入してしまいます。
で、その文だとxは常に20になります。
素直に上の文は
if ( x <= 100 ) { x += 10; }
でいいと思いますよ。
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:21
by ひよこ
御津凪さんありがとうございます。
しかし中から右に行くようにしたいのですが、
if (x=110 x <= 209 ) { x += 10; }という意味で左のプログラムを作ったのですが、うまくいかなくて困っています。
2つの条件を表すにはどうすればいいでしょうか?
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:48
by ロム
とてもアドバイス受けたいと思ってるように見えないんですが。。
とりあえず人の話聞きましょうよ(よく読みましょうよ)。
上でも書きましたが、あてずっぽで書いてもなんにもなりませんよ。
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:51
by 御津凪
複数の条件を表すには、各条件の間に && あるいは || を書きます。
条件1 && 条件2 で、条件1 かつ 条件2の場合、となり、
条件1 || 条件2 で、条件1 または 条件2の場合、となります。
上記の式は 110 と x の間に何も無いのが原因ですね。
恐らく && だと思います。
あと、また = 記号が一個ですよ…。(VisualBasic使ってました?)
if ( 110 <= && x < 210 ) { x += 10; }
分かりやすく書くならこうですかね。
Mist さんの通り、規約読まれましたか?
ひよこさんがどの程度の知識を持っているのか、などがないと、
解決しにくいです。
質問を質問で返されてしまいますし、最善の答えも得られません。
詳しくは
規約をよーく読んでください。
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 18:56
by Mist
> if ( 110 <= && x < 210 ) { x += 10; }
x抜けてるよ。
正しくは
if ( 110 <=x && x < 210 ) { x += 10; }
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 19:03
by ロム
ものすごい速さで敵が動くインベーダーが出来そうだw
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 19:40
by ひよこ
すみませんでした。規約読んできました。
自分はインベーダーゲームの敵の動きを作りたいと思っています。自分は最近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 ; // ソフトの終了
}
どうぞよろしくお願いします。
Re:インべーダーゲーム
Posted: 2009年1月16日(金) 20:24
by yu
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:インべーダーゲーム
Posted: 2009年1月17日(土) 08:52
by ひよこ
今だぶらないように何度も実験しているのですが、x=の値を画面に出力するにはどうすればいいでしょうか
Re:インべーダーゲーム
Posted: 2009年1月17日(土) 09:32
by Dixq (管理人)
本家HPにてリファレンスをご覧下さい。
DrawFormatString
printfDx
等を使うといいですよ。
Re:インべーダーゲーム
Posted: 2009年1月17日(土) 10:42
by Mist
まずC言語の基本の学習から始められては?
条件式の書き方の基本も分からずにやっていても時間の無駄だと思いますけど。
以下のページの23章ぐらいまでやれば簡単なプログラムを組む分には困らないようにはなると思います。
http://www.kumei.ne.jp/c_lang/index_c.html
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 09:18
by ひよこ
いろいろ考えたんですけどなぜか真ん中で止まってしまうのですが。どこで値がおかしくなっているのでしょうか?
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;}
どこがおかしいのでしょうか。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 10:00
by lbfuvab
> if( 210>=x && x>=120 && x==210){ x -=-10;}
これではxが210の時しかx-=-10;が実行されませんね。
あと、x-=-10;はx+=10;と同じです。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 10:26
by ひよこ
最初の2つで210になると思うのですが。
なぜか止まってしまうんです。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 10:35
by lbfuvab
if(x==210)
と
if( 210>=x && x>=120 && x==210)
が結果的に等価であることは理解できますか?
理解できないようであれば、
http://www.kumei.ne.jp/c_lang/index.html等でみっちり
基礎から勉強しなおす事をお薦めします。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 11:03
by ひよこ
結果的に等価ってなんですか?
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 11:13
by ロム
問題はCについての知識が少ないという事じゃないと思うんですが。
まぁそれはいいとして、言葉がわからないなら辞書で調べるなりしたらどうですか。
結果的に等しいと書いてあったらわかるんでしょうか。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 11:17
by ひよこ
それってxの値が変わらないってことですか?
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 12:12
by Dixq (管理人)
では、
「Xが10以上100以下であり、かつ100と等しい時」
と
「Xが100と等しい時」
という条件式は結果的に同じ効果をもたらすという事は理解できますか?
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 12:19
by Mist
えっとね、算数に例えると足し算も引き算も出来ないような人に面積の計算の仕方を理解させることは出来ないでしょ。
今のあなたの実力では、自らオリジナルなプログラムを書くことは無理ですからアドバイスどおり基礎の勉強から始めてください。
Re:インべーダーゲーム
Posted: 2009年1月18日(日) 12:38
by ひよこ
わかりました。またわからなくなったらよろしくおねがいします。