CardDeck.java
上传用户:njled888
上传日期:2007-01-07
资源大小:29k
文件大小:4k
源码类别:

游戏

开发平台:

Java

  1. /*
  2.  * @(#)CardDeck.java Version 1.0 98/03/12
  3.  * 
  4.  * Copyright (c) 1998 by Huahai Yang
  5.  * 
  6.  * Use at your own risk. I do not guarantee the fitness of this 
  7.  * software for any purpose, and I do not accept responsibility for 
  8.  * any damage you do to yourself or others by using this software.
  9.  * This file may be distributed freely, provided its contents 
  10.  * are not tampered with in any way.
  11.  *
  12.  */
  13. import java.awt.*;
  14. import java.util.Vector;
  15. import java.lang.Math;
  16. /**
  17.  * A card deck, holds 52 cards, deal them and provides their solutions
  18.  * Runs as a thread to caculate solution.
  19.  */
  20. public class CardDeck extends DraggingImage implements Runnable
  21. {
  22.    Thread solutionThread;
  23.    SynchronizedVector [] solutions;
  24.       
  25.    Vector deck;
  26.    
  27.    int cardPointer;
  28.    
  29.    boolean clickable;
  30.    DraggingArea container;
  31.    
  32.    public CardDeck(int x, int y, Image image, DraggingArea container) 
  33.    {
  34.       super(x, y, image, container);
  35.       draggable = false;
  36.       clickable = true;
  37.       
  38.       deck = new Vector();
  39.       for(int i = 0; i < 52; i++)
  40.       {
  41.          deck.addElement(new Card(i, container.cardImages[i], container));
  42.       } // for
  43.       shuffle();
  44.       
  45.       solutionThread = new Thread(this, "Solution");
  46.       solutionThread.setPriority(Thread.MIN_PRIORITY); 
  47.       solutionThread.start();
  48. } // 4 param constructor
  49. public void setThreadPriority(int priority)
  50. {
  51.    if(solutionThread != null && solutionThread.isAlive())
  52.    {
  53.       solutionThread.setPriority(priority);
  54.    } //if   
  55. } //setThreadPriority
  56. /**
  57.  * Stop solution thread
  58.  */
  59. public void stop()
  60. {
  61.       if (solutionThread != null)
  62.       {
  63.          solutionThread.stop();
  64.          solutionThread = null;
  65.       } //if   
  66. } //stop
  67.    /**
  68.     * find solutions for all of the 13 deals
  69.     */
  70.    public void run()
  71.    {
  72.       int pointer = 0;
  73.       solutions = new SynchronizedVector [13];
  74.       
  75.       // initiate solutions
  76.       for(int i = 0; i < 13; i++)
  77.       {
  78.          solutions[i] = new SynchronizedVector(); 
  79.       } // for
  80.       
  81.       for(int i = 0; i < 13; i++)
  82.       {
  83.          // search solution
  84.          Solution sol = new Solution(
  85.             ( (Card)deck.elementAt(pointer++) ).getCardValue(),
  86.             ( (Card)deck.elementAt(pointer++) ).getCardValue(),
  87.             ( (Card)deck.elementAt(pointer++) ).getCardValue(),
  88.             ( (Card)deck.elementAt(pointer++) ).getCardValue() );
  89.          
  90.          // put solution sting in to a synchronized place, if the 
  91.          // solution is not yet available, its consumers
  92.          // have to wait
  93.          solutions[i].put( sol.getSolution() );
  94.       } // for      
  95.    } // run   
  96.    public void enableClick()
  97.    {
  98.       clickable = true;
  99.    } // enableClick
  100.    
  101.    public void disableClick()
  102.    {
  103.       clickable = false;
  104.    } // disableClick
  105.    
  106.    public boolean isClickable()
  107.    {
  108.       return clickable;
  109.    } // isClickable
  110.    
  111.    /**
  112.     * return a deal of four cards, 
  113.     * these four card are selected from head of the card deck
  114.     */
  115.    public Card [] deal()
  116.    {
  117.       Card [] cards = new Card [4];
  118.       
  119.       if(cardPointer == 52) return null;
  120.       
  121.       for(int i = 0; i < 4; i++)
  122.       {
  123.          cards[i] = (Card)deck.elementAt(cardPointer);
  124.          cardPointer++;
  125.          
  126.       } // for
  127.       return cards ;
  128.    } // deal 
  129.    
  130.    /**
  131.     * get number of current deal
  132.     */
  133.    public int currentDealNumber()
  134.    {
  135.       int deal = cardPointer / 4 - 1;
  136.       if(deal < 0) deal = 0;
  137.       return deal;
  138.    } // currentDealNumber   
  139.    
  140.    /**
  141.     * get current deal's solution
  142.     */
  143.    public Vector currentSolution()
  144.    {
  145.       // if solution not yet available, will wait here
  146.       return ( solutions[currentDealNumber()].get() );
  147.    } // currentSolution  
  148.    
  149.    /**
  150.     * rearrange order of cards and reset cardPointer to zero
  151.     */
  152.    public void shuffle()
  153.    {
  154.       Vector tmpDeck = new Vector();
  155.       int cardNumber = deck.size();
  156.       int pick;
  157.       
  158.       for(int i = cardNumber - 1; i >= 0; i--)
  159.       {
  160.          pick = (int)( Math.random() * i );
  161.          tmpDeck.addElement( deck.elementAt(pick) );
  162.          deck.removeElementAt(pick);
  163.       } // for
  164.       
  165.       deck = tmpDeck;
  166.       cardPointer = 0;
  167.    } // shuffle  
  168.    
  169. }// CardDeck