シューティングゲームをC言語で
Posted: 2013年6月10日(月) 10:41
現在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");
}
が、弾の複数発射がどうしてもできません。
もう少しだとは思うんですがお手を貸していただけると有難いです。
プログラムを勉強し始めて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");
}