ページ 11

シューティングゲームをC言語で

Posted: 2013年6月10日(月) 10:41
by kana
現在C言語でシューティングゲームをコンソールアプリケーションで作ろうとしています。
が、弾の複数発射がどうしてもできません。
もう少しだとは思うんですがお手を貸していただけると有難いです。
プログラムを勉強し始めて2か月経ちますが稚拙なプログラムしか書けなくて申し訳ないです。
下記のプログラムを実行すると敵と自機の移動はできるものの弾を発射しようとすると
一気に20個発射され、敵に当たると撃破数の横に弾が移動してしまいます…。

#include <stdio.h>
#include <conio.h>
#include <Windows.h>


void locate (int,int);
void color (WORD);
void clear (void);
void setCursor(int);
void clear (void);


void main()
{
char c;
int tekix=40,tekiy=0,tasu=1,tasu2=1,jikix=40,jikiy=21,up=0,fu=0,hit_time=0,cc=5,tenx=70,teny=2,count=0,i=0;
int tamax[20]={0},tamay[20]={0},fu2[20]={0};

while(1){ //全体のループ

setCursor(0);
clear();
locate(tekix,tekiy); //アスタリスクの初期位置
printf("*");
locate(jikix,jikiy); //しょぼんの初期位置
printf( "(´・ω・`)");
locate(tenx,teny);
printf("%dしょぼん",count);
Sleep(90); //速度の変更
tekix += tasu;
tekiy += tasu2;

for(i=0;i<20;i++){
if(fu==1){
tamay=20-up;
locate(tamax,tamay);
printf("|");
up++;
break;
}
}
if(up==20){
fu=0;
up=0;
}
if(tekiy==20){
tasu2 = -1;
}else if(tekiy==0){
tasu2 = 1;
}

if(tekix==69){
tasu = -1;
}else if(tekix==0){
tasu = 1;
}

if( _kbhit()){
c=getch();
if(c=='1'){
if(jikix>0){
jikix=jikix-1;
}

}else if(c=='3'){
if(jikix<65){
jikix=jikix+1;
}
}else if(c=='x'){
printf("終了しますお\n");
break;
}else if(c==' '){
fu=1;
if(up==0){
for(i=0;i<20;i++){
tamax=jikix+4;
break;
}
}
}
}
for(i=0;i<20;i++){
if(tekix-2 < tamax && tamax < tekix+2 && tekiy < tamay && tamay < tekiy+2){

cc=0;
tamax=0;
up=19;
tekix=20;
tekiy=5;
break;
}
}
if(cc<1){
locate(34,10);
printf("しょぼん\n");
Sleep(600);
count++;
}
cc++;

}

setCursor(1);
getch();
color(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}

void locate(int x,int y)
{
COORD dwPos;
dwPos.X=(SHORT)x;
dwPos.Y=(SHORT)y;
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE),
dwPos);
}
void color(WORD wAttributes)
{
SetConsoleTextAttribute(
GetStdHandle(STD_OUTPUT_HANDLE),
wAttributes);
}
void setCursor(int sw){
CONSOLE_CURSOR_INFO info;
GetConsoleCursorInfo(
GetStdHandle(STD_OUTPUT_HANDLE),
&info);
if(sw!=0){
info.bVisible = FALSE;
}
SetConsoleCursorInfo(
GetStdHandle(STD_OUTPUT_HANDLE),
&info);
}
void clear(void)
{
system("cls");
}

Re: シューティングゲームをC言語で

Posted: 2013年6月10日(月) 17:17
by ISLe
20個の弾のうち、どの弾が撃たれて画面に出ていて、どの弾がまだ撃たれていないのかを、どのように区別しているのか、説明していただけますか?

Re: シューティングゲームをC言語で

Posted: 2013年6月11日(火) 22:53
by hamu
一部だけの回答ですが、一つ。

コンソールの描画周期がどのくらいか知りませんが、普通のGUIでゲームを作るときは60フレーム/秒の割合で画面が更新されることを前提としています。

ですから、何もなしに毎フレーム玉を発射していては、1/3秒で20発撃ち尽くしてしまいます。

一定時間ごとに発射するための変数を用いて、一発発射したら適当な値を代入し、毎フレームその変数をデクリメントし、再び0以下になったら発射可能、というふうにすれば、一定間隔で弾が発射されます。

あと、プログラムを書く/貼る際はインデントするようにしましょう。
読んですらもらえないこともあります。気をつけてください。

Re: シューティングゲームをC言語で

Posted: 2013年6月11日(火) 23:13
by hamu
追記。

実行してみましたが、うまくいっているとおもいますよ。

弾は20発同時に発射されているのではなく、1発しか発射されていないと思います。
for文の中にダイレクトにbreakを書いたら、一回でループをぬけてしまうので、1発しか発射されないのは当然です。