今起こっている問題
どこからか0の数値が出てきて、実行結果が望み通りでないものが出てきます。修正したいものの文法ミスではないため赤線で教えてくれる訳でもなく途方にくれてます。有識者さん、解が0になってしまう原因の箇所など教えてくださいm(__)m 因みに、実行場所はvisual studioです。
ソースコード
using System; using System.Linq; namespace 頭の中を整理する用 { class Program { public static double DamageCalculator(double num, double power, double dam, double dif) { Random rnd = new Random(); double totalDamage = num*power * dam / dif / 2.5* rnd.Next(80,120)/100; return Math.Round(totalDamage); } class Skill { public string Name { get; set; } public double Dam { get; set; } public double Num { get; set; } public double HitRate { get; set; } public double CriRate { get; set; } public int ActionP { get; set; } } class Status { public string Name { get; set; } public double HP { get; set; } public double Atk { get; set; } public double SpAtk { get; set; } public double Def { get; set; } public double Speed { get; set; } public string Ability{ get; set; } } static readonly Skill[] _skills = new[] { new Skill() {Name="1",Dam=1, Num=1, HitRate=1, CriRate=1, ActionP =1}, new Skill() {Name="noutenkatiwari", Dam=195, Num=1, HitRate=0.3, CriRate=0.1, ActionP =1}, new Skill() {Name="senkougiri", Dam=44, Num=3, HitRate=1, CriRate=30, ActionP =1}, new Skill() {Name="otaki", Dam=120, Num=1, HitRate=1, CriRate=0.1, ActionP =2}, }; static readonly Status[] _statuses = new[] { new Status(){Name="1",HP=1,Atk=1,SpAtk=1,Def=1,Speed=1}, new Status(){Name="Kabukizaru",HP=251,Atk=200,SpAtk=94,Def=87,Speed=106}, new Status(){Name="Businyan",HP=292,Atk=182,SpAtk=92,Def=88,Speed=162}, new Status(){Name="Kurooni",HP=458,Atk=180,SpAtk=84,Def=231,Speed=90}, new Status(){Name="Hukai",HP=362,Atk=123,SpAtk=182,Def=103,Speed=203}, new Status(){Name="Ryorar",HP=1,Atk=800,SpAtk=20,Def=1,Speed=12000}, }; public static void Main(string[] args) //ここからMainコードだお { var atkWp = _skills.Where(x => x.Name == "1").First(); var atkSt = _statuses.Where(x => x.Name == "1").First(); ; var difSt = _statuses.Where(x => x.Name == "1").First(); ; string askAtk = Console.ReadLine(); //アタッカーの質問 if ((askAtk == "カブキ猿" )|| (askAtk == "1")) { atkWp = _skills.Where(x => x.Name == "noutenkatiwari").First(); atkSt = _statuses.Where(x => x.Name == "Kabukizaru").First(); }else if ((askAtk == "ブシニャン")|| (askAtk == "2")) { atkWp = _skills.Where(x => x.Name == "senkougiri").First(); atkSt = _statuses.Where(x => x.Name == "Businyan").First(); }else if ((askAtk == "不快")||(askAtk == "3")) { atkWp = _skills.Where(x => x.Name == "otaki").First(); atkSt = _statuses.Where(x => x.Name == "Hukai").First(); } string askDif = Console.ReadLine(); //ブロッカーの質問 if((askDif == "カブキ猿")|| (askDif == "1")) { difSt = _statuses.Where(x => x.Name == "Kabukizaru").First(); }else if ((askDif == "ブシニャン") || (askDif == "2")) { difSt = _statuses.Where(x => x.Name == "Businyan").First(); }else if((askDif == "不快") || (askDif == "3")) { difSt = _statuses.Where(x => x.Name == "Hukai").First(); } //命中率計算用の変数 Random rnd2 = new Random(); Random rnd3 = new Random(); int hitCheck = 0; double hitRateCalculation = 0; //クリティカル計算 double criDamage = 0; int criNum = 0; //表記用 string whatToWrite = ""; double lowest = 1000; double highest = 0; double avaDam = 0; //施行回数の指定 int x = 500; //ダメージ計算開始 for (int j = 0; j < x; j++) { Random rnd1 = new Random(); double totalDamage = 0; for (int i = 0; i < atkWp.Num; i++) { //命中チェック hitRateCalculation = Math.Round((atkSt.Speed / difSt.Speed * rnd2.Next(60, 80) / 2 + 50) * atkWp.HitRate); if (rnd3.Next(0, 100) < hitRateCalculation) { hitCheck = 1; } else { hitCheck = 0; } //クリティカルチェック if(rnd3.Next(0,1000) < atkWp.CriRate*10) { if (atkSt.Name == "Businyan") { criDamage = 2.25; criNum += 1; } else { criDamage = 1.5; criNum += 1; } }else { criDamage = 1; } //ダメージ計算 //double intermediateDamage = atkWp.Dam * atkSt.Atk / difSt.Def / 2.5 * rnd1.Next(80, 120) / 100* hitCheck*criDamage ; double intermediateDamage=atkWp.Dam* atkSt.Atk / difSt.Def / 2.5 * rnd1.Next(80, 120) / 100 * hitCheck * criDamage; } //ダメージ計測 if (totalDamage > highest) { highest = totalDamage; } if (totalDamage < lowest) { lowest = totalDamage; } avaDam += totalDamage; //計算値出力 whatToWrite += totalDamage.ToString() + " "; } Console.WriteLine(whatToWrite); //ダメージ計算終了 //動作確認用(不要) Console.WriteLine("命中率は" + hitRateCalculation + "%です"); Console.WriteLine("クリティカル数は" + criNum + "回です"); Console.WriteLine("最高火力は"+highest+"で、最低火力は"+lowest +"でした!"); Console.WriteLine("ダメージレートは"+avaDam/x+"でした!"); Console.ReadLine(); } } }
意図しない結果になると言うことは怪しいところにブレークポイント置いてデバッグしたらいいのでは?
というか質問のタイトルは要件を簡潔に書いてください。
このタイトルだと何をしてて何のエラーが出てるのかまったくわかりません
ステップ実行してご自身のプログラムがどのように動いているのか1行づつ確認しましょう
このコードで何がしたいのか、望み通りの実行結果は何なのか、現状の結果が何なのか、など情報がありません。
回答者は赤の他人なので、現状ではこれらをコードから推測するしかなく、それだと負担が大きすぎます。
プログラミングのベテランでも、書いたコードが一発で正しく動くとは限りません。正しく動くようになるまでデバッグしましょう。
[超初心者でもわかるデバッグ方法]
https://docs.microsoft.com/ja-jp/visualstudio/debugger/debugging-absolute-beginners?view=vs-2019&tabs=csharp
ちなみに、デバッグ依頼は非推奨質問になります。
[推奨していない質問] https://teratail.com/help/avoid-asking
恐らく先のご質問でいただいていた回答を参考にして作り上げてきたのだと思いますが、コードの内容を理解されていますか?
タイトルには要件を記載してください。中身がありません。
ちなみにこのコード、自力で他人に説明できますか?
回答2件
あなたの回答
tips
プレビュー