落ちゲーを作成しています。

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

落ちゲーを作成しています。

#1

投稿記事 by けいすけ きさ » 8年前

落下してくる数字を拾い、その合計が10になればスコア>合計初期化 の繰り返しで高スコアを狙うゲームを作成しています。

環境: VisualStudio 2015 Express,DXライブラリ,C++

現在、アイテム(数字)の落下、それをキャッチ、まで作りました。
まず現在の課題を先に説明しますと、
1: ステージの下端まで落下せずに途中で消えてしまうアイテム(数字)(ランダム)がある。
2: キャッチしたアイテム(数字)の合計が、1~10はそのまま合計に加算されていくが、-1 〜-5 をキャッチすると+10加算されてしま  う.

以上の課題はどのように修正すればいいでしょうか。
プログラミング歴は1年ほどで、未熟者です。高校生です。
手元に参考書がありますが、よくわからないので質問させていただきました。

ソースは以下のようです。

//gamemain.cpp

コード:

#include "gamemain.h"
#include "loading.h"
#include <math.h>

int count;
int sum = 0;
int Key[STRN];//キーデータ

void GAME_MAIN() {
	Operate_Basket();
	Item_calc();
	Graph_Basket();
	Graph_Item();
}

//初期化
void Init() {
	basket.x = 320;
	basket.y = 360;
	count = 0;
}

//キャラ描画
void Graph_Basket() {
	DrawGraph(basket.x, basket.y, imghandles.basket_img, TRUE);
}

//キャラクタ移動
void Operate_Basket() {
	if (Key[KEY_INPUT_LEFT] > 0)//左キーが押されていたら
		basket.x -= 4;//左へ4移動
	if (Key[KEY_INPUT_RIGHT] > 0)//右キーが押されていたら
		basket.x += 4;//右へ4移動
	if (basket.x + Pixel * 2 > STAGE_WIDTH)
		basket.x = STAGE_WIDTH - Pixel * 2;
	if (basket.x < (Pixel / 2))
		basket.x = (Pixel / 2);
}

//アイテム登録
void Item_Enter() {
	int n = GetRand(NUM_MAX - 1);
	item[n].flag = 1;				//アイテムの存在フラグを立てる
	item[n].cnt = 0;				//カウンタ初期化
	item[n].speed = 2;				//発射スピードを2に
	item[n].angle = PI / 2;			//角度は真下である90°
	item[n].x = GetRand(630);	//x座標は0~640のランダムな値
	item[n].y = 0;				//y座標は0
}

//i番のアイテムがかごの中にあるかどうかを判定する関数。
//1:ある 0:ない
int Item_Basket_Exit(int i) {
	//もしカゴの中にあれば
	if (basket.x - 10 < item[i].x && item[i].x < basket.x + 84 && basket.y - 10 < item[i].y&&item[i].y < basket.y + 60) {
		PlaySoundMem(sndhandles.hit, DX_PLAYTYPE_BACK);
		Point(i);
		return 1;
	}
	return 0;
}

//i番の弾幕が画面内にあるかどうかを判定する関数。
//1:画面外 0:画面内
int Item_Feeld_Exit(int i) {
	//もし画面の中になければ
	if (!(15 <= item[i].x && item[i].x <= 630 && 0 <= item[i].y && item[i].y <= 445))
		return 1;
	return 0;
}
//アイテム(軌道)計算
void Item_calc() {
	int i;
	if (count % 30 == 0)//30カウントに一回(モニタが60Hz、60カウントは1秒)
		Item_Enter();//発射
					 //軌道計算
	for (i = 0; i < NUM_MAX; i++) {
		if (item[i].flag == 1) {
			item[i].x += cos(item[i].angle) * item[i].speed;//x成分計算
			item[i].y += sin(item[i].angle) * item[i].speed;//y成分計算
			if (Item_Basket_Exit(i) == 1)//かごの中にあるか?
				item[i].flag = 0;//弾を消す
			if (Item_Feeld_Exit(i) == 1)//画面の中にあるか?
				item[i].flag = 0;//弾を消す
		}
	}
}

//アイテムの描画
void Graph_Item() {
	int i;
	for (i = 0; i < NUM_MAX; i++) {
		if (item[i].flag > 0) {
			DrawRotaGraphF(item[i].x, item[i].y, 1.0f, item[i].angle - PI / 2, imghandles.item_img[i], TRUE);
			//+PI/2は弾の向きを合わせるため
		}
	}
}
//キーがどれ位押されたかを判定する関数
//渡されたKeyStateBufにはキーの押されたカウンタ数が入る
int GetHitKeyStateAll_2(int KeyStateBuf[]) {
	char GetHitKeyStateAll_Key[STRN];
	GetHitKeyStateAll(GetHitKeyStateAll_Key);
	for (int i = 0; i < STRN; i++) {
		if (GetHitKeyStateAll_Key[i] == 1) KeyStateBuf[i]++;
		else                            KeyStateBuf[i] = 0;
	}
	return 0;
}
void Point(int k) {
	if (k == 10)sum -= 1;
	if (k == 11)sum -= 2;
	if (k == 12)sum -= 3;
	if (k == 13)sum -= 4;
	if (k == 14)sum -= 5;
	else sum += (k+1);

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

	unsigned int Cr;
	Cr = GetColor(0, 0, 255);

	SetBackgroundColor(255, 255, 255);
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化

	Load();//データロード
	Init();//初期化

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(Key) == 0 && Key[KEY_INPUT_ESCAPE] == 0) {
		GAME_MAIN();
		DrawFormatString(0, 0, Cr, " %d ", sum);
		count++;
		ScreenFlip();//裏画面反映関数
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}
//gamemain.h

コード:

#ifndef __GAMEMAIN_H__ 
#define __GAMEMAIN_H__

#include <DxLib.h>

#define Pixel 32 //ピクセルサイズ
#define STAGE_WIDTH	640	// ステージの幅
#define STAGE_HEIGHT	480	// ステージの高さ
#define NUM_MAX 15 //アイテム総数
#define PI 3.141592653589793 //円周率
#define STRN 256 //キーボード

//データ(かご)構造体
struct Basket_Data {
	int x, y;
};
Basket_Data basket;

//データ(アイテム)構造体
struct Item_Data {
	int flag;//フラグ
	int cnt;//
	double x, y;
	double angle;//角度
	double speed;//速さ
};
Item_Data item[NUM_MAX];

void Operate_Basket();
void Item_calc();
void Graph_Basket();
void Graph_Item();
void Point(int k);

#endif
#pragma once

loading.cpp

コード:

#include"loading.h"

Img_Data imghandles;
Snd_Data sndhandles;

BOOL Load() {

	if ((imghandles.basket_img = LoadGraph("media\\basket.png")) == -1) return FALSE;
	if ((imghandles.item_img[0] = LoadGraph("media\\num_1.png")) == -1) return FALSE;
	if ((imghandles.item_img[1] = LoadGraph("media\\num_2.png")) == -1) return FALSE;
	if ((imghandles.item_img[2] = LoadGraph("media\\num_3.png")) == -1) return FALSE;
	if ((imghandles.item_img[3] = LoadGraph("media\\num_4.png")) == -1) return FALSE;
	if ((imghandles.item_img[4] = LoadGraph("media\\num_5.png")) == -1) return FALSE;
	if ((imghandles.item_img[5] = LoadGraph("media\\num_6.png")) == -1) return FALSE;
	if ((imghandles.item_img[6] = LoadGraph("media\\num_7.png")) == -1) return FALSE;
	if ((imghandles.item_img[7] = LoadGraph("media\\num_8.png")) == -1) return FALSE;
	if ((imghandles.item_img[8] = LoadGraph("media\\num_9.png")) == -1) return FALSE;
	if ((imghandles.item_img[9] = LoadGraph("media\\num_10.png")) == -1) return FALSE;
	if ((imghandles.item_img[10] = LoadGraph("media\\num_-1.png")) == -1) return FALSE;
	if ((imghandles.item_img[11] = LoadGraph("media\\num_-2.png")) == -1) return FALSE;
	if ((imghandles.item_img[12] = LoadGraph("media\\num_-3.png")) == -1) return FALSE;
	if ((imghandles.item_img[13] = LoadGraph("media\\num_-4.png")) == -1) return FALSE;
	if ((imghandles.item_img[14] = LoadGraph("media\\num_-5.png")) == -1) return FALSE;
	
	sndhandles.hit = LoadSoundMem("media\\hit.mp3");
	if (sndhandles.hit == -1) return FALSE;
	
	return TRUE;
}
//loading.h

コード:

#ifndef __LOADING_H__
#define __LOADING_H__

#include <DxLib.h>


//データ(画像)構造体
struct Img_Data {
	int basket_img;
	int item_img[14];
};
extern Img_Data imghandles;

//データ(音)構造体
struct Snd_Data {
	int hit;
};
extern Snd_Data sndhandles;


BOOL Load();

#endif
#pragma once


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 落ちゲーを作成しています。

#2

投稿記事 by みけCAT » 8年前

けいすけ きさ さんが書きました:

コード:

void Point(int k) {
	if (k == 10)sum -= 1;
	if (k == 11)sum -= 2;
	if (k == 12)sum -= 3;
	if (k == 13)sum -= 4;
	if (k == 14)sum -= 5;
	else sum += (k+1);

}
kが14でないならば、例えば10であってもsum += (k+1);が実行されますが、これは意図通りですか?
そうでないのであれば、例えば

コード:

void Point(int k) {
	switch (k) {
		case 10: sum -= 1; break;
		case 11: sum -= 2; break;
		case 12: sum -= 3; break;
		case 13: sum -= 4; break;
		case 14: sum -= 5; break;
		default: sum += (k+1); break;
	}
}
とか

コード:

void Point(int k) {
	if (10 <= k && k <= 14) {
		sum -= (k-9);
	} else {
		sum += (k+1);
	}
}
のように書いたほうがいいかもしれません。

コード:

void Point(int k) {
	if (k == 10)sum -= 1;
	else if (k == 11)sum -= 2;
	else if (k == 12)sum -= 3;
	else if (k == 13)sum -= 4;
	else if (k == 14)sum -= 5;
	else sum += (k+1);

}
でも悪くはないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

けいすけ きさ

Re: 落ちゲーを作成しています。

#3

投稿記事 by けいすけ きさ » 8年前

合計の加算部分は解決しました!
ありがとぅございました。

返信

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