ふらっと C#,C♯,C#(初心者用) Part150

■ このスレッドは過去ログ倉庫に格納されています
2021/03/23(火) 12:58:24.10ID:ACoFzk2L0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part149
http://mevius.5ch.net/test/read.cgi/tech/1608085775/
■関連スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/03/23(火) 18:03:39.73ID:VsSEePUk0
List<乙>
3デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/23(火) 21:59:18.80ID:EIK7uDnA0
コンソールでRPGみたいなゲーム作ろうとしてるけど
クラスの作り方がいまいち思い浮かばない
例えば
レベルアップした時にHPとかMPとかのクラスのフィールドをいじりたいけど、レベルクラスに入れるとステータス取るときに毎回status.level.hpみたいにレベルを通らないといけないのが厄介
かといってステータスクラスの中にレベルクラスとHPクラスを内包してしまうとレベルクラスのメソッドが呼び出された時にhpクラスのメソッドが呼び出せない…(staticはなしとして)

どうすれば良いのだ
2021/03/23(火) 23:03:31.32ID:CY92qFOb0
レベルやHPをクラスにしたい理由は?
どういうメソッドを想定してるの?
2021/03/23(火) 23:04:14.83ID:zRupaTqla
>>3
単純に、ステータス、レベル、HP、MPをメンバ変数に持つクラスにすりゃええんちゃう?
レベルアップメソッドを呼ばれたら、それぞれを更新するだけ

最初は難しく考えないで、ありのまま設計して実装してみる
で、破綻しそうなら設計を変えて再実装
そういう試行錯誤も楽しいかもよ
2021/03/23(火) 23:32:37.84ID:3AlrkluQ0
ゲームはすべてのリアルタイムデータをエクセルに並べるつもりでプログラムを組め
物体同士の相互作用処理が一番多くてかつそれが7つも8つも同時に関わるので
オブジェクト指向言語の機能が役に立たないどころか悪影響すら及ぼす
絶対に使わないほうが楽に組めるぞ
まあ、まずやってみろ
2021/03/23(火) 23:52:01.54ID:oR7E8wqDr
偉そうなやつだな
2021/03/23(火) 23:59:45.77ID:ACoFzk2L0
でもまあ、とにかくやってみるってのには賛成。
根気よく続けて、それにちょっとした向上心があるなら、そのうちそれなりにはなる。

>>3 の人は、直接的なアドバイスを求めてるんだろうけど、ちょっとアドバイスしたくらいでどうにかなるようなもんでもないなぁって感じ。
2021/03/24(水) 03:06:14.87ID:hZzg7ROH0
>>3
オブジェクト指向言語だからクラスは物、オブジェクトであって、
RPGのキャラはそれぞれステータスを持つオブジェクト=クラス。
キャラにはステータスがあるなら、それぞれのキャラクラスにはステータスクラスが保有されるべき。
・・・などと自分なりに整理して、設計してみてはどうか。
その設計で厄介なことがあっても、設計に納得出来るなら、それは通るしかない厄介事なのかもしれない。
それを回避したり厄介を軽減する手段はいろいろ有ると思う。
やってれば身についてくる。その過程がまた楽しい。
設計が正しいかどうか、それは自分が決めればいいが、想像が付かないなら書籍を漁る。
10デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 06:37:38.52ID:k6isLik00
3だけど
一応4回くらい違う設計で同じ処理のコードを作ってみたんだが、やりたいことは
親クラスに子クラス1,2がいて
子クラス1のフィールドが更新されたとき、子クラス2のフィールドを更新したい

一応現状はref使ってインスタンスされてる子クラス2のアドレスを保存して子クラス1で間接的に更新してるけど
子クラス3,4,…って増えた時に毎回コンストラクタの引数変えて処理追加させるのは冗長的だなぁと思って違うやり方したいと考えてるけど思いつかない…
11デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 06:43:09.14ID:k6isLik00
>>4
パラメータクラスに最大値、最小値、現在値をプロパティで持つようにして
HP、MP、LV、EXP、クラスをパラメータクラスを継承して作ろうとしてる
さいごにステータスクラスとしてHPからEXPをフィールドに持つようにしてコンストラクタでインスタンス化させるようにしてる
12デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 07:00:45.85ID:k6isLik00
class Prameter{
private int _Max;
public int Max{
set MaxUpdate(value);
get return _Max;
}

protected virtual
void MaxUpdate(int val){
_Max=val;
}

最小値も上と同様
現在値も上と同様※
}

※少し実装とは違うけどざっくりとしたらこんな感じのクラスを現状HP,MP,Level,exp全クラスにそれぞれ継承してる
レベルアップとかは現在値の更新時処理のoverrideで処理変えたりして実装してるんだ
13デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 07:19:03.14ID:k6isLik00
>>6
やっぱりそうか。Cのような関数での設計なら単純で作りやすいんだがオブジェクト指向の練習と思ってやってると意外と難しかった。
ちょうど7つも8つもパラメータが増えてきていちいち引数変えたりするの面倒やしクラスにするメリットがあまりないな…
2021/03/24(水) 07:39:20.22ID:IIHDBzfT0
>>13
7つ8つはパラだけじゃなくてオブジェクトもやぞ
アクセスを限定するオブジェクト指向言語の機能は絶対に役に立たん
2021/03/24(水) 12:54:19.52ID:C9/npL5e0
>>11
ステータスクラスがHP, MP, LV, EXPの最大値、最小値、現在値をそれぞれ直接int等で持つ構成と
ステータスクラスがHP, MP, LV, EXPの各クラスのインスタンスを保持する構成とを比較して
後者にどういうメリットがあるのか、もしくはないのかを考えればいいんでないのかな?

>>10
>親クラスに子クラス1,2がいて
親クラス・子クラスという表現は一般的に継承関係を指すので
あるクラスが別のクラスのインスタンスを保持してる場合は親クラス・子クラスという表現は使わないほうがいい

>子クラス1のフィールドが更新されたとき、子クラス2のフィールドを更新したい
今回のケースで使うべきかどうかは微妙だけど
フィールドが更新されたときにそれをイベントとして通知するようなパターンを使えば
クラス1のコードでクラス2を参照する必要がなくなって通知先が増えてもクラス1を変更しなくてよい
2021/03/24(水) 13:06:41.79ID:C9/npL5e0
https://paiza.io/projects/jSt0Q60s11SN8n8JJzO_7Q
これ、とあるゲームのキャラクターステータスだけどベタなキーバリューペアで管理してる
スキルや装備によってバトル中のHPや攻撃力/防御力とかが変化するから本来の値と底上げされた値は別項目で管理されてる
2021/03/24(水) 15:14:08.35ID:hZzg7ROH0
何か既存のRPGでやってるステータス計算の再現なのかな。
C#の仕組みを凝ると、デバッグが怖そう。
18デフォルトの名無しさん (スププ Sd33-PDCb)
垢版 |
2021/03/24(水) 17:52:37.32ID:JXkKcrLid
なるほど、
皆様、様々なアドバイスありがとうございます。
特に親、子クラスとかのニュアンスや使い方の指摘はありがたい。

ちなみにゲームの再現はしてないけど、イメージはCUIのドラクエのイメージ。それをオブジェクト指向の練習としてクラスで作ってみようとして一番最初で詰んだという経緯っす。

メリットデメリットは正直オブジェクト指向が初めてだからよくわからないってのが本音。ただ知識として幅は広がってる気がする。MVCモデルとかで実現するのかなーとか考えたりイベントをリストで管理するのかなーとか色々模索はしたけど結局いい感じにならず苦難中。
2021/03/24(水) 17:59:16.27ID:HEdEJwPg0
最初はあんまり沢山クラス作らない方がいいかと思う
段々とここは分離した方がいいとか継承した方がいいとか分かってくるので
とにかく動くものを作れるかどうかで勉強するにしても先に進めるかどうかの分岐点になるからな
2021/03/24(水) 18:09:40.53ID:spck33He0
オブジェクト指向の学習が目的なら、ポケモンで学ぶオブジェクト指向みたいなのがいくつかあるから
そういったPOSTを眺めるとなんとなく雰囲気がつかめるかもしれない
2021/03/24(水) 18:29:08.45ID:c5QGfFFqa
ゲーム自体があんまりOOP向きの題材じゃないかもしれないよ。

モデル化する必要があるのはゲームの世界を成立させている「舞台装置」
であってプレーヤーの目に見える表層的なキャラじゃなかったりすると思うんだけど
前者は得てして抽象的な存在になるし、どうしても後者に引きずられてしまう。

知らんけど。

大昔シューティングゲームとかボードゲームがいかにOOP向きじゃないかって
論争があったねw
22デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 18:34:43.36ID:7kvkVNgG0
そうか…
既にOOPに対して嫌悪感を抱き始めるこの始末。
とはいえ継承ができたりオーバーライドして変更したりできるのは良いね
〇〇/××って形の表示するのもは全部同じパラメータクラスで扱えるし、ちょこっと変えたいとなるとオーバーライドで消したりオーバーロードで処理増やしたりできるもんね。

うーん、やっぱC#はよーわからんw
23デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 18:43:27.34ID:1tcqqVj20
ちなみに、C#(プログラミング)初心者が理解しやすそうな題材ってあります?
まだhelloworldから変数作って弄るよりかはゲームのほうが楽しめるんかなと思ってそれで始めたらドツボ入ったんだよね。
難易度も低めが良いけど…(マルチスレッドやGUIでないようなもの)
2021/03/24(水) 18:57:55.30ID:HEdEJwPg0
どういうものを最終的に作りたいかによるけどゲームが目標なら
最初からUnityで勉強するのもアリかなと思う

勉強ならコンソールアプリの方が文字だけの世界だから分かりやすいけど
最初からWinFormsのプロジェクト作ってボタンやテキストボックスなど配置して
GUIのアプリのつくり方を勉強するのも良いかも知れない
GUIだとButtonにはClickイベントが、TextBoxにはTextChangedイベントがあるとか
(デザイン画面のボタンなどをダブルクリックすれば、上記の説明した一番使うであろうイベントの
実装が追加されるようになっている)
そういうイベントにより処理を行うみたいな形になるので、リアルタイムのゲームとは違った感じになるかと

どっちにしてもプログラムしてみて動かしてを繰り返し出来る方が望ましいかな
25デフォルトの名無しさん (ワッチョイ d901-PDCb)
垢版 |
2021/03/24(水) 19:03:33.84ID:1tcqqVj20
なるほどなー
よく考えたら最終的にはGUIのアプリケーションプログラムが作りたいと思ってた。ゲームは特に好きじゃないけど好きな人が多そうだから説明する時にも役立つかなとは思ってゲームにしてた具合。
先にFormやるのもありかも
2021/03/24(水) 21:14:45.45ID:6P4Y/Xh7d
ライフゲーム
2021/03/24(水) 21:41:45.26ID:C9/npL5e0
いろんな種類のキャラを動かす系のゲームはOOPに向いてると思うけどな
実際そういうゲームのほとんどがオブジェクト指向で作られてるわけで

プログラミングを学ぶ目的に適してるかと言われると微妙だが
2021/03/24(水) 21:51:54.97ID:IIHDBzfT0
>>27
向いてない
オブジェクト指向って
オブジェクト同士の処理を綺麗に書く
ように作られてない

全オブジェクトが存在するシーンにほぼすべての処理を記述することになる
マップ情報がないとキャラは移動すらできないことがすぐにわかる
ではマップとキャラのデータが混在した処理をどこに記述するべきか?
シーンに決まってる
なのでゲームシステムに関わるほぼすべての処理をシーンに記述することになる
もう仮にオブジェクト個別の処理が2〜3個見つかった程度で個別のクラスなんかに書くのはバカってぐらい
全部シーンに書くことになる
2021/03/25(木) 06:17:54.99ID:PnLvSLd80
言語そのものよりライブラリに何があるのか把握しきれなくて辛い。
自分でクラスを作ったら、もう既に.Netにあったりするし。
辞書を熟読するような事前の勉強が必要なのかな。
2021/03/25(木) 07:11:43.36ID:/8oIOqtL0
>>29
必要なのは作る前にググる癖じゃね?
2021/03/25(木) 08:33:30.77ID:tiLz+LJ90
>>29
わかる。会社に入るとドキュメントの無いライブラリも加わる。
2021/03/25(木) 08:39:46.38ID:qKMPIZcm0
ゲームって普通にOOP学習にはもってこいじゃね?
一見全く種類の違う自キャラや敵やNPCなどを一つのベースクラスから派生させたりとかオブジェクト指向の有難みを享受しやすいジャンルだと思うけどな
まぁそういうことせずとも一度C言語を使ってみればC#を使ってる時点でデフォでめちゃくちゃオブジェクト指向の恩恵に授かってるというのを認識できるけど
2021/03/25(木) 09:28:18.12ID:WBb7w08Pd
ゲームだと単純に楽しいし、良く知ってる世界だし。
異世界小説が流行るのも、みんなリアルよりゲームのほうが詳しいからね。
2021/03/25(木) 13:24:44.00ID:P2foE7HjM
ゲームはOOPより関数型のがやりやすい
OOPだとゲーム状態が大量のオブジェクトに分散してしまい管理が追いつかなくなる
2021/03/25(木) 13:26:41.67ID:KsV0Sf9V0
パラメータ管理とレンダリングは別視点
2021/03/25(木) 13:29:23.03ID:Nsykn7+b0
unityやwpfで何か作ったらいいんじゃない?
嫌でもOOPを使うことになるし
37デフォルトの名無しさん (ワッチョイ 8bbb-Q5Cn)
垢版 |
2021/03/25(木) 15:14:45.90ID:mlbm7rgK0
Unityはやめといたほうがいいんじゃん?
ゲーム特有の定石が多い上にあまり公開されていないので、なかなかOOPを活かせるようなコードが書けるもんじゃない
2021/03/26(金) 06:50:34.94ID:M+ibeJ+i0
なんか作るとき、ついつい無駄にインターフェース作ったり、クラスを継承させたりしたくなる。
後で使うかもって置いといても、結局、役立たずで無駄になったり。
2021/03/26(金) 08:06:06.50ID:kpMAymvOM
YAGNI原則
40デフォルトの名無しさん (ワッチョイ b1b5-lMfL)
垢版 |
2021/03/26(金) 14:55:15.51ID:OgsXGrRW0
質問です。
'string[][]'と'string[*,*]の違いは何ですか?

List<string[]> lists = new List<string[]>();

string[,] = lists.ToArray();
で二次元配列にしようとすると、

CS0029: Cannot implicitly convert type 'string[][]' to 'string[*,*]'

とエラーが出て困っています。
2021/03/26(金) 14:58:50.52ID:jmlXC9C1M
[][]は配列の配列
[,]は二次元配列
42デフォルトの名無しさん (ワッチョイ b1b5-lMfL)
垢版 |
2021/03/26(金) 15:04:21.89ID:OgsXGrRW0
>>41
なるほど、理解出来ました。
ありがとうございました。
2021/03/27(土) 08:26:55.12ID:8mKnzpiaD
>>1
関連スレ
ふらっと C#,C♯,C#(議論用) [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1469538912/
2021/03/28(日) 08:30:33.61ID:w0FgUNmI0
>>38
「いつか使うだろう」という動機で作る機能の9割は結局使われないという法則があってだな
2021/03/28(日) 10:40:20.81ID:i/QSKAGe0
でも、ついでだし作っとくか、で作ったやつがその後のバグ対に効果大なこともあったな。結構。

「起こる可能性のあることはいつか必ず起こる」ってのはマーフィーの法則だっけ。
アタマの片隅にでも置いておくと、後で助かることがままある。
2021/03/28(日) 11:33:59.11ID:wZjOpvsr0
一人で作ってるならいいんだけど別の人が対応する時に混乱させるだけなことが多いからな
チーム開発では起こらないことを無駄に考えてしまうのはよくないって場面の方が多い
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況