hayashi0001
@hayashi0001 (S hayashi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

別の関数で使ってた変数?を持ってきたい

解決したいこと

関数fightで倒したacross(ランダム出力させた敵キャラ)をlevelUp関数でも使用したい

発生している問題・エラー

下記のacross.exPointにエラーが発生する。

コード説明

 adventure()・・・playerのレベルに対応してランダムに敵(monster)を出す
 fight()・・・戦わせる
 levelUp()・・・fight()でplayerが勝った場合倒したmonster(この場合across)の経験値を加算しplayer[0].exPointがlevelUpPointより大きくなったらレベルが1上がる

TextQuestCard adventure(TextQuestCard[] monster, TextQuestCard[] player) {
		int random_adventure = (int)(Math.random()*100) + 1;
		if(1 <= random_adventure && random_adventure <= 10) {
			/*何もなかった*/
			System.out.println("今日は何も見つからなかった。");
			player[0].hitPoint = player[0].hitPoint + (player[0].maxHitPoint*10)/100;
			return player[0];
		}
		else if(11 <= random_adventure && random_adventure <= 100) {
			/*モンスターに出くわす*/
			int monsterCount = 0;
			for(int i = 0; i <= 20; i++) {
				if(monster[i].conditionsPoint <= player[0].level) {
					monsterCount++;
					//当てはまったモンスターの番号を格納する配列作る
					 int[] monsterList = new int[21];
					 monsterList[monsterCount] = i;
				}
			}	
			int random_monster = (int)(Math.random()* monsterCount);
			System.out.println(monster[random_monster].name + "に出くわした!");
			return monster[random_monster];
		}
		return null;
	}
	
	Integer fight(TextQuestCard[] monster, TextQuestCard[] player) {
		TextQuestCard across = adventure(monster, player);
		
		int battlestart = 0;
		int MyTurn = 0; 
		int EnemyTurn = 0;
		
		if(battlestart == 0) {
			if(player[0].speed >= across.speed) {
				MyTurn = 1 ; 
				EnemyTurn = 0;
			}
			else {
				MyTurn = 0 ; 
				EnemyTurn = 1;
			}
			battlestart = 1;
		}
		
		for(int i = 1; i <= 15; i++) {
			if(MyTurn == 1) {
				/////////////////////自分のターンが先行////////////////////////////

				//////////////////////戦闘エフェクト//////////////////////////////
				System.out.println(player[0].name + "の攻撃");
				//////////////////////ダメージ計算////////////////////////////////
				across.hitPoint = across.hitPoint - player[0].atkPoint;
				System.out.println(across.name + "に" + player[0].atkPoint + "のダメージ");
				if(across.hitPoint <= 0) {
					System.out.println(across.name + "を倒した!");
					return across.exPoint;
				}
				System.out.println(across.name + "の攻撃");
				player[0].hitPoint = player[0].hitPoint - across.atkPoint;
				System.out.println(player[0].name + "は" + across.atkPoint + "のダメージ");
				if(player[0].hitPoint <= 0) {
					System.out.println(player[0].name + "は倒れてしまった!");
					return 0;
				}
				
			}
			
			if(EnemyTurn == 1) {
				/////////////////////相手ターンが先行////////////////////////////

				//////////////////////戦闘エフェクト//////////////////////////////
				System.out.println(across.name + "の攻撃");
				//////////////////////ダメージ計算////////////////////////////////
				player[0].hitPoint = player[0].hitPoint - across.atkPoint;
				System.out.println(player[0].name + "は" + across.atkPoint + "のダメージ");
				if(player[0].hitPoint <= 0) {
					System.out.println(player[0].name + "は倒れてしまった!");
					return 0;
				}
				
				System.out.println(player[0].name + "の攻撃");
				across.hitPoint = across.hitPoint - player[0].atkPoint;
				System.out.println(across.name + "に" + player[0].atkPoint + "のダメージ");
				if(across.hitPoint <= 0) {
					System.out.println(across.name + "を倒した!");					
					return across.exPoint;

				}	
			}
		}
		return null;
	}

TextQuestCard levelUp(TextQuestCard[] player, TextQuestCard[] monster) {
		Integer across = fight(monster, player);

		double levelUpPoint = 1;
		
		if(player[0].level >= 2) {
			for(int i = 1; i <= player[0].level; i++) {
				levelUpPoint = levelUpPoint * 1.5;
			}
		}
		
		player[0].exPoint = player[0].exPoint + across.exPoint;
		int count = 0;
		for(int j = 1; player[0].exPoint < levelUpPoint; j++) {
			if(levelUpPoint <= player[0].exPoint) {
				player[0].exPoint = (int)(player[0].exPoint - levelUpPoint);
				player[0].level = player[0].level + 1;
				count++;
			}
		}
		System.out.println("レベルが" + count + "上がった");
		return player[0];
	}

情報が足りない場合はご連絡ください

0

3Answer

levelUp()内のacrossfight()の戻り値でIntegerなのでTextQuestCardのようには使えませんね.
経験値しか必要ないのであれば単にexp = fight(monster,player)として使えばいいだけです.

変数を渡すということは,monsterに関わる他の情報が必要であると推察しますが,それ云々の前に斜め読みした感じではちょっと設計が悪い気がします.

  • レベルアップ処理であるlevelUp()から戦闘処理であるfight()を呼ぶのは直感的ではないです.(ゲームをプレイしている流れ的には普通逆のはずです)
  • 1対1の戦闘が前提であるならば,fight()はもっとシンプルに設計すべきです.引数でplayerとmonsterを1体ずつ特定し,互いを「戦わせる」処理にとどめるべきでしょう.
  • 各メソッドでplayerを配列で取っておきながら,参照しているのは実質的にplayer[0]のみです.

TextQuestCard内にfight(monster)levelUp()などを実装する(=要するにプレイヤーやモンスターが行う動作として独立させる)ことで,もっとシンプルかつ直感的な設計ができると思います.
ゲーム進行に関するフローチャートを1回書いてみることをお勧めします.

4Like

ざっくりソースを見た感じですが、fightの戻り値が数値になっているので以下の変数acrossにはすでに経験値の数値が入っていると思います。

Integer across = fight(monster, player);

ですので、以下の変更でうまくいかないでしょうか?

- player[0].exPoint = player[0].exPoint + across.exPoint;
+ player[0].exPoint = player[0].exPoint + across;

(経験値が入っていることがわかるように、変数名を適切な形に修正したほうがいいとは思います。)

2Like

関数levelUp内のacrossはInteger型なので、exPointはそんざいしないです。ただの数なので

なので下記のようにすれば勝ったら敵からのexp,負けたら0がたされます

player[0].exPoint = player[0].exPoint + across;
2Like

Your answer might help someone💌