티스토리 뷰
Java 연습 겸 작성한 간단한 클래스 구현이다.
문제 상황은 다음과 같다.
2명의 플레이어가 존재하고, 카드는 Spade와 Heart, 2종류만 존재하고, 각각의 모양은 A,2,3,4,...,10,Jack,Queen,King, 이렇게 13단계의 숫자로 구성되어있다. 즉, 총 26장의 카드가 존재한다.
각 플레이어의 전체 카드를 무작위로 1/2씩 나누어 갖는다.
게임이 시작되면 각 플레이어가 자신의 카드 중 무작위로 한장을 내고 이때 제출된 카드의 숫자를 비교해서 더 높은 숫자의 카드를 낸 플레이어가 이긴다. 만약 카드의 숫자가 같다면 이때는 Spade를 낸 플레이어가 이기게 된다.
카드의 숫자가 높은 순서로 명확하게 나열하면 다음과 같다.
"A > King > Queen > Jack > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2" (좌측이 더 높은 카드이다.)
카드를 제출할 때 마다 승자가 결정되고 이때 더 많이 승리한 플레이어가 최종 우승자이다.
이를 위해 main() 메소드를 포함한 class 외에 3개의 class를 선언했다. 전체 class 구성은 다음과 같다.
카드게임 실행 class
public class RunCardGame {
static int num_of_players;
static int num_of_card_shape;
static String[] set_of_shape;
public static void main(String[] args){
num_of_players = 2;
num_of_card_shape = 2;
set_of_shape = new String[num_of_card_shape];
set_of_shape[0] = "Spade";
set_of_shape[1] = "Heart";
//객체 선언
Dealer dealer;
Player[] players = new Player[num_of_players];
Card[] cardset = new Card[13*num_of_card_shape];
int winner;
//dealer 생성
dealer = new Dealer(num_of_players, num_of_card_shape);
//player 생성
dealer.constructPlayer(players);
//card 생성
dealer.constructCardSet(cardset, set_of_shape);
//card 분배
dealer.distributeCards(players);
//game 실행
System.out.println("Player1 \tPlayer2 \tDecision");
winner = dealer.runGame(players, cardset);
System.out.println("Player "+(winner+1)+" has won the game.");
}
}
Dealer class
class Dealer{
int num_of_players;
int num_of_card_shape;
int power_of_player[];
String shape_of_player[];
String cardnum_of_player[];
Dealer(int _num_of_players, int _num_of_card_shape){
num_of_players = _num_of_players;
num_of_card_shape = _num_of_card_shape;
power_of_player = new int[num_of_players];
shape_of_player = new String[num_of_card_shape];
cardnum_of_player = new String[num_of_players];
}
void constructPlayer(Player[] _players){
for(int i=0; i<2; i++){
_players[i] = new Player(num_of_players, num_of_card_shape);
_players[i].resetUsed();
}
}
void constructCardSet(Card[] _cardset, String[] set_of_shape){
for(int i=0; i<num_of_card_shape; i++){
for(int j=0; j<13; j++){
_cardset[i*13+j] = new Card(set_of_shape[i], j+1);
}
}
}
void distributeCards(Player[] _players){
int target_player;
for(int i=0; i<13*num_of_card_shape; i++){
while(true){
target_player = targetPlayer(num_of_players);
if(_players[target_player].number_of_cards < 13*num_of_card_shape/num_of_players){
break;
}
}
_players[target_player].setCard(i);
}
}
int targetPlayer(int num_of_player){
int result;
result=(int)(Math.random()*num_of_player);
return result;
}
int runGame(Player[] players, Card[] cardset){
int winner = 0;
int index;//플레이어가 낼 카드의 번호(카드에 적힌 숫자가 아니라 플레이어의 카드집합에서의 순번)
int total_num_of_cards;
int num_of_cards_per_player;
int[] count = new int[num_of_players];
total_num_of_cards = 13 * num_of_card_shape;
num_of_cards_per_player = total_num_of_cards / num_of_players;
for(int i=0; i<num_of_cards_per_player; i++){
//매 게임 시작 시 승리자를 첫 번째 플레이어로 초기화
winner = 0;
for(int j=0; j<num_of_players; j++){
while(true){
index = (int)(Math.random() * num_of_cards_per_player);
if(!players[j].isUsed[index]){
players[j].setUsed(index);
break;
}
}
power_of_player[j] = cardset[players[j].getCard(index)].getPower();
cardnum_of_player[j] = cardset[players[j].getCard(index)].getNumber();
shape_of_player[j] = cardset[players[j].getCard(index)].getShape();
if(j != 0){
if(power_of_player[j] > power_of_player[winner]){
winner = j;
}
}
}
count[winner]++;
for(int j=0; j<num_of_players; j++){
System.out.print(shape_of_player[j]+" "+cardnum_of_player[j]);
System.out.print(" \t");
}
System.out.print("Player "+(winner+1)+" wins");
System.out.println();
}
return winner;
}
}
Player class
class Player{
int[] cardset;
Boolean[] isUsed;
int number_of_cards;
Player(int num_of_players, int num_of_shape){
cardset = new int[13*num_of_shape/num_of_players];
isUsed = new Boolean[13*num_of_shape/num_of_players];
}
void setUsed(int index){
isUsed[index] = true;
}
void resetUsed(){
for(int i=0; i<isUsed.length; i++){
isUsed[i] = false;
}
}
void setCard(int _number){
cardset[number_of_cards] = _number;
number_of_cards++;
}
int numberOfCards(){
int num = number_of_cards;
return num;
}
int getCard(int index){
return cardset[index];
}
}
Card class
class Card{
String shape;
int number;
int power;
Card(String _shape, int _number){
shape = _shape;
number = _number;
if(number == 1){
power = 13 * 4;
}
else{
power = (number - 1) * 4;
}
if(shape == "Spade"){
power += 3;
}
else if(shape == "Diamond"){
power += 2;
}
else if(shape == "Clover"){
power += 1;
}
}
int getPower(){
return power;
}
String getNumber(){
String _number = null;
if(number == 1){
_number = "Ace";
}
else if(number <= 10){
_number = String.valueOf(number);
}
else if(number == 11){
_number = "Jack";
}
else if(number == 12){
_number = "Queen";
}
else if(number == 13){
_number = "King";
}
return _number;
}
String getShape(){
return shape;
}
}
- Total
- Today
- Yesterday
- Mosel
- windows 7
- 다운로드
- 백업
- OneNote
- 그림
- 비스타
- 단어
- 전설
- 정리
- 최적화
- 공부
- NDL
- 만화
- 프로그래밍
- 논문
- Term
- 오류
- 영어
- Optimization
- ap
- 유비더스
- 폴더
- 원노트
- Vista
- 보안
- Excel
- java
- Flex
- 스캔
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |