大家好,我写了一个程序来模拟酒牌游戏国王。这是我的第三个 Java 项目
在我playGame()
的玩家轮流选择时,由getChoice()
GUI 处理有时(如 5% 的时间)会呈现一个具有正确标题但其他空白的 JPanel!为什么会这样?
图片:
游戏的解释在这里的代码注释框中:
/**
* @author :KyleMHB
* Project Number :0003
* Project Name :Kings
* IDE :NETBEANS
* Goal of Project -
* Kings is a rule based drinking game using cards for 4+ players.
* The Rules are read in from a rules.txt so that one can easily change the rules.
* How the game works:
* Players shuffle a deck of cards, place a glass between them and circle the
* cards around the base of the glass.
* The players then take turns picking cards, each card has its own rule associated to it.
* Most importantly, there are 4 Kings, each time a King is picked,
* the player who picked it can pour as much of his/her drink into the glass between
* them as they wish.
* The game ends when the fourth and final King is picked.
* The player to pick the final King must down the glass in the center of table.
*/
package kings;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javax.swing.JOptionPane;
public class Kings {
public static class Card {
private int rank, suit;
private String[] suits = { "Hearts", "Spades", "Diamonds", "Clubs" };
private String[] ranks = { "Ace", "2", "3", "4", "5", "6", "7", "8",
"9", "10", "Jack", "Queen", "King" };
Card(int suit, int rank){
this.rank=rank;
this.suit=suit;
}
public @Override String toString(){
return ranks[rank] + " of " + suits[suit];
}
public int getRank() {
return rank;
}
public int getSuit() {
return suit;
}
}
public static class Deck {
private static ArrayList<Card> cards;
Deck() {
cards=new ArrayList<Card>();
for (int a=0; a<=3; a++){
for (int b=0; b<=12; b++){
cards.add( new Card(a,b) );
}
}
Collections.shuffle(cards, new Random());
Collections.shuffle(cards, new Random(System.nanoTime()));
}
public Card drawFromDeck(){
return cards.remove( 0 );
}
public int getTotalCards(){
return cards.size();
}
}
private static List<String> rules;
public static void main(String[] args) throws FileNotFoundException, IOException {
setRules(new File("rules.txt"));
playGame(getNum("How many people are going to play","Number of Players"));
}
/**
* Rules are not hard-coded because people often have different ones,
* Therefore I made an easily editable rules.txt file.
* Also my rule file has formatting in using the \n,
* However when the file is read it is read as \ and n
* Hence why I used the replaceAll( "\\\\n","\n");
*/
private static void setRules(File f) throws FileNotFoundException, IOException {
rules = Files.readAllLines(f.toPath(), Charset.defaultCharset());
for(int i=0; i!=rules.size(); i++){
rules.set(i, rules.get(i).replaceAll( "\\\\n","\n"));
}
}
private static int getNum(String prompt,String title) {
return Integer.parseInt(JOptionPane.showInputDialog(null,prompt,title,3));
}
private static void playGame(int players) {
int playerTurn;
int choice;
int kings=0;
Card cardDrawn;
Deck deck=new Deck();
while(true){
playerTurn=0;
while (playerTurn!=players){
choice=getChoice("Player "+(playerTurn+1),
"Would you like to skip or draw?",
"Draw","Skip","Exit");
if (choice==0){
cardDrawn=deck.drawFromDeck();
System.out.println(cardDrawn);
kings+=showCard(cardDrawn,kings,playerTurn+1);
playerTurn++;
}
else if(choice==1)
playerTurn++;
else
System.exit(0);
}//Turn reset loop
}//continuous loop
}
private static int getChoice(String title, String prompt,
String a, String b, String c) {
Object[] options = { a, b, c};
return JOptionPane.showOptionDialog(null, prompt, title,0,2,
null,options,options[0]);
}
private static int showCard(Card a, int kings, int player) {
if(a.rank==12)
if(kings==3){
JOptionPane.showMessageDialog(null,
"Player "+player+" has Drawn the Final King\n\n"
+ "Restart the Program to Play again",a.toString(),1);
System.exit(0);
return 0;
}
else{
JOptionPane.showMessageDialog(null,"Player "+player+
" has drawn the "+a.toString()+"\n"
+ "Which is King "+(kings+1)+"/4\n\n"
+rules.get(a.rank),a.toString(),1);
return 1;
}
else{
JOptionPane.showMessageDialog(null,"Player "+player+
" has drawn the "+a.toString()+"\n\n"
+ rules.get(a.rank),a.toString(),1);
return 0;
}
}
}