Реализация игры «Блэк Джек» с использованием графического интерфейса

Страницы работы

Фрагмент текста работы

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра автоматики и вычислительной техники

Курсовой проект

по теории и технологии программирования:

«Блэк Джек»

Выполнила студентка  группы 2081/1

Преподаватель:

Санкт-Петербург

2009

1.  Задание

Реализация игры «Блэк Джек» с использованием графического интерфейса.

В игре Блэк Джек игрок играет против дилера (то есть против казино). Задача игрока в Блэк Джек – набрать как можно больше очков, но не более 21. По Вашей просьбе, нажатием кнопки "Еще карту", дилер выдает Вам по одной карте до тех пор, пока Вы не решите, что Вам хватает очков.

2.  Текст программы

Листинг 1. Card.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

/**

* Класс воплощает абстракцию игральной карты.

* @author Pervakov

*/

public class Card {

/**

* Номинал карты.

*/

private Face face;

/**

* Масть карты.

*/

private Suit suit;

/**

* Конструктор класса - инициализирует масть и номинал карты.

* @param face Номинал карты.

* @param suit Масть карты.

*/

public Card ( Face face, Suit suit )

{

this.suit = suit;

this.face = face;

}

/**

* Метод возвращает номинал карты.

* @return Номинал карты.

*/

public Face getFace() {

return face;

}

/**

* Метод возвращает масть карты.

* @return Масть карты.

*/

public Suit getSuit() {

return suit;

}

/**

* Метод возвращает строку с номиналом и мастью карты.

* @return Значение карты.

*/

@Override

public String toString() {

return face.toString()+" "+suit.toString();

}

}

Листинг 2. Suit.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

/**

* Класс воплощает абстракцию масти карты.

* @author Pervakov

*/

public class Suit {

/**

* Название масти.

*/

private final String name;

/**

* Конструктор класса - инициализирует название масти.

* @param str Название масти.

*/

public Suit( String str )

{

name = str;

}

/**

* Метод возвращает название масти.

* @return Название масти.

*/

@Override

public String toString() {

return name;

}

/**

* Метод сравнивает масти.

* @param suit Масть с которой сравнивают.

* @return  true если масти одинаковые. false если - нет.

*/

public boolean equal( Suit suit )

{

return suit.name.equals(name);

}

}

Листинг 3. Face.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

/**

* Этот класс воплощает абстракцию номинала карты.

* @author Pervakov

*/

public class Face {

/**

* Значение номинала.

* При значениях от 2 до 10 соответствует таким же карточным номиналам.

* При значениях от 11 до 14 соответсвует номиналам карт * Валет, Дама, Король, Туз.

* Другие значения не предусмотрены.

*/

private final int value;

/**

* Конструктор класса - инициализирует значение номинала.

* @param vl Значение номинала.

*/

public Face( int vl )

{

value = vl;

}

/**

* Метод возвращает разницу между значениями текущего номинала

* и номинала face.

* @param face Номинал, чье значение вычитают.

* @return Разница значений номиналов.

*/

public int compare ( Face face )

{

return value - face.value;

}

/**

* Метод возвращает строку с названием номинала.

* @return Название номинала.

*/

@Override

public String toString() {

if ( value < 11 )

return ""+value;

else

switch( value )

{

case 11: return "Валет";

case 12: return "Дама";

case 13: return "Король";

case 14: return "Туз";

default: return "Джокер";

}

}

/**

* Метод возвращает значение номинала.

* @return Значение номинала.

*/

public int getValue()

{

return value;

}

}

Листинг 4. Faces.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

import java.util.Vector;

/**

* Класс в котором хранятся все существующие номиналы.

* @author Pervakov

*/

public class Faces {

/**

* Вектор всех номиналов.

*/

private final Vector<Face> faces = new Vector<Face>(13);

/**

* Конструктор по умолчанию.

* Инициализирует вектор номиналов.

*/

public Faces()

{

for ( int i = 0; i < 13; i++ )

faces.add(i, new Face(i+2));

}

/**

* Возвращает номинал по его индексации в векторе.

* Используется для перебора всех номиналов.

* @param i Индекс номинала в векторе.

* @return Номинал карты.

*/

public Face getFace( int i )

{

return faces.get(i);

}

/**

* Метод возвращает длину вектора - количество номиналов.

* @return Количество номиналов.

*/

public int length()

{

return faces.size();

}

}

Листинг 5. Suits.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

import java.util.Vector;

/**

* Класс в котором хранятся все существующие масти.

* @author Pervakov

*/

public class Suits {

/**

* Вектор всех мастей.

*/

private final Vector<Suit> suits = new Vector<Suit>(4);

/**

* Конструктор по умолчанию.

* Инициализирует вектор номиналов.

*/

public Suits()

{

suits.add(0, new Suit("Червы"));

suits.add(1,new Suit("Пик"));

suits.add(2, new Suit("Бубен"));

suits.add(3,new Suit("Треф"));

}

/**

* Возвращает масть по его индексации в векторе.

* Используется для перебора всех мастей.

* @param i Индекс масти в векторе.

* @return Масть карты.

*/

public Suit getSuit( int i )

{

return suits.get(i);

}

/**

* Метод возвращает длину вектора - количество мастей.

* @return Количество мастей.

*/

public int length()

{

return suits.size();

}

}

Листинг 6. Pack.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.pack;

import java.util.Random;

import java.util.Vector;

/**

*  Класс, содержащий в себе вектор всех карт. Абстракция колоды карт.

* @author Pervakov

*/

public class Pack {

/**

* Вектор карт.

*/

private Vector<Card> cards;

/**

* Номиналы карт.

*/

private Faces faces;

/**

* Масти карт.

*/

private Suits suits;

/**

* Конструктор инициализирует вектор карт.

* @param faces Номиналы карт.

* @param suits Масти карт.

*/

public Pack( Faces faces, Suits suits )

{

this.suits = suits;

this.faces = faces;

cards = new Vector<Card> ( faces.length() * suits.length());

for ( int i = 0; i < faces.length(); i++)

for ( int j = 0; j < suits.length(); j++ )

try{

cards.add( new Card( faces.getFace(i), suits.getSuit(j)));

}

catch( ArrayIndexOutOfBoundsException e )

{

System.err.println("i = "+ i+" j = "+j);

}

}

/**

* Конструктор копирования.

* @param pack Копируемая колода карт.

*/

public Pack ( Pack pack )//Конструктор копирования

{

cards = new Vector<Card>( pack.cards.size());

for ( int i = 0; i < pack.cards.size(); i++)

cards.add(i, pack.cards.get(i));

faces = pack.faces;

suits = pack.suits;

}

/**

* Метод возвращает случайную карту оставшуюся в колоде.

* При это карта изымается из колоды.

* @return Карта

*/

public Card getCard()

{

int x = new Random().nextInt(cards.size());

Card tmp = cards.get(x);

cards.remove(x);//Карта изымается из колоды

return tmp;

}

/**

* Метод возвращает карту по масти и номиналу.

* Если такая карта не нашлась возвращает null.

* @param face Номинал карты.

* @param suit Масть Карты.

* @return Карта.

*/

public Card getCard( Face face, Suit suit )//Метод возвращает карту по масти  и номиналу

{                                           //карта остаетсяв колоде

for ( Card card: cards )

if ( card.getFace() == face && card.getSuit() == suit )

return card;

return null;

}

/**

* Метод возвращает номиналы карт.

* @return Номиналы карт.

*/

public Faces getFaces() {

return faces;

}

/**

* Метод возвращает масти карт.

* @return Масти карт.

*/

public Suits getSuits() {

return suits;

}

}

Листинг 7. Hand.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.Hand;

import cards.blackjack.Owner;

import cards.pack.Card;

import java.util.Observable;

import java.util.Vector;

/**

* Абстрактный класс, реализует модель “руки” (всех карт в руке игрока).

* @author Pervakov

*/

public abstract class Hand extends Observable{//рука

/**

* Вектор карт в руке.

*/

protected Vector<Card> hand;//карты руки

/**

* Обладатель руки.

*/

private Owner player;//кому принадлежит

/**

* Конструктор инициализирует руку.

* @param player Обладатель руки.

* @param size Количество карт в руке.

*/

public Hand( Owner player, int size )

{

this.player = player;

hand = new Vector<Card>(size);

}

/**

* Метод добавляет карту в руку.

* @param card Добавляемая карта.

*/

public void addCard( Card card )

{

hand.add(card);

setChanged();//оповещает о том что рука изменилась

notifyObservers();//и грфика должна перерисоваться

}

/**

* Метод возвращает вектр карт в руке.

* Используется в GUI.

* @return Вектор всех карт в руке.

*/

public Vector<Card> getCards()

{

return hand;

}

/**

* Метод должен возвращать рейтинг руки.

* @return Рейтинг.

*/

abstract public int getRate();

/**

* Метод возвращает обладателя руки.

* @return Обладатель.

*/

public Owner getOwner() {

return player;

}

}

Листинг 8. BlackJackHand.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.Hand;

import cards.blackjack.Owner;

import cards.pack.Card;

/**

* Наследует класс Hand.

* @author Pervakov

*/

public class BlackJackHand extends Hand{//ркуа блэкджек

/**

* Конструктор.

* @param player Игрок.

*/

public BlackJackHand(Owner player)

{

super(player,2);

}

/**

* Метод должен возвращать рейтинг руки.

* В блэкджек возвращает количество очков.

* @return Рейтинг.

*/

@Override

public int getRate() {

int x = 0;

for ( Card card: hand )

{

if ( card.getFace().getValue() == 14 )

x +=11;

else

if ( card.getFace().getValue() > 10 )

x += 10;

else

x +=card.getFace().getValue();

}

return x;

}

}

Листинг 9. Owner.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Money;

/**

* интерфейс обладателя руки, то есть игрока.

* @author Pervakov

*/

public interface Owner {

/**

* Метод должен определять действия с банком для обладателя руки

* в случае выигрыша или ничьи.

* @param money Банк.

*/

public void takeMoney(Money money);

/**

* Метод возвращает имя обладателя руки.

* @return Имя обладателя руки.

*/

public String getName();

}

Листинг 10. Player.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Money;

/**

* Класс реализует интерфейс Owner. Представляет игрока.

* @author Pervakov

*/

public class Player implements Owner {

/**

* Имя игрока.

*/

private String name;

/**

* Количество денег игрока.

*/

private Money money;

/**

* Конструктор инициализирует имя и деньги игрока.

* @param name Имя игрока.

* @param money Деньги игрока.

*/

public Player( String name, Money money )

{

this.name = name;

this.money = money;

}

/**

* Метод должен определять действия с банком для обладателя руки.

* Количество денег игрока увеличивается.

* Если игрок выиграл, он получется банк.

* Если ничья - половину банка.

* Если проиграл ничего не получает.

* @param money Банк.

*/

public void takeMoney( Money money )

{

this.money.addMoney(money);

}

/**

* Метод определяет действия со счетом игрока.

* Когда игрок ставит определенную сумму.

* Она вычитывается из его счета.

* @param money Вычитываемая сумма.

*/

public void call( Money money )

{

this.money.subMoney(money);

}

public String getName() {

return name;

}

/**

* Метод возвращает количество денег игрока.

* @return Количество денег игрока.

*/

public Money getMoney() {

return money;

}

}

Листинг 11. Diler.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Money;

/**

* Класс реализует интерфейс Owner. Представляет дилера.

* @author Pervakov

*/

public class Diler implements Owner{

/**

* Метод должен определять действия с банком для обладателя руки.

* В моей версии у казино неограниченный запас денег.

* И дилер ничего не ставит, как ничего и не выигрывает.

* Тело метода пусто.

* @param money Банк.

*/

public void takeMoney(Money money) {}

/**

* Метод возвращает имя обладателя руки.

* @return  Имя обладателя руки.

* По умолчанию Дилер.

*/

public String getName()

{

return "Дилер";

}

}

Листинг 12. Session.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Hand.BlackJackHand;

import cards.Hand.Hand;

import cards.Money;

import cards.pack.Pack;

/**

* Класс представляет партию игры.

* @author Pervakov

*/

public class Session {

/**

* Колода карт.

*/

private Pack pack;//колода

/**

* Рука дилера.

*/

private Hand dilerHand;//рука дилера

/**

* Рука игрока.

*/

private Hand myHand;//рука игрока

/**

* Банк.

*/

private Money call;//ставка

/**

* Счетчик.

*/

private int count = -1;//счетчик

/**

* Коструктор инициализирует руки игроков.

* @param pack Колода карт.

* @param call Банк.

* @param player Игрок.

*/

public Session( Pack pack, Money call, Player player  )//конструктор

{

this.pack = new Pack (pack);

this.call = new Money( call.getValue()*2);//передается ставка игрока в банк поступает еще и ставка дилера

player.call(call);//у игрока вычитывается ставка

dilerHand = new BlackJackHand(new Diler());

dilerHand.addCard(this.pack.getCard());

myHand = new BlackJackHand(player);

myHand.addCard(this.pack.getCard());

myHand.addCard(this.pack.getCard());

}

/**

* Метод добавляющий карту игроку.

*/

public void moreCardForMe()

{

getMyHand().addCard(pack.getCard());

count--;

}

/**

* Метод добавляющий карту дилеру.

*/

public void moreCardForDiler()

{

dilerHand.addCard(pack.getCard());

}

/**

* Метод определяющий может ли игрок взять карту.

* @return true - может.

*/

public boolean isMoreCard()

{

if ( count == 0 )//если счетчик равне нулю то игроку не дается больше карт

return false;

return true;

}

/**

* Метод возвращающий банк.

* @return Банк.

*/

public Money getCall() {

return call;

}

/**

* Метод реализует возможность игры блэкджек удвоить ставку.

* При этом игрок должен взять еще одну карту из колоды.

* Больше карт взять не может, одна обязательна.

*/

public void doubleCall()

{

((Player)myHand.getOwner()).call( new Money(call.getValue()/2));//игрок удваивает ставку( вычитывается половина банка )

call = new Money( call.getValue()*2  );

count = 1;//счетчик сбрасывается на 1( можно взять только одну карту )

}

/**

* Метод возвращает результат партии.

* @return Результат партии.

*/

public Result getResult()//метод возвращает результат партии

{

if ( myHand.getRate() < 22 )//если у игрока не больше 21

while ( dilerHand.getRate() < myHand.getRate() )//дилер начинает брать карты себе пока не будет больше чем у игрока

{

moreCardForDiler();

if ( dilerHand.getRate() == 21 )

break;

}

return new Result(dilerHand, myHand, call);

}

/**

* Метод возвращает руку дилера.

* @return Рука дилера.

*/

public Hand getDilerHand() {

return dilerHand;

}

/**

* Метод возвращает руку игрока.

* @return Рука игрока.

*/

public Hand getMyHand() {

return myHand;

}

}

Листинг 13. Result.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Hand.Hand;

import cards.Money;

/**

* Класс инкапсулирующий в себе результаты одной партии.

* @author Pervakov

*/

public class Result {

/**

* Ссылка на победителя.

*/

private Owner winner = null;

/**

* Ссылка на проигравшего.

*/

private Owner loser = null;

/**

* Банк.

*/

private Money money;

/**

* Флаг ничьи.

* Если равен true, то ничья.

* Если - false, - ничьи нет.

*/

private boolean draw = false;

/**

* Конструктор инициализирует банк, победителя и проигравшего.

* Если ничья, то банк делится на два и выигрыш забирают оба.

* @param one Первая рука.

* @param two Вторая рука.

* @param money Банк.

*/

public Result( Hand one, Hand two, Money money )

{

int f = one.getRate();// рука первого игрока

int s = two.getRate();// рука второго игрока

if ( f == s || ( ( f > 21 ) && ( s > 21 ) ) )//если руки равны или превышают 21

{                                           //то ничья

draw = true;                //устанавливает флаг в true

winner = one.getOwner();

loser = two.getOwner();

this.money = new Money( money.getValue()/2);//ставка делится на два

}

else

{           //в противном случае

this.money = money;

if ( f > 21 )//если у первого игрока больше 21

winner = two.getOwner();//выиграл второй

else

if ( s > 21 )//если у второго игрока больше 21

winner = one.getOwner();//выиграл первый

else

if ( f > s )//если у первого больше очков

winner = one.getOwner();//выиграл первый

else//          в противном случае

winner = two.getOwner();    //выиграл второй

}

}

/**

* Метод возвращает победителя - обладателя руки.

* @return Победитель.

*/

public Owner getWinner() {

return winner;

}

/**

* Метод определяет свелась партия в ничью или нет.

* @return  true, если ничья.

*/

public boolean isDraw() {

return draw;

}

/**

* Метод разделяет банк между игроками.

*/

public void takePrize()

{

winner.takeMoney(money);//победитель получает приз

if ( draw ) //если ничья

loser.takeMoney(money); //то и проигравший получает приз

}

}

Листинг 14. Game.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.blackjack;

import cards.Money;

import cards.pack.Pack;

/**

* Класс реализующий игру – последовательность нескольких партий.

* @author Pervakov

*/

public class Game {//игра

/**

* Дилер.

*/

private Diler diler = new Diler();//дилер

/**

* Игрок.

*/

private Player player;//игрок

/**

* Колода карт.

*/

private Pack pack;//колода карт

/**

* Конструктор инициализирует игру.

* @param player Игрок.

* @param pack Колода карт.

*/

public Game( Player player, Pack pack )

{

this.player = player;

this.pack = pack;

}

/**

* Метод возвращает партию.

* @param call Банк.

* @return Партия.

*/

public Session newGame( Money call )// новая игра выозвращает партию

{

return  new Session(pack,new Money( call.getValue()), getPlayer());

}

/**

* Метод возвращает игрока.

* @return Игрок.

*/

public Player getPlayer() {

return player;

}

/**

* Метод возвращает колоду.

* @return Колода карт.

*/

public Pack getPack() {

return pack;

}

}

Листинг 15. GUIBlackJack.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import cards.Money;

import cards.blackjack.Game;

import cards.blackjack.Session;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JSpinner;

import javax.swing.SpinnerNumberModel;

/**

* Главная панель.

* @author Pervakov

*/

public class GUIBlackJack extends JPanel {

/**

* GUI-Партия.

*/

private GUISession session;

/**

* GUI-Колода.

*/

private GUIPack pack;

/**

* Деньги игрока.

*/

private JLabel money;

/**

* Спиннер для ввода ставки.

*/

private JSpinner spin = new JSpinner( new SpinnerNumberModel(100, 100, 50000, 100));

/**

* Кнопка новой игры.

*/

private JButton newGame;

/**

* Игра.

*/

private Game game;

/**

* Конструктор.

* @param pack GUI-Колода.

* @param game Игра.

*/

public GUIBlackJack( GUIPack pack, Game game )

{

this.pack = pack;

money = new JLabel(game.getPlayer().getMoney().toString());

this.game = game;

newGame = new JButton("Новая игра");

setVisible(true);

add( newGame);

add(money);

add(spin);

setLayout(null);

newGame.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

newSession();

}

});

myResize(getBounds());

}

/**

* Метод обновляющий информацию о деньгах.

*/

public void update()

{

money.setText(game.getPlayer().getMoney().toString());

}

/**

* Вспомогательный метод. Меняет границы данного элемента.

* @param rectangle Устанавливаемые границы.

*/

public void myResize( Rectangle rectangle )

{

setBounds(rectangle);

if ( session != null )

session.myResize( new Rectangle( 0, 0 , rectangle.width, 4*rectangle.height /5) );

spin.setBounds(rectangle.width/13, 4*rectangle.height/5+rectangle.height/25, 3*rectangle.width/13, 3*rectangle.height/25);

money.setBounds(5*rectangle.width/13, 4*rectangle.height/5+rectangle.height/25, 3*rectangle.width/13, 3*rectangle.height/25);

newGame.setBounds(8*rectangle.width/13, 4*rectangle.height/5+rectangle.height/25, 3*rectangle.width/13, 3*rectangle.height/25);

spin.repaint();

}

/**

* Метод запускающий новую партию.

*/

public void newSession()

{

if ( game.getPlayer().getMoney().getValue() < (Integer) spin.getValue())

{

if ( game.getPlayer().getMoney().getValue() <= 0 )

newGame.setEnabled(false);

}

else

if ( session == null )

{

session = new GUISession(pack, new Session(game.getPack(),new Money((Integer) spin.getValue()), game.getPlayer()));

add(session);

myResize(getBounds());

}

else

session.init(game.newGame(new Money((Integer) spin.getValue())));

update();

}

}

Листинг 16. GUISession.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import cards.blackjack.Result;

import cards.blackjack.Session;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JPanel;

/**

* Класс представляет собой графический интерфейс одной партии для пользователя.

* @author Pervakov

*/

public class GUISession extends JPanel{

/**

* GUI-рука дилера.

*/

private GUIHand dilerHand;

/**

* GUI-рука игрока.

*/

private GUIHand myHand;

/**

* GUI-Банк.

*/

private JLabel call;

/**

* Кнопка реализующая функцию удвоить ставку.

*/

private JButton doubleCall;

/**

* Кнопка реализующая функцию закончить ход.

*/

private JButton endTurn;

/**

* Кнопка реализующая функцию взять еще одну карту из колоды.

*/

private JButton moreCard;

/**

* Партия.

*/

private Session session;

/**

* Конструктор.

* @param pack Отображение изображений по картам.

* @param session Партия.

*/

public GUISession( GUIPack pack, Session session )

{

this.session = session;

dilerHand = new GUIHand(pack, session.getDilerHand());

myHand = new GUIHand(pack, session.getMyHand());

call = new JLabel("Ставка: " + session.getCall());

doubleCall = new JButton("Удвоить");

moreCard = new JButton("Еще карту");

endTurn = new JButton("Закончить");

setLayout(null);

setVisible(true);

updateButtons();

add(dilerHand);

add(endTurn);

add(myHand);

add(call);

add(doubleCall);

add(moreCard);

}

/**

* Метод вызывается когда начинается следующая партия.

* @param session Партия.

*/

public void init(Session session)

{

setEnabledButtons(true);

this.session = session;

myHand.setHand(session.getMyHand());

dilerHand.setHand(session.getDilerHand());

call.setText("Ставка: " + session.getCall());

}

/**

* Метод включает или выключает все кнопки.

* @param x

*/

public void setEnabledButtons(boolean x)

{

doubleCall.setEnabled(x);

endTurn.setEnabled(x);

moreCard.setEnabled(x);

}

/**

* Вспомогательный метод. Меняет границы данного элемента.

* @param rectangle Устанавливаемые границы.

*/

public void myResize( Rectangle rectangle )

{

setBounds(rectangle);

dilerHand.myResize(new Rectangle( rectangle.width/6, rectangle.height/20, 2*rectangle.width/3,3*rectangle.height/10));

call.setBounds(rectangle.width/6, 7*rectangle.height/20 ,2*rectangle.width/3,rectangle.height/20);

myHand.myResize(new Rectangle( rectangle.width/6, 8*rectangle.height/20, 2*rectangle.width/3,3*rectangle.height/10));

doubleCall.setBounds(rectangle.width/6, 4*rectangle.height/5, 2*rectangle.width/9, rectangle.height/5);

moreCard.setBounds(rectangle.width/6 + 2*rectangle.width/9, 4*rectangle.height/5, 2*rectangle.width/9, rectangle.height/5);

endTurn.setBounds(rectangle.width/6 + 4*rectangle.width/9,  4*rectangle.height/5, 2*rectangle.width/9, rectangle.height/5);

}

/**

* Метод "обновляет" кнопки.

*/

public void updateButtons()

{

doubleCall.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

session.doubleCall();

doubleCall.setEnabled(false);

endTurn.setEnabled(false);

call.setText("Ставка: " + session.getCall());

((GUIBlackJack)getParent()).update();

}

});

moreCard.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

session.moreCardForMe();

endTurn.setEnabled(true);

if ( !session.isMoreCard())

moreCard.setEnabled(false);

}

});

endTurn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

Result res = session.getResult();

if ( res.isDraw() )

call.setText("Ничья");

else

call.setText("Выиграл "+ res.getWinner().getName());

res.takePrize();

setEnabledButtons(false);

((GUIBlackJack)getParent()).update();

}

});

}

}

Листинг 17. GUICard.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Rectangle;

import javax.swing.JPanel;

/**

* Класс рисует изображение карты.

* @author Pervakov

*/

public class GUICard extends JPanel{

/**

* Изображение карты.

*/

Image image;

/**

* Конструктор.

* @param image Изображение карты.

*/

public GUICard( Image image)

{

this.image = image;

setVisible(true);

setLayout(null);

}

/**

* Вспомогательный метод. Меняет границы данного элемента.

* @param rectangle Устанавливаемые границы.

*/

public void myResize(Rectangle rectangle)

{

setBounds(rectangle);

}

@Override

public void paint(Graphics g) {

super.paint(g);

g.drawImage(image, 0, 0, getWidth(), getHeight(), this);

}

}

Листинг 18. GUIPack.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import cards.pack.Card;

import java.awt.Image;

import java.util.HashMap;

/**

* Класс представляет отображение изображений по картам.

* @author Pervakov

*/

public class GUIPack {

/**

* Отображение

*/

private HashMap<Card,Image> cards;

/**

* Конструктор.

* @param card Отображение.

*/

public GUIPack( HashMap<Card,Image> card)

{

cards = card;

}

/**

* Метод возвращает изображение по карте.

* @param card Карта.

* @return Изображение.

*/

public Image getGUI( Card card )

{

return cards.get(card);

}

}

Листинг 19. GUIHand.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import cards.Hand.Hand;

import cards.pack.Card;

import java.awt.Color;

import java.awt.Rectangle;

import java.util.Observable;

import java.util.Observer;

import java.util.Vector;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.border.LineBorder;

/**

* Класс рисует руку игрока.

* @author Pervakov

*/

public class GUIHand extends JPanel implements Observer{

/**

* Рука.

*/

private Hand hand;

/**

* Отображение изображений по картам.

*/

private GUIPack pack;

/**

* Вектор изображений карт.

*/

private Vector<GUICard> cards = new Vector<GUICard>();

/**

* Конструктор.

* @param pack Отображение изображений по картам.

* @param hand Рука.

*/

public GUIHand( GUIPack pack, Hand hand )

{

this.pack = pack;

//        setBorder( new LineBorder( Color.BLACK));

setHand(hand);

setLayout(null);

setVisible(true);

}

/**

* Метод перезаполняет вектор изображений.

*/

public void update()

{

Vector<Card> x = hand.getCards();

cards = new Vector<GUICard>();

removeAll();

for ( Card card: x )

cards.add( new GUICard( pack.getGUI(card)));

for ( int i = cards.size() - 1; i > -1; i--)

add(cards.get(i));

myResize(getBounds());

}

/**

* Метод устанавливает руку.

* @param hand Рука.

*/

public void setHand( Hand hand )

{

this.hand = hand;

hand.addObserver(this);

update();

}

/**

* Вспомогательный метод. Меняет границы данного элемента.

* @param rectangle Устанавливаемые границы.

*/

public void myResize( Rectangle rectangle )

{

setBounds(rectangle);

if ( cards.size() != 1 )

for ( int i = cards.size() - 1; i > -1; i-- )

cards.get(i).myResize( new Rectangle( i*( rectangle.width - rectangle.height*35/54)/(cards.size() - 1), 0, rectangle.height*35/54, rectangle.height ));

else

cards.get(0).myResize( new Rectangle( 0, 0, rectangle.height*35/54, rectangle.height ));

repaint();

}

public void update(Observable o, Object arg) {

update();

repaint();

}

}

Листинг 20. ManagerResources.java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package cards.GUI;

import cards.pack.Card;

import cards.pack.Face;

import cards.pack.Pack;

import cards.pack.Suit;

import java.awt.Image;

import java.io.File;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.HashMap;

import javax.swing.ImageIcon;

/**

* Менеджер ресурсов.

* Инициализирует GUI-Pack.

* @author Pervakov

*/

public class ManagerResources {

/**

* Отображение.

*/

private HashMap<Card,Image> icons = new HashMap<Card, Image

Похожие материалы

Информация о работе