質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

1155閲覧

C#でConsole.ReadLineなどについて

RyojiAraki

総合スコア79

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/08/20 00:39

編集2021/08/20 00:43

【C#】コードを簡略化して欲しい

私は初心者なので、遠回りの書き方をしていると思います。以下のコードを訂正してくだされば幸いです。

発生している問題・エラーメッセージ

Console.Readlineの入力内容によって、自動的にそれに該当するデータをもってくるようなコードをかきたいです。データはコード内に記してあります。

該当のソースコード

c#

1using System; 2 3namespace 頭の中を整理する用 4{ 5 class Program 6 { 7 8 public static double DamageCalculator(double num, double power, double dam, double dif) 9 { 10 11 Random rnd = new Random(); 12 double totalDamage = num*power * dam / dif / 2.5* rnd.Next(80,120)/100; 13 return Math.Round(totalDamage); 14 } 15 16 public static void Main(string[] args) 17 { 18 19 //こちらは技のデータベースとなっております。 20 double[] noutenkatiwari = new double[] { 195, 1, 0.3, 1 }; 21 double[] senkougiri = new double[] { 44, 3, 1, 1 }; 22 23 //こちらはステータスのータベースでございます。 24 int[] statusKabukizaru = new int[] { 251, 200, 94, 87, 106 }; 25 int[] statusBusinyan = new int[] { 292, 182, 92, 88, 162 }; 26 27 //バフの数値を合わせます 28 double[] bahuA = new double[] { 1, 1, 1, 1, 1, 1 }; 29 double[] bahuB = new double[] { 1, 1, 1, 1, 1, 1 }; 30 31 //技の火力[0]、回数[1]、命中率[2]、クリティカル率[3]の順番にかく 32 //ステータスはhp,ちから,ようりょく,まもり,すばやさの順番でかく 33 //クリティカル率、被クリティカル率、ちから変化、まもり変化、すばやさ変化、命中率変化の順番でかく 34 35 36 37 38 39 string s = Console.ReadLine(); 40 if (s == "カブキ猿") 41 { 42 for (int i = 0; i < 20; i++) 43 { 44 45 Console.WriteLine(DamageCalculator(noutenkatiwari[1], statusKabukizaru[1], noutenkatiwari[0], statusBusinyan[3])); 46 } 47 Console.ReadLine(); 48 }else if(s == "ブシニャン") 49 { 50 for (int i = 0; i < 20; i++) 51 { 52 53 Console.WriteLine(DamageCalculator(senkougiri[1], statusBusinyan[1], senkougiri [0], statusKabukizaru [3])); 54 } 55 Console.ReadLine(); 56 } 57 } 58 } 59}

試したこと

特にありません。知識の補足などをしてくだされば嬉しいです。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019 for Mac

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/08/20 00:48

本当に遠回りの書き方ですか? 目的地についてます?
dodox86

2021/08/20 00:52

> 以下のコードを訂正してくだされば幸いです。 初心者なコードでも要望通りに動いているのであれば訂正ではありませんね。やりたいことは言うなれば改良、改善です。で、コードを別人である回答者さんらが書き直したとして初心者を自認する質問者さんがそれを理解できるとは限らない心配があるのですが、、、 [推奨していない質問] https://teratail.com/help/avoid-asking
dodox86

2021/08/20 01:02

Zuishinさんのご指摘を読んで: ああ、目的地に着いているかどうかまでは読んでなかった。「まだまだ足りないんじゃないか」とは思いましたが。要望通りには動いて無さそうなので、「訂正」なのですね。それだと「コードください」案件で、ダメですね。
退会済みユーザー

退会済みユーザー

2021/08/20 01:14

読んでください→ https://teratail.com/help/question-tips 以下抜粋: "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。何がわからないかわからない人から質問を受けても、答える側も困ってしまいます。"
RyojiAraki

2021/08/20 06:20

了解です。コードの簡略化の例をいくつか教えて頂きたかったのですが、それはエラーなどが起こっているわけではないのであまり好ましくない質問になってたのですね。以後気をつけます。
退会済みユーザー

退会済みユーザー

2021/08/20 07:10 編集

> 以後気をつけます。 このコメント欄は「質問への追記・修正」です。なので、以後ではなくて今質問欄を編集して何が分からないのか何を知りたいのか何に困っているのかなどを具体的に書くことはできませんか?
guest

回答1

0

ベストアンサー

簡略云々は置いておいて、パッと見て読んでいて辛いなと感じたのが、データベースとコメントで書いている数字の配列の部分です。

C#

1 //こちらは技のデータベースとなっております。 2 double[] noutenkatiwari = new double[] { 195, 1, 0.3, 1 }; 3 double[] senkougiri = new double[] { 44, 3, 1, 1 };

これ、他人が見て配列のそれぞれの数字が何を意味してるか全く判りません。
下のコメントまでみたらようやく意味が判りましたが、一目見てコードが何をしているか判らないというのは読み手に負荷が大きいです。

##[案1.クラスを作成する]

cs

1 class Skill 2 { 3 public string Name { get; set; } 4 public double Atk { get; set; } 5 public double NumAtk { get; set; } 6 public double HitRate { get; set; } 7 public double CriRate { get; set; } 8 } 9 10 static readonly Skill[] _skills = new [] 11 { 12 new Skill() {Name="noutenkatiwari", Atk=195, NumAtk=1, HitRate=0.3, CriRate=1}, 13 new Skill() {Name="senkougiri", Atk=44, NumAtk=3, HitRate=1, CriRate=1}, 14 };

Skillクラスを作成し、このようにデータを定義すると、コメントが無くともどういったデータか自明ではないでしょうか。

cs

1 var findSkill = _skills.Where(x => x.Name == "senkougiri").First(); 2 Console.WriteLine($"{findSkill.Name}.Atk:{findSkill.Atk}");

検索はこのように書けます。(using System.Linqが必要)

##[案2.タプルを使用する]

cs

1 static readonly (string Name, double Atk, double NumAtk, double HitRate, double CriRate)[] _skills = 2 { 3 ("noutenkatiwari", 195, 1, 0.3, 1), 4 ("senkougiri", 44, 3, 1, 1), 5 };

配列と一見似ていますが、メンバの名前と型付けがされています。クラスの時と同じような検索が可能です。

記述量はタプルの方が少なくて楽ですが、複数のクラスで使用するようなデータの場合、専用クラスを作成した方がよいでしょう。

投稿2021/08/20 05:11

編集2021/08/20 05:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RyojiAraki

2021/08/20 06:27

詳しく教えてくださり本当にありがとうございます!!有識者さんのアドバイスめちゃ役に立ちます。まだクラスやタプルの理解が追いついてないので、じっくり読ませて頂きます m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問