---
title: GitHub Copilot, GitHub Copilot Chat でポーカーを作成してみる
tags:  #.net #github copilot  
author: [Tomohiro Suzuki](https://convert.docswell.com/user/hiro128_777)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/D7YV1NVY7M.jpg?width=480
description: 賢い IntelliSense として、GitHub Copilot, GitHub Copilot Chat でポーカーを作成してみたレポートです
published: November 29, 23
canonical: https://convert.docswell.com/s/hiro128_777/5YWLXD-2023-11-29-105909
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/D7YV1NVY7M.jpg)

GitHub Copilot, GitHub Copilot
Chat でポーカーを作成してみる
Tomohiro Suzuki
@hiro128_777
2023-11-30
C# Tokyo


# Page. 2

![Page Image](https://bcdn.docswell.com/page/VENM2XMRJ8.jpg)

自己紹介
鈴木友宏
M365、Azure、Power Platform、.NET などの Microsoft
製品を用いたシステムの構築をしています。
Twitter：@hiro128_777
blog：https://hiro128.hatenablog.jp/
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/Y79N18NZ73.jpg)

アジェンダ
① GitHub Copilot, GitHub Copilot Chat でポーカーをつくってみたレポート
② まとめ
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/G78K48NYJD.jpg)

本日のゴール
① 賢い IntelliSense として、GitHub Copilot, GitHub Copilot Chat を利
用した開発のイメージを掴む
② より良い提案を得るためのヒントを得る
• Copilot, Copilot Chat の使い分けを含む、全体的な進め方
• プロンプトの文面
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L7LZ6RP9ER.jpg)

前提条件
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4EMV5R4VEW.jpg)

ご注意
① この資料では、賢い IntelliSense として、GitHub Copilot, GitHub Copilot
Chat を利用しています。（ほかの使い方もあります）
② GitHub Copilot, GitHub Copilot Chat に限らず AI はあえてブレが出るように
なっているので、この資料と同じプロンプトを投入しても必ずしも同じ結果になる
とは限りません
③ 手作業の修正は最小限とし、なるべく提案されたコードをそのまま使うようにし
ており、コード自体のベストプラクティスにはこだわっていません。
④ Copilot, Copilot Chat の使い分けは一例であって、唯一の正解ではありませ
ん。
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/PER23RWW79.jpg)

準備作業、アプリの要件
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/P7XD4RPVJX.jpg)

Visual Studio の拡張機能を確認
以下の3つがインストールされてなければインストールする
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/37KXZRD5JD.jpg)

ソリューションとプロジェクトの構成
コンソールアプリ（.NET8）
xUnit テスト
今回テストまでは話せないので、
無くてもよいです。
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LJ35D8R175.jpg)

アプリの要件
•
•
•
•
最低限度の機能を持ったポーカーのコンソールアプリ
カードの交換は1回
想定手順は、手札配布→保持するカードの選択→カード交換→役の判定
例外のハンドリングはしない
ポーカーを題材にした理由
well-known な題材のため、GitHub Copilot 側の学習量に依存せず、純粋に Copilot, Copilot
Chat の挙動を確認できると予想した。
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/8JDDPMYKJG.jpg)

ここから、アプリ作成
1


# Page. 12

![Page Image](https://bcdn.docswell.com/page/VEPXNR63J8.jpg)

トランプのカードのクラスを作成
1


# Page. 13

![Page Image](https://bcdn.docswell.com/page/27VLKR3NEQ.jpg)

トランプのカードのクラスを作成
クラス定義だけ提案された
1


# Page. 14

![Page Image](https://bcdn.docswell.com/page/5JGXQM357L.jpg)

トランプのカードのクラスを作成
期待通りでなければ、詳細を再入力
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/47Q8KR5LEP.jpg)

アメリカを再び強くするっっっ！
？？？これは….www
プロンプトがよくなかった….
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/KE42P89571.jpg)

トランプのカードのクラスを作成
気を取り直して、解像度が高いプロンプトを投入
ただし、プロンプトの解像度を高めるには、開発経験がないと難しい
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/L71M92K2JG.jpg)

トランプのカードのクラスを作成
今度はいい感じ！！
大〇領ではなく
トランプのカードが実装されていそう
Card.cs が
生成されている
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/G7W3QRD272.jpg)

ポイント①
プロンプトは Copilot が誤解しないように
解像度高く記述する
1


# Page. 19

![Page Image](https://bcdn.docswell.com/page/4JZVWRG473.jpg)

トランプのカードのクラスを作成
いったん、Card クラスはここまでにして次に進む
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/YE65GRYGJV.jpg)

Dealer のクラスを作成
先ほどの教訓を生かし、実装するメソッドの仕様も含めるなど解像度高く書いてみる
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/GE5YV8GXE4.jpg)

Dealer のクラスを作成
指示通りのクラスとメソッドが実装されている。
Visual Studio の不具合なのか提案されたコードの全体が
見れないので、いったん承諾して、詳しく実装を見てみる
Dealer.cs が
生成されている
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/972G3KYQ7R.jpg)

Dealer のクラスを作成
エラーがある。enum Suit が参照できていない。
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/DJYV1NGYJM.jpg)

Dealer のクラスを作成
この程度のエラーであれば、
手動で enum のスコープを
変更した方が早い
エラーが消えた
手作業はちょいちょい必要になる
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/V7NM2XGRE8.jpg)

ポイント②
細かい修正は手動も組み合わせるとよい
2


# Page. 25

![Page Image](https://bcdn.docswell.com/page/YJ9N18WZJ3.jpg)

Dealer のクラスを作成
カードの数字のプロパティが異なっている。
• Dealer では enum Rank
• Card では int
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/GJ8K48RYED.jpg)

Dealer のクラスを作成
当該の箇所を削除し Enter で
Copilot に提案させてみる
Card の実装を参照して、
適切なコードを提案してくる
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/LJLZ6RK97R.jpg)

Player のクラスを作成
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/47MV5R2V7W.jpg)

Player のクラスを作成
いい感じのようだ
Visual Studio の不具合なのか全体が見れないので
いったん承諾して、詳しく実装を見てみる
Player.cs が
生成されている
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/P7R23RMWJ9.jpg)

Player のクラスを作成
メソッド名に齟齬がありエラーが出ているので、手作業で修正する。
Player
Dealer
エラー
エラーが消えた
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/PJXD4RVVEX.jpg)

Card のクラスの ToString() を修正
試しに、人間に寄せた表現にしてみたが、
文脈を汲んで適切な提案をしてきた
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/3JKXZRQ5ED.jpg)

Player のクラスの ShowHand() を修正
気にいらなければ別の実装も選べる
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/LE35D8P1J5.jpg)

役判定のクラスを作成
Copilot Chat だとロジックが実装
されていない提案しかされない
こういう場合、いったん承諾して、
Copilot に提案させる
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/8EDDPMLKEG.jpg)

役判定のクラスを作成
実装を削除し、コメントも書かず、 Enter で
Copilot に提案させてみる
よさげな実装が提案されたが…
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/V7PXNR23E8.jpg)

役判定のクラスを作成
途中で切れている
切れているメソッドの実装を削除して再度
Enter で提案させる
これ以降が切れている
（チャンクの制限と思われる）
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/2JVLKRDN7Q.jpg)

役判定のクラスを作成
Ctrl + Alt + Enter で全ての提案を確認すると、未実装のメソッドを含め、
続きが提案された。もし、また途中で切れているので何度か繰り返す
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/5EGXQMY5JL.jpg)

役判定のクラスを作成
細かいエラーは Copilot にやらせるのも面倒なので手動で修正。
public にする
public にする
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/4JQ8KRML7P.jpg)

Program.cs を実装する
ここからが Copilot の本領発揮！
ある程度実装が進んで、判断
材料がそろえば、Enter だけで、
コメントも実装も提案される
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/K742P8V5J1.jpg)

Program.cs を実装する
文脈が揃ってくると、Enterだけで、コメント、実装がどんどん進む
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/LJ1M9232EG.jpg)

Program.cs を実装する
ちょいちょい間違えるので、そこは手作業で修正
コンストラクタのパラメーターはないので手作業で削除
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/GJW3QRP2J2.jpg)

Program.cs を実装する
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/4EZVWRK4J3.jpg)

Program.cs を実装する
初期配布された手札を標示するところまで進ん
だので、いったんデバッグ実行してみる
41


# Page. 42

![Page Image](https://bcdn.docswell.com/page/Y765GRQGEV.jpg)

Program.cs を実装する
デバッグ実行すると文字化けしている
→Suit が「？」になる
文字コードの問題なので修正する
トラブルシューティングも提案された！
文字化けしなくなった
42


# Page. 43

![Page Image](https://bcdn.docswell.com/page/G75YV8RX74.jpg)

ポイント③
簡単なトラブルシューティングなら
発生現象と期待値を投入すれば提案される
4


# Page. 44

![Page Image](https://bcdn.docswell.com/page/9J2G3KDQJR.jpg)

Player クラスに Hold() を実装する
44


# Page. 45

![Page Image](https://bcdn.docswell.com/page/DEYV1N2YEM.jpg)

Player クラスに Hold() を実装する
45


# Page. 46

![Page Image](https://bcdn.docswell.com/page/VJNM2X8R78.jpg)

Card クラスに IsHeld プロパティを実装
46


# Page. 47

![Page Image](https://bcdn.docswell.com/page/YE9N18KZE3.jpg)

Program.cs を実装する
47


# Page. 48

![Page Image](https://bcdn.docswell.com/page/GE8K482Y7D.jpg)

Dealer にカードをチェンジするメソッドを実装
48


# Page. 49

![Page Image](https://bcdn.docswell.com/page/LELZ6R29JR.jpg)

Player に Hand を実装
既存の hand フィールドと衝突して、いい感じに修
正できないので手作業で修正
49


# Page. 50

![Page Image](https://bcdn.docswell.com/page/4JMV5R8VJW.jpg)

Player に Hand を実装
プロパティを修正すれば、残りは提案してくれる
50


# Page. 51

![Page Image](https://bcdn.docswell.com/page/PJR23R5WE9.jpg)

Player に Hand を実装
51


# Page. 52

![Page Image](https://bcdn.docswell.com/page/PEXD4RKV7X.jpg)

Player に HandType を実装
52


# Page. 53

![Page Image](https://bcdn.docswell.com/page/3EKXZR557D.jpg)

完成
※テストをしていないので、バグがあるかもしれません。
テストも Copilot で実装できますが、長くなったのでそれはまたの機会に。
53


# Page. 54

![Page Image](https://bcdn.docswell.com/page/L735D8K1E5.jpg)

まとめ
① 現時点で実用性は十分
② well-known な領域には圧倒的に強く、ニッチな領域は弱めなので、基盤領域は Copilot に任せプロダクトの価値へ直接
寄与する独自ロジックにリソースを集中できる
③ （Copilot が文脈を理解するためのパラメーターとなる）コード量が少ない開発の初期段階では Copilot Chat を利用した
方が、意図通りのコードが提案されやすく、実装が進むにつれてパラメーターが増えるので Copilot の提案の精度が向上す
る。
④ Copilot に文脈を理解させるためにエンティティ→ロジックの順で実装するのがおすすめ
⑤ プロンプトの解像度によって提案の精度が大きく変わるため、（特に開発の初期段階では）ある程度提案してほしいコー
ドを想定したプロンプトを投入する必要がある
⑥ 簡単なトラブルシューティングなら発生現象と期待値を投入すれば提案される
⑦ 納得のいく提案が出ない場合、Copilot Chat, と Copilot を切り替えて試すとよい提案を引き出せる可能性が高い
⑧ 英語に強いので命名で悩んだ時の参考には非常に役立つ
⑨ コード全体を俯瞰してエキスパートの開発者が満足できるレベルでの一貫性のあるコードの提案はできない。たとえば、for or
foreach, LINQ に寄せる、その他細かい書きっぷりにまでこだわりたいなら細かくプロンプトで指示するか、ある程度手動で
修正が必要（たぶん将来的に精度は上がって解決する）
54


# Page. 55

![Page Image](https://bcdn.docswell.com/page/87DDPM3K7G.jpg)

ご清聴ありがとうございました


