76 lines
1.8 KiB
Dart
76 lines
1.8 KiB
Dart
// packages/feature_game_spider/lib/models/spider_card.dart
|
|
|
|
/// 카드의 4가지 무늬
|
|
enum SpiderSuit {
|
|
spade, // ♠️
|
|
heart, // ♥️
|
|
club, // ♣️
|
|
diamond // ♦️
|
|
}
|
|
|
|
/// 스파이더 카드 1장의 데이터 모델
|
|
class SpiderCard {
|
|
/// 카드의 고유 ID (Draggable 위젯의 Key로 사용)
|
|
final int id;
|
|
|
|
/// 무늬 (spade, heart 등)
|
|
final SpiderSuit suit;
|
|
|
|
/// 숫자 (1 = A, 11 = J, 12 = Q, 13 = K)
|
|
final int rank;
|
|
|
|
/// 현재 앞면이 보이는지 여부
|
|
bool isFaceUp;
|
|
|
|
/// [UI용] 카드가 현재 드래그 중인지 여부
|
|
bool isBeingDragged;
|
|
|
|
SpiderCard({
|
|
required this.id,
|
|
required this.suit,
|
|
required this.rank,
|
|
this.isFaceUp = false,
|
|
this.isBeingDragged = false,
|
|
});
|
|
|
|
/// 카드가 빨간색(하트, 다이아)인지 확인
|
|
bool get isRed => suit == SpiderSuit.heart || suit == SpiderSuit.diamond;
|
|
|
|
/// 랭크를 텍스트(A, K, Q, J, 10...)로 변환
|
|
String get rankText {
|
|
switch (rank) {
|
|
case 1: return 'A';
|
|
case 11: return 'J';
|
|
case 12: return 'Q';
|
|
case 13: return 'K';
|
|
default: return rank.toString();
|
|
}
|
|
}
|
|
|
|
/// 무늬를 심볼(♠️, ♥️...)로 변환
|
|
String get suitSymbol {
|
|
switch (suit) {
|
|
case SpiderSuit.spade: return '♠️';
|
|
case SpiderSuit.heart: return '♥️';
|
|
case SpiderSuit.club: return '♣️';
|
|
case SpiderSuit.diamond: return '♦️';
|
|
}
|
|
}
|
|
|
|
// 객체 비교를 위한 == 및 hashCode 오버라이드
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
other is SpiderCard &&
|
|
runtimeType == other.runtimeType &&
|
|
id == other.id; // 고유 ID로만 비교
|
|
|
|
@override
|
|
int get hashCode => id.hashCode;
|
|
|
|
/// 디버깅용
|
|
@override
|
|
String toString() {
|
|
return '$rankText-$suitSymbol ($id)';
|
|
}
|
|
} |