티스토리 뷰

학습

Java Card Game

shiningm 2012. 10. 25. 10:24
반응형

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
링크
«   2025/02   »
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
글 보관함