ðãã©ã³ãã§åŠã¶ïŒãªããžã§ã¯ãæåããã°ã©ãã³ã°å ¥éïŒC#ãµã³ãã«ä»ãïŒ
- 1. ð¯ ã¯ããã«
- 2. ð§ ãã®èšäºã§åŠã¹ãããš
- 3. 1. ã¯ã©ã¹ïŒã«ãŒããšããèšèšå³
- 4. 2. å®ç©ãäœãïŒã€ã³ã¹ã¿ã³ã¹çæ
- 5. 3. ãžã§ãŒã«ãŒã®è¿œå ïŒç¶æ¿ã®æŽ»çš
- 6. 4. å šäœã®ããããäœãïŒListã§ç®¡çïŒ
- 7. 5. ããªã¢ãŒãã£ãºã ïŒå ±éã®åã§ãŸãšããŠåŠç
- 8. 6. Deckã¯ã©ã¹ã§åœ¹å²åé¢ïŒSRPïŒ
- 9. 7. å¿çšïŒFaceCard ã AceCard ãæŽŸçã¯ã©ã¹ã§è¡šçŸ
- 10. ð ãŸãšã
- 11. ð¡ ããããã®åŠç¿ã¹ããã
- 12. ð ãããžã§ã¯ãæ§æïŒåèïŒ
- 13. ð æåŸã«
ð¯ ã¯ããã«
ãªããžã§ã¯ãæåïŒOOPïŒã¯ãããã°ã©ãã³ã°ã®éèŠãªèãæ¹ã§ãããåå¿è ã«ã¯ãæœè±¡çã§ããããããªãããšæããããã¡ã§ãã
ããã§æ¬èšäºã§ã¯ã誰ããç¥ã£ãŠããããã©ã³ããã顿ã«ããŠãã¯ã©ã¹ã»ã€ã³ã¹ã¿ã³ã¹ã»ç¶æ¿ã»ããªã¢ãŒãã£ãºã ãªã©ã®OOPã®æŠå¿µããå®éã«ã³ãŒããåãããªããçè§£ããŠãããŸãã

ð§ ãã®èšäºã§åŠã¹ãããš
- ã¯ã©ã¹ãšã€ã³ã¹ã¿ã³ã¹ã®é¢ä¿ïŒèšèšå³ãšå®ç©ïŒ
- ç¶æ¿ã®èãæ¹ïŒãžã§ãŒã«ãŒã¯ç¹æ®ãªã«ãŒãïŒ
- ããªã¢ãŒãã£ãºã ïŒå ±éåã§ç°ãªãæ¯ãèãïŒ
- å®è·µçãªOOPèšèšïŒDeckã¯ã©ã¹ã衚瀺åŠçïŒ
- å¿çšïŒFaceCardãAceCardã®å®è£ ãã¯ã©ã¹åé¢
ãããžã§ã¯ãåãDeckBuilder
1. ã¯ã©ã¹ïŒã«ãŒããšããèšèšå³
class Card
{
public string Suit { get; set; } // â , â¥, âŠ, â£
public int Number { get; set; } // 1ã13
public virtual void Show()
{
Console.WriteLine($"{Suit} ã® {Number}");
}
}
- Card ã¯ããã©ã³ãã®1æãã®èšèšå³
- ãŸã ãã®æç¹ã§ã¯å®ç©ã¯ååšããªã
2. å®ç©ãäœãïŒã€ã³ã¹ã¿ã³ã¹çæ
Card card1 = new Card { Suit = "â ", Number = 1 };
Card card2 = new Card { Suit = "âŠ", Number = 13 };
- card1 ã card2 ã¯ã¯ã©ã¹ããäœãããå®äœïŒã€ã³ã¹ã¿ã³ã¹ïŒ
- 52æçæããã°ããã©ã³ã1çµã宿
3. ãžã§ãŒã«ãŒã®è¿œå ïŒç¶æ¿ã®æŽ»çš
class Joker : Card
{
public bool IsBlack { get; set; }
public override void Show()
{
string color = IsBlack ? "é»" : "èµ€";
Console.WriteLine($"{color}ãžã§ãŒã«ãŒ");
}
}
- Joker 㯠Card ãç¶æ¿ããç¬èªããããã£ãšåäœã远å
- å ±éç¹ã掻ããã€ã€ãç¹æ®ãªæ¯ãèããå®è£ ã§ãã
4. å šäœã®ããããäœãïŒListã§ç®¡çïŒ
List<Card> deck = new List<Card>();
string[] suits = { "â ", "â¥", "âŠ", "â£" };
// éåžžã«ãŒã52æ
foreach (var suit in suits)
{
for (int i = 1; i <= 13; i++)
deck.Add(new Card { Suit = suit, Number = i });
}
// ãžã§ãŒã«ãŒ2æ
deck.Add(new Joker { IsBlack = true });
deck.Add(new Joker { IsBlack = false });
5. ããªã¢ãŒãã£ãºã ïŒå ±éã®åã§ãŸãšããŠåŠç
foreach (var card in deck)
{
card.Show(); // Jokerã§ãCardã§ãOK
}
- Card åã§ãŸãšããããŠããã®ã«ãå®éã«ã¯äžèº«ã«å¿ã㊠Show() ã®åäœãåãæ¿ãã
- ãããããªã¢ãŒãã£ãºã ïŒå€æ æ§ïŒ
6. Deckã¯ã©ã¹ã§åœ¹å²åé¢ïŒSRPïŒ
class Deck
{
private List<Card> cards = new List<Card>();
public Deck()
{
string[] suits = { "â ", "â¥", "âŠ", "â£" };
foreach (var suit in suits)
{
for (int i = 1; i <= 13; i++)
cards.Add(new Card { Suit = suit, Number = i });
}
cards.Add(new Joker { IsBlack = true });
cards.Add(new Joker { IsBlack = false });
}
public void Shuffle()
{
var rnd = new Random();
cards = cards.OrderBy(c => rnd.Next()).ToList();
}
public Card Draw()
{
if (cards.Count == 0) return null;
var top = cards[0];
cards.RemoveAt(0);
return top;
}
public int Count => cards.Count;
}
OrderBy(c => Guid.NewGuid()) ã®ã©ã ãåŒ c => Guid.NewGuid() ã¯ãèŠçŽ c ãåãåããã®ã® ç¡èŠ ããŠæ¯åæ°ãã GUID ãçæããããããœãŒãããŒãšããŠè¿ã颿°ã§ãã
以äžã®ãããªæµãã§ã·ã£ããã«ïŒã©ã³ãã äžŠã¹æ¿ãïŒãå®çŸãããŸãã
- ããŒã®çæ
- OrderBy ã¯å éšã§ã·ãŒã±ã³ã¹ã®åèŠçŽ ã«ããŒãïŒåãã€èšç®ããŸãã
- ããã§ã¯èŠçŽ ããšã«Â Guid.NewGuid() ãåŒã°ãã128ãããã®ã»ãŒäžæãªå€ïŒGUIDïŒãçæãããã
- ãœãŒãåŠç
- çæããã GUID ããæé ãã§æ¯èŒããèŠçŽ ãäžŠã¹æ¿ããã
- GUID ã¯ã©ã³ãã æ§ãé«ããããçµæãšããŠå ã®é åºãšã¯é¢ä¿ã®ãªãã©ã³ãã ãªäžŠã³é ãšãªãã
- çµæã®ç¢ºå®
- ToList() ãåŒã³åºããšãäžŠã¹æ¿ãåŸã®ã·ãŒã±ã³ã¹ã List<T> ã«ã³ããŒãããã·ã£ããã«æžã¿ã®ãªã¹ããåŸãããã
var shuffled = cards
.OrderBy(c => Guid.NewGuid()) // åèŠçŽ ã«ã©ã³ãã 㪠GUID ãå²ãåœãŠãŠãœãŒã
.ToList(); // çµæããªã¹ãå
ãã€ã³ã
- GUID ã®äžææ§
- Guid.NewGuid() ã¯ã»ãŒéè€ããªãå€ãçæãããããããŒã®è¡çªïŒéè€ïŒã極ããŠèµ·ããã«ããã
- å®è£
ã®ç°¡æœã
- ä»ã®ã·ã£ããã«å®è£ ïŒFisherâYates ãªã©ïŒãšæ¯ã¹ãŠã³ãŒããã·ã³ãã«ã
- ã³ã¹ã
- GUID ã®çæã³ã¹ã ïŒ ãœãŒãåŠçïŒO(n log n)ïŒããããããã倧éèŠçŽ ã§ã¯ããéãã
ãŸãšã
c => Guid.NewGuid() ãããŒã»ã¬ã¯ã¿ã«æž¡ãããšã§ãåèŠçŽ ã«ãŠããŒã¯ãã€ã©ã³ãã ãªããŒãå²ãåœãŠããã®ããŒã§ãœãŒãããââã€ãŸã ç°¡æçã«ã·ã£ããã« ããããªãã¯ãšããŠãã䜿ãããŸãã
ããã©ãŒãã³ã¹éèŠãªã FisherâYates ã¢ã«ãŽãªãºã ïŒO(n)ïŒãæ€èšããŠã¿ãŠãã ããã
ã©ã³ãã ãœãŒãïŒã·ã£ããã«ïŒãšã¯ããªã¹ããªã©ã®èŠçŽ ãâã©ã³ãã ãªé åºâã«äžŠã¹æ¿ããæäœã§ããLINQ ã® OrderBy ãæŽ»çšããæ¹æ³ãããå€å žç㪠FisherâYates ã¢ã«ãŽãªãºã ãŸã§ã代衚çãªææ³ããŸãšããŠè§£èª¬ããŸãã
1. LINQïŒä¹±æ°ããŒã§ã®ã·ã£ããã«
1.1 rnd.Next() ãããŒã«äœ¿ã
var rnd = new Random();
cards = cards
.OrderBy(c => rnd.Next()) // åèŠçŽ ããšã«ä¹±æ°ãããŒãšããŠçæ
.ToList();
- ä»çµã¿
- èŠçŽ ããšã«Â rnd.Next() ãåŒã³åºãããã®è¿ãå€ïŒ0 以äžã®ä¹±æ°ïŒããœãŒãããŒã«ãã
- ãœãŒãåŠçïŒO(n log n)ïŒã«ãã£ãŠäžŠã¹æ¿ã
- ã¡ãªããïŒãã¡ãªãã
- ç°¡æœã«æžãã
- ä¹±æ°ããŒãéè€ããå¯èœæ§ãããïŒãšã¯ããåãã¯å°ããïŒ
- 倧éèŠçŽ ã ãšãœãŒãã³ã¹ããé«ã
1.2 Guid.NewGuid() ãããŒã«äœ¿ã
cards = cards
.OrderBy(c => Guid.NewGuid()) // æ¯åæ°èŠ GUID ãçæããŠããŒã«ãã
.ToList();
- ä»çµã¿
- ã©ã ãåŒÂ c => Guid.NewGuid() ã¯èŠçŽ Â c ãç¡èŠããŠãäžæãª GUIDããæ¯åè¿ã
- GUID ã¯ã»ãŒéè€ããªããããããŒè¡çªãã»ãŒèµ·ãã匷åã«ã·ã£ããã«
- ã¡ãªããïŒãã¡ãªãã
- ã³ãŒããæãã·ã³ãã«
- GUID çæã³ã¹ãïŒãœãŒãã³ã¹ãïŒO(n log n)ïŒãããã
- å°ãäžèŠæš¡ã®ãªã¹ãã§ããã°å®çšç
2. ã€ã³ããã¯ã¹åãã·ã£ããã«ããŠåæ§ç¯
var rnd = new Random();
var indices = Enumerable.Range(0, cards.Count)
.OrderBy(_ => rnd.Next()) // éè€ãªãã®ã€ã³ããã¯ã¹ããœãŒã
.ToArray();
cards = indices
.Select(i => cards[i]) // ã·ã£ããã«æžã¿ã€ã³ããã¯ã¹é ã«èŠçŽ ãåãåºã
.ToList();
- ä»çµã¿
- 0,1,2âŠÂ ãšãã£ããŠããŒã¯ãªã€ã³ããã¯ã¹åãçæ
- ãã®åãã©ã³ãã ããŒã§ãœãŒã â éè€ã®ãªãã·ã£ããã«
- å ãªã¹ããã€ã³ããã¯ã¹æå®ã§åé 眮
- ã¡ã¢ãªïŒäžéã®ã€ã³ããã¯ã¹é åãå¿ èŠ
- ã³ã¹ãïŒO(n log n)
3. FisherâYatesïŒKnuthïŒã¢ã«ãŽãªãºã
var rnd = new Random();
for (int i = cards.Count - 1; i > 0; i--)
{
int j = rnd.Next(i + 1); // 0 ïœ i ã®ç¯å²ã§ã©ã³ãã
var tmp = cards[i];
cards[i] = cards[j];
cards[j] = tmp;
}
- ä»çµã¿
- ãªã¹ãã®æ«å°Ÿããé ã«ãã©ã³ãã ã«éžãã åæ¹ã®èŠçŽ ãšäº€æããŠãã
- ç¹åŸŽ
- èšç®é O(n)ïŒäžåºŠã®èµ°æ»ã§å®äº
- ã€ã³ãã¬ãŒã¹ïŒè¿œå ã¡ã¢ãªäžèŠïŒ
- åçã§åãã®å°ãªãã·ã£ããã«
4. æ¯èŒãŸãšã
æ¹æ³ | å®è£ ã®ç°¡åã | æéèšç®é | ã¡ã¢ãªäœ¿çšé | ã·ã£ããã«å質 |
---|---|---|---|---|
OrderBy(rnd.Next()) | â â â | O(n log n) | äž | è¯ |
OrderBy(Guid.NewGuid()) | â â â | O(n log n) | äž | éåžžã«è¯ã |
ã€ã³ããã¯ã¹åïŒOrderBy | â â | O(n log n) | äž | è¯ |
FisherâYates | â â | O(n) | äœïŒã€ã³ãã¬ãŒã¹ïŒ | éåžžã«è¯ã |
5. éžã³æ¹ã®ãã€ã³ã
- ç°¡æœãéèŠÂ â OrderBy(Guid.NewGuid())
- ããã©ãŒãã³ã¹éèŠÂ â FisherâYatesïŒå€§éèŠçŽ ããªã¢ã«ã¿ã€ã æ§ãå¿ èŠãªå ŽåïŒ
- ã¡ã¢ãªãã¬ãŒããªã â ã€ã³ããã¯ã¹åæ¹åŒã¯äžéé åã蚱容ã§ãããªããã
çšéãããŒã¿èŠæš¡ã«å¿ããŠãäžèšã®ããããã䜿ãåããŠã¿ãŠãã ããã
䜿çšäŸ
Deck deck = new Deck();
deck.Shuffle();
for (int i = 0; i < 5; i++)
{
var card = deck.Draw();
card?.Show();
}
- 責任ã®åé¢ïŒã«ãŒããšãããã¯å¥ã®ã¯ã©ã¹ïŒ
- ãã·ã£ããã«ããé åžããªã©ã®æ©èœã¯ Deck åŽã«éçŽ
7. å¿çšïŒFaceCard ã AceCard ãæŽŸçã¯ã©ã¹ã§è¡šçŸ
class FaceCard : Card
{
public string Face { get; set; }
public override void Show()
{
Console.WriteLine($"{Suit} ã® {Face}ïŒãã§ã€ã¹ã«ãŒãïŒ");
}
}
class AceCard : Card
{
public override void Show()
{
Console.WriteLine($"{Suit} ã® AïŒãšãŒã¹ïŒ");
}
}
ãããäœææã«äœ¿ãåãã
for (int i = 1; i <= 13; i++)
{
if (i == 1)
cards.Add(new AceCard { Suit = suit, Number = i });
else if (i >= 11)
{
string face = i switch
{
11 => "J", 12 => "Q", 13 => "K", _ => ""
};
cards.Add(new FaceCard { Suit = suit, Number = i, Face = face });
}
else
{
cards.Add(new Card { Suit = suit, Number = i });
}
}
ð ãŸãšã
OOPçšèª | ãã©ã³ãã®æ¯å© |
---|---|
ã¯ã©ã¹ | ã«ãŒãã®èšèšå³ïŒSuitãšNumberïŒ |
ã€ã³ã¹ã¿ã³ã¹ | å®éã®ã«ãŒã1æ |
ç¶æ¿ | Joker ã FaceCard ãªã©ã®ç¹æ®ã«ãŒã |
ãªãŒããŒã©ã€ã | Show() ã®åäœãããããã®ã«ãŒãã§å€æŽ |
ããªã¢ãŒãã£ãºã | å ±éå Card ãšããŠãŸãšããŠæ±ãã |
責任åé¢ | Deck ã¯ã©ã¹ã«é åžãã·ã£ããã«ãåé¢ |
ð¡ ããããã®åŠç¿ã¹ããã
- Cardã¯ã©ã¹ â Jokerã¯ã©ã¹ â List管çïŒOOPå ¥éïŒ
- Deckã¯ã©ã¹å°å ¥ â æ©èœã®åé¢ïŒèšèšåã®åºç€ïŒ
- FaceCardã»AceCard â 倿 æ§ãšèšèšæ¡åŒµ
- å¿çšïŒããæããç¥çµè¡°åŒ±ãªã©ç°¡åãªã«ãŒãã²ãŒã ãžçºå±
ð ãããžã§ã¯ãæ§æïŒåèïŒ
TrumpOOP/
âââ Program.cs // ã¡ã€ã³åŠç
âââ Card.cs // åºæ¬ã«ãŒã
âââ Joker.cs // ç¶æ¿äŸ
âââ FaceCard.cs // ç¶æ¿ + ãªãŒããŒã©ã€ã
âââ AceCard.cs // ç¶æ¿ + è¡šç€ºå€æŽ
âââ Deck.cs // ããã管ç
âââ TrumpOOP.csproj
ð æåŸã«
ãã¯ã©ã¹ã£ãŠäœã®ããã«ããã®ïŒã
ãç¶æ¿ã£ãŠæ¬åœã«å¿ èŠïŒã
ãããªçåãæã€äººã«ãããããã©ã³ããããã°ã©ã ã§åçŸããŠã¿ããããšã¯ãOOPã®æ¬è³ªãâèªåã®æâã§æãã絶奜ã®ãã£ã³ã¹ã§ãã
ã«ãŒã1æãããã·ã¹ãã å šäœã®æ§æãžã
ã·ã³ãã«ãªäžçã«ããªããžã§ã¯ãæåã®ãã¹ãŠãè©°ãŸã£ãŠããŸãã
ãã£ã¹ã«ãã·ã§ã³
ã³ã¡ã³ãäžèЧ
ãŸã ãã³ã¡ã³ãããããŸãã