皆さんコード組む時って (82レス)
上下前次1-新
23: 2022/09/19(月)13:21 AAS
ほそぼそしたところからつくります
24: 1 2022/09/19(月)14:40 AAS
数日前にトランプのブラックジャックを作ってみたんですけど、
俺の場合完全にボトムアップでしたね
カードクラスを定義して、プレーヤークラス、コンピュータクラス、メインの処理と、
ルールや手順を思い出しながら処理を順々に仕上げては部分部分でテストし、
最終的に一つのプログラムが出来上がる、という感じでした
25: 2022/09/19(月)15:10 AAS
カードクラスとか作るんかいなw
トランプなんて1~52でいいやんw
26(2): 1 2022/09/19(月)15:59 AAS
クラスにしたのは、各カードがスートを4種類持ってるというのと、
スコア計算時にJ・Q・Kが10になり、Aも11になることがあるという事情からなんですよ
属性としてsuit、number、valueを持つようにしました
27: 2022/09/23(金)22:14 AAS
適量のアルコールでも脳には悪影響が 海馬の萎縮リスクが3倍以上に | ニュース | 保健指導リソースガイド
外部リンク[php]:tokuteikenshin-hokensidou.jp
28: 2022/10/01(土)22:58 AAS
ガンダムと一緒で最初にどんなモビルスーツを作るかを考えないで
足から組んでくとピグザムみたいのが出来る
29(1): 2022/10/13(木)14:31 AAS
>>26
ソースアップしてみ?
添削してもらったほうが良いと思う
30(2): 26 2022/10/13(木)23:17 AAS
>>29
ありがたいです
以下のページのblackjack_2.pyがそれです
外部リンク:github.com
文法の勉強が途中の状態で作り始めたので、継承や例外処理といった基本事項を
使ってはいませんが…
31(1): 2022/10/14(金)09:24 AAS
とりあえずここか、例えばJ~Kまでを10点とするコードはmin使ったほうが良い
n = 13
print(min(10 , n))
あとスコアの計算が decide_Avalue_1~4 この辺何やってるかわからんけど
手持ちのカードリストを入れたcardlistがあるなら
calc_score関数はそもそもこんなに冗長しないはず
こういう計算をしやすくする為に最初の
numbers: tuple[str, ...] = ('A', '2', '3', '4', '5', '6', '7', '8', '9',
'10', 'J', 'Q', 'K')
この辺で、文字データしか保有していないのが問題で
内部的に1~13の数値データを持つオブジェクトを作っていればnumber == 'J' みたいなコードは消える
'J'ってのはもしGUIゲームであれば'J'の部分には画像が入るわけだから
プログラム内部的な識別に使う1~13の数値データと、UI表示で使うAやJQKってものは分離しないといけない
32(1): 2022/10/14(金)09:41 AAS
あとclass Playerとclass Cpuってのが完全に冗長してるだろ?
この場合の解決策は、継承・mix-in・動的に関数入れ替え
どれでも良いんだが、
俺は動的にやる事多いから宣言はこうなる
human class_new('HUMAN',human用関数)
cpu = class_new('CPU',cpu用関数)
33(1): 2022/10/14(金)18:41 AAS
Python良く知らんからRubyで書いてしまったが配列の中身を数値型だけにしておけば
minとsumはブラックジャックなら有効活用できるな
def min(a,b) = a < b ? a : b
cardlist = [2, 5, 13]
p cardlist.sum # 13 => K を普通に足し算すると 20
p cardlist.map{|n|min(10,n)}.sum # min関数で13 => K を10として認識すると17
34(1): 30 2022/10/14(金)23:19 AAS
>>31-33
ありがとうございます 参考になります
PlayerとCpuにおけるコードの重複に関しては、継承を使うことで解消したいと思います
decide_Avalue_1〜4では、Aの値が状況によって変わるので、
他のカードの合計値を引数にとって、Aのカード全体の値を返す仕様にしました
あと>>31で言及されている、数値データのオブジェクト化というのは
どんな感じにすればいいかなかなか検討が付きませんでした
よろしければヒントなどを頂けるとありがたいです
35(1): 2022/10/15(土)08:04 AAS
>>34
すまんよくみたら.valueで内部的に数値は持ってたからCardクラス設計は今のまま平気だった
あー、decide_Avalue_1はそういう処理か
calc_scoreとdecide_Avalue_1~4はなんとかしないといかんね
他の部分は継承さえすれば全体処理の見通しをよくしているという評価も出来るけど
この箇所だけは、いわゆるマジックナンバーが出現してるからまずい
36(2): 2022/10/15(土)09:36 AAS
あくまで参考にって感じだけど、decide_Avalueとcalc_scoreは俺が書くとこうなる
保有してるカードの中でAの枚数と、A以外の合計値を関数fに渡す
で、repeated_combinationで、 1 or 11 の選択を総当たりで出力、そこにscoreを足す(ここで21を超えるデータも出来る)
次にdelete_ifで21以上のデータを消して
残りからmaxで最大値を得る
戻り値が数値以外なら(rubyだとnil)、21オーバーした判定
Pythonでもrubyと似たような関数あるはずだから書けると思う
外部リンク:ideone.com
def f a , score
[1,11].repeated_combination(a).map do |m|
m.sum + score
end.delete_if do|m|
m > 21
end.max
end
list = ['A','A',9] # 21
p f(list.count('A'),list.map{|m|m=='A'?0:m}.sum)
list = ['A','A',10] # 12
p f(list.count('A'),list.map{|m|m=='A'?0:m}.sum)
オマケでテストコード
外部リンク:ideone.com
37(3): 30 2022/10/15(土)17:11 AAS
>>35-36
レスありがとうございます
すいません、俺の知識では実装出来ませんでした…
一応>>30にあるリンクにblackjack_3.pyをアップしたのでよろしければご覧下さい
継承でHumanクラスとComputerクラスのダブりを解消したのと、
Aの値を決めるメソッドをdecide_Avalueに一本化しました
ただ10や11といったマジックナンバーは残ってしまいましたが
38(1): 2022/10/15(土)18:58 AAS
>>37
マシになったじゃん
このくらいならとりあえずは書けてる
多分プログラム初めて間もないと思うから全方向に知識伸ばすしかねーわな
39(1): 2022/10/15(土)22:44 AAS
うん、中高生くらいならこのくらいかければ十分だと思う。
無理にググったよくわからない簡略化した実装をコピーしてくるのではなく、
稚拙ながらちゃんと自分で考えて作ってるっぽいところがいいね。
がんばってね。
40(2): 37 2022/10/15(土)22:47 AAS
>>38
ありがとうございます
そうですよね
でもがっかりさせて申し訳ないんですが、PCでプログラミングするようになって
もう5年くらい経つんですよ…独学ではありますが
じゃんけんとか簡易なコードばかり書いている内に歳だけ取ってしまった感じです
まあそれはそれとして、GitHubに時々新しく書いたコードをアップするかも
しれないので、もし時間があるようでしたらたまにチェックして貰えると幸いです
41(1): 37 2022/10/15(土)22:53 AAS
>>39
すいません、中高生ではなく中高年です…
それでも一応頑張るようにします
レスありがとうございます
42(1): 2022/10/16(日)08:28 AAS
>>40
なるほどね、
じゃあこういう種類のゲームを作るほうのスキルを上げたいってことでいいのかな
この手のものはクラスをきっちり書く人もいるんだけど、
もう少し先入観を破壊するように短いコードを探していくと良いと思うよ
そうしないとトランプとかボードゲーム系は短く書ける人なら非常に短く実装するのに、それを何百行で実装するっていうの続けてたら差が埋まらない
画像リンク
この本がオススメ(amazonリンク張れないから画像でw)
あと読まなくても良いが歴史的なLisp読み物
外部リンク:www.asahi-net.or.jp
これはLispを使えっていうのんじゃなくメタプログラミングを覚えろってことだ
アップしたソースコードの中に全く見られないのが言語内言語(DSL)っていう考え方
この種類のプログラムはメタプログラミングの考え方やアイデアがあったほうが簡潔になる
githubは暇があったら見るよ
43(1): 2022/10/16(日)10:35 AAS
>>41
それは大変失礼。
画像生成AIブームに乗って最近pythonに興味を持った感じかな。
C系か古いJava系臭がするので、もっとpythonを使っている
意味のあるコーディングをするといいよ。
44: 1 2022/10/16(日)15:14 AAS
>>42
リンクやアドバイスありがとうございます
元々はコードが書ける仕事ならどの分野でもいいかなと思ってたんですが、
ちょっとしたゲームを練習で書いてる内に、ゲーム制作も楽しいんじゃないかと
思い始めました
メタプログラミング難しそうですね
45: 1 2022/10/16(日)15:18 AAS
>>43
いえいえ アドバイスありがとうございます
うーんまあPythonが一番流行りかなと思って始めました
大学の時に授業でCをやって、5年前くらいから最近までJavaをやってましたので
その影響かと思います
46(2): 2022/10/16(日)18:45 AAS
5年Javaやっててこれか。
M銀行案件でJavaといいつつノンプロ単純作業労働者してた?
47(1): 2022/10/16(日)19:22 AAS
匿名をいいことにそうやって馬鹿にするのやめなよ
48(1): 2022/10/16(日)21:51 AAS
馬鹿にしていると思うのは、お前自身が見下してるからだろ?
そうでなけりゃ馬鹿にされることという認識すらないはずだからな。
49: 1 2022/10/16(日)22:36 AAS
>>46
えーとですね、>>40にも書いた通り独学です
仕事は…世間でいう所の無職ですね
障害者施設に通っています
>>47-48
いや、社会に出ればどのみち厳しい評価は下るのですから、今からズバズバ
言ってくれた方が却って助かります
50: 2022/10/16(日)23:29 AAS
>>46
日本のIT職としては違和感ないコードだろw
もしかして自己評価高いタイプ?
51(1): 2022/10/16(日)23:53 AAS
えっ?趣味なら別にすきにすればって話だけど、業務でこれは追放レベルだろ
52: 2022/10/16(日)23:59 AAS
障害者が独学で趣味でやってるならこのレベルで十分でしょ。
別にこれでpython経験者を名乗ってフリーランスになろうって
言うんじゃないんだからムキになんなよ。
上下前次1-新書関写板覧索設栞歴
あと 30 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.017s