コンソールゲーム

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

コンソールゲーム

#1

投稿記事 by けいすけ » 10年前

x code という開発環境をつかっていて、c++でちょっとしたゲームっぽいものを作っています。

まず、乱数で先攻を決め、自分のターンなら、kキーを押すと敵(コンピュータ)にダメージを与える
敵か、自分のHPが0になるまでこの処理を繰り返すというものをつくりたいのですが

これで実行すると、実行結果表示欄には何も表示されません。

もし理由がわかる方は教えて頂けないでしょうか?また、プログラミングの構築方法のアドバイスなども下さい。

コード:



#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct player{
    int hp = 100;
    int sp = 100;
    int mahou = rand() % 50;
};

struct enemy{
    int e_hp = 200;
    int e_sp = 200;
    int bullet = rand() % 40;
};

//先攻後攻を決める
void koujun( int sk, int p_senkou, int e_senkou ){
    if(sk == 0){
        cout << "あなたのターンです。\n";
       p_senkou = true;
    }
    if(sk == 1){
        cout << "敵のターンです。 \n";
        e_senkou = true;
    }
}

//攻防処理
void kougeki( int p_senkou, int e_senkou, int hp, int e_hp, int k, int bullet, int sp, int mahou ){
    if(p_senkou == true){
        cout << "コマンドを選んでください! \n";
        cin >> k;
        if( cin >> k ){
            e_hp-=mahou;
            sp-=mahou;
        }
    }
    
    if(e_senkou == true){
        hp-=bullet;
        sp-=bullet;
        e_senkou = false;
    }
}


int main(int argc, const char * argv[]){

    srand( time (NULL));
    
    player pl;
    enemy en;
    
    char k,b;
    int sk = rand() % 2;
    bool p_senkou;
    bool e_senkou;
    
    while( pl.hp < 0 || en.e_hp < 0 ){
        
        koujun(sk, p_senkou, e_senkou);
        
        kougeki(p_senkou, e_senkou, pl.hp, en.e_hp, k, en.bullet, pl.sp, pl.mahou );
        
        break;
    }
    
    return 0;
}










box
記事: 2002
登録日時: 14年前

Re: コンソールゲーム

#2

投稿記事 by box » 10年前

koujun関数で決めた
p_senkou, e_senkou
の値を
kougeki関数で正しく扱えていると思っているなら、
大間違いです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: コンソールゲーム

#3

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

C++11ですね。
64行目のwhile文に入る時点で、pl.hpの値は100、en.e_hpの値は200です。
どちらも0未満ではないので、while文の条件は偽であり、while文の中の処理は行われません。
そのままreturn 0;を実行し、プログラムは終了します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: コンソールゲーム

#4

投稿記事 by box » 10年前

そもそも、せっかくC++を使うのであれば、
もうちょっとオブジェクト指向っぽい体裁にする方が
いいような気がしなくもありません。

playerクラス
enemyクラス
あたりを用意して、
自分のhpを管理するとともに、
「敵にダメージを与える」ようなメソッドあたりを
考えてみると、それらしくなってくるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: コンソールゲーム

#5

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

呼び出し側から関数に渡した変数の値を書き換える方法の一つとして、参照があります。

コード:

#include <cstdio>

// 参照なし
void func1(int a) {
	a = 10;
	printf("func1 a = %d\n", a);
}

// 参照を使用
void func2(int& a) {
	a = 20;
	printf("func2 a = %d\n", a);
}

int main(void) {
	int a = 42;
	printf("main before func1 a = %d\n", a);
	func1(a);
	printf("main after func1  a = %d\n", a);
	func2(a);
	printf("main after func2  a = %d\n", a);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

けいすけ

Re: コンソールゲーム

#6

投稿記事 by けいすけ » 10年前

皆さんありがとうございます。
このように記述すると、思い通りの実行ができました!

しかし、まだwhile分の中の処理がきれいにまとめれていないので、そのへんのアドバイスなどありましたら
教えてください。

コード:


#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

class player{
public:
    int hp = 100;
    int sp = 100;
    int kou = rand() % 30;
    bool senko = false;
    char k;
    
    void php_show(){
        cout << "自分\nHP:" << hp << "\n" << "sp:" << sp << "\n\n";
    }
    
};

class enemy{
public:
    int ehp = 200;
    int esp = 200;
    int bullet = rand() % 50;

    void ehp_show(){
        cout << "敵\nHP:" << ehp << "\n" << "sp:" << esp << "\n\n";
    }
    
};

    
int main(){
    
    player pl;
    enemy en;

    pl.php_show();
    en.ehp_show();
    
    while(pl.hp > 0 || en.ehp > 0){
        if(pl.senko == true){
            cout << "----あなたの攻撃です---- \n";
            
            cin >> pl.k;
            
            pl.sp -= pl.kou;
            pl.php_show();
            
            en.ehp -= pl.kou;
            en.ehp_show();
            
            pl.senko = false;
        }
        
        if(pl.senko == false){
            cout << "----敵の攻撃です---- \n";
            
            pl.hp -= en.bullet;
            pl.php_show();
            
            en.esp -= en.bullet;
            en.ehp_show();
            
            pl.senko = true;
        }
    }
    
    return 0;
}







閉鎖

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