簡易撲克牌游戲【3個晚上2小時,暴力簡單?!?/h1>
用了3個晚上寫出來,在每個玩家選出最大的牌子里面糊涂了,導致自己找bug找了很久。其實名字一定要用心起好,才免于自己一直費時間找bug。代碼放上來,每個類都有一定的步驟解釋,各位一起交流下,一起進步!么么噠(*  ̄3)(ε ̄ *)
主要分三個大類:撲克牌、玩家、游戲(發牌、拿牌、比牌)
撲克牌創建:
package?com.imooc.season3.porkDemo;
import?java.util.ArrayList;
import?java.util.List;
/*
?*?創建撲克牌
?*?①創建一個撲克牌集合,利用List集合
?*?②創建一個數字數組,裝2,3...
?*?③創建一個花色數組,裝方片,梅花...
?*/
public?class?CardCreation?{
???????List<String>?cards?=?new?ArrayList<String>();
????
???? String[]?digits?=?{"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
???? String[]?col?={"方片","紅桃","梅花","黑桃"};
???? public?void?cardCreation(){
???? for(int?i=0;i<digits.length;i++){
???? for(int?y=0;y<col.length;y++){
???? String?tmp?=col[y]+digits[i];
???? cards.add(tmp);
???? }
???? }
????
????
???? }
???? public?void?cardShow(){
???? System.out.println("============撲克牌創建成功============");
???????? for(String?cards:cards){
???????? System.out.print(cards+"??");
???????? }
???????? System.out.println("");
???? }
}
//創建玩家
package?com.imooc.season3.porkDemo;
import?java.util.ArrayList;
import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
import?java.util.Scanner;
import?java.util.Set;
import?java.util.Map.Entry;
import?com.imooc.season3.CollectionDemo.Student;
/*
?*?創建游戲玩家
?*?①玩家具有ID,?昵稱,手中的牌的集合三個屬性
?*?②游戲設定為兩個玩家,并且ID具有異常捕捉
?*?
?*/
public?class?Players?{
int[]?playerID;
String?playerName;
Map<Integer,String>?player?;
public?Players(){
?playerID=new?int[2];??
?//要賦值必須初始化數組長度
?player?=new?HashMap<Integer,String>();
}
public?Players(int?playerID,String?playerName){
?player?=new?HashMap<Integer,String>();
?player.put(playerID,?playerName);
}
public?void??playerCreation(){
System.out.println("");
System.out.println("============創建玩家============");
for(int?i=0;i<2;i++){
while(true){
System.out.println("請輸入第"+(i+1)+"位玩家的ID");
Scanner?inputID?=new?Scanner(System.in);
try{
playerID[i]=inputID.nextInt();
}catch(Exception?e){
System.out.println("請輸入數字?。?!");
continue;
}
System.out.println("請輸入第"+(i+1)+"位玩家的姓名");
Scanner?inputName?=new?Scanner(System.in);
playerName=inputName.next();
player.put(playerID[i],?playerName);
break;
}
}
System.out.println("");
System.out.println("============創建玩家成功============");
System.out.println("");
System.out.println("玩家:"+"?");
Set<Entry<Integer,String>>?playerList?=player.entrySet();?//遍歷map的方法--》EntrySet
for(Entry<Integer,String>?playerls?:playerList?){
System.out.print(playerls.getKey()+":"+playerls.getValue());
System.out.println("");
}
}
public?void?pickCards(){
}
}
游戲(發牌、拿牌、比牌)
package?com.imooc.season3.porkDemo;
import?java.util.Collections;
import?java.util.HashMap;
import?java.util.Map;
import?java.util.Scanner;
import?java.util.Set;
import?java.util.Map.Entry;
import?com.imooc.season3.CollectionDemo.Student;
/*
?*?①發牌,打亂牌的循序,然后每個玩家拿到兩張牌
?*?②比牌
?*/
public?class?Game?{
public?Map<String,Players>?playersCard_v1;?//兩位玩家的牌--姓名加ID
public?Map<String,Players>?playersCard_v2;
int?playersCardHold;
Scanner?playerHold;
CardCreation?cardRule;?
CardCreation?cardSet?;
Players?players;
public?Game(CardCreation?cardSet?,Players?players){
playersCard_v1?=new?HashMap<String,Players>();
playersCard_v2?=new?HashMap<String,Players>();
this.cardSet=cardSet;
this.players=players;
}
public?void?pickCards(){
Collections.shuffle(cardSet.cards);??
//打亂該變量的撲克牌的順序,Randomly?permutes?the?specified?list?using?a?default?source?of?randomness.
??? while(true){
??? try{
????System.out.println("");
System.out.println("============請輸入每個玩家的持牌數============");
??? playerHold=new?Scanner(System.in);
??? playersCardHold?=playerHold.nextInt();?//輸入每個玩家可以持有的撲克牌數目,并捕捉異常
??? break;}
??? catch(Exception?e){
??? System.out.println("============輸入非數字,請重新輸入============");
??? continue;
??? }
??? }
???
??? for(int?i=0;i<playersCardHold;i++){?//玩家持牌數為2,則給每位玩家發牌2次
??? ????//兩個玩家,就是總共發兩輪(每輪發給兩個玩家一次)
??? String?tmpCard;??????????????
??? ?//創建臨時存儲撲克牌、玩家姓名和玩家ID的局部變量
??? int?tmpPlayerID;
??? String?tmpPlayerName;
???
??? tmpPlayerID=players.playerID[0];???
??? //第一個玩家拿牌
??? tmpPlayerName?=players.player.get(tmpPlayerID);
??? ????System.out.println("");
? ????System.out.println("==玩家"+tmpPlayerName+"拿牌==");
? ????tmpCard=cardSet.cards.get(i);
? ???cardSet.cards.remove(i);???????
? ??//玩家拿完牌要刪除這個牌,已經不存在在可抽取的牌里
? ????playersCard_v1.put(tmpCard,?new?Players(tmpPlayerID,tmpPlayerName));
? ???
? ???tmpPlayerID=players.playerID[1];???
? ???//第二個玩家拿牌
??? tmpPlayerName?=players.player.get(tmpPlayerID);
??? ????System.out.println("");
? ????System.out.println("==玩家"+tmpPlayerName+"拿牌==");
? ????tmpCard=cardSet.cards.get(i);
? ???cardSet.cards.remove(i);
? ????playersCard_v2.put(tmpCard,?new?Players(tmpPlayerID,tmpPlayerName));
???
??? }
????System.out.println("");
System.out.println("==玩家抽牌完畢==");
???
}
public?void?showCards(){
CardCreation?cardRule?=new?CardCreation();?
//重新new一個對象,指向一個新的位置
cardRule.cardCreation();????
?//牌的大小排好隊,需要比對位置。
String?player_v1Name=players.player.get(players.playerID[0]);??
//玩家v1名稱
String?player_v2Name=players.player.get(players.playerID[1]);?
//玩家v2名稱
?????
String?player_v1Card?=?null;
String?player_v2Card?=?null;
int?player_v1Index?=?0;
int?player_v2Index?=?0;
Set<Entry<String,Players>>?player_v1Set=playersCard_v1.entrySet();??//玩家1
Set<Entry<String,Players>>?player_v2Set=playersCard_v2.entrySet();??//玩家2
if(playersCardHold==1){??
//如果每個玩家持牌數為1,那么就只需要比對返回的Index值
????for(Entry<String,Players>?player_v1:player_v1Set){
???? ?player_v1Card=player_v1.getKey();??//拿到撲克牌的值
???? ?for(String?cardsForRule_v1:cardRule.cards){
???? ?if(cardsForRule_v1.equals(player_v1Card))??????????????????????????//這個撲克牌位于哪個位置
???? ?{player_v1Index?=cardRule.cards.indexOf(cardsForRule_v1);
???? ???break;} ??
?????????}
????}
????System.out.println("");
System.out.println("玩家"+player_v1Name+"拿到"+player_v1Card);
????for(Entry<String,Players>?player_v2:player_v2Set){
???? ?player_v2Card=player_v2.getKey();
???? ?for(String?cardsForRule_v2:cardRule.cards){
???? ?if(cardsForRule_v2.equals(player_v2Card))
???? ?{player_v2Index?=cardRule.cards.indexOf(cardsForRule_v2);
???? ???break;} ??
?????????}
????}
????System.out.println("");
System.out.println("玩家"+player_v2Name+"拿到"+player_v2Card);
}
//玩家持牌數大于2,則需要先對自己的牌進行比對,然后選出最大的進行比對
else{
String?tmpPlayer_v1Cards;??
//創建臨時變量,作為暫時存儲
String?tmpPlayer_v2Cards;
int?tmpPlayer_v1Index;
int?tmpPlayer_v2Index;
for(Entry<String,Players>?player_v1:player_v1Set){
??tmpPlayer_v1Cards=player_v1.getKey();??
??//拿到撲克牌的值
???? ?for(String?cardsForRule_v1:cardRule.cards){
???? ?if(cardsForRule_v1.equals(tmpPlayer_v1Cards))??//這個撲克牌位于哪個位置
???? ????{tmpPlayer_v1Index?=cardRule.cards.indexOf(cardsForRule_v1);
???? ???if(tmpPlayer_v1Index>player_v1Index){
???? ???player_v1Card=tmpPlayer_v1Cards;
???? ???player_v1Index=tmpPlayer_v1Index;??
???? ????????}
???? ???} ??
?????????}
}
System.out.println("");
System.out.println("玩家"+player_v1Name+"拿到的最大撲克牌為"+player_v1Card);
??for(Entry<String,Players>?player_v2:player_v2Set){
???? ?tmpPlayer_v2Cards=player_v2.getKey();
???? ?for(String?cardsForRule_v2:cardRule.cards){
???? ?if(cardsForRule_v2.equals(tmpPlayer_v2Cards))
???? ?{??tmpPlayer_v2Index?=cardRule.cards.indexOf(cardsForRule_v2);
???? ?if(tmpPlayer_v2Index>player_v2Index){
???? ???player_v2Index=tmpPlayer_v2Index;
???? ????player_v2Card=tmpPlayer_v2Cards;
???? ??????}
???? ???} ??
?????????}
????}
????System.out.println("");
System.out.println("玩家"+player_v2Name+"拿到的最大撲克牌為"+player_v2Card);
}
System.out.println("");
if(player_v1Index>player_v2Index){
System.out.println("玩家"+player_v1Name+"勝");
}else{
System.out.println("玩家"+player_v2Name+"勝");
}
System.out.println("");
System.out.print("玩家"+player_v1Name+"持牌:");
for(Entry<String,Players>?player_v1:player_v1Set){
System.out.print(player_v1.getKey());
??}
System.out.println("");
System.out.print("玩家"+player_v2Name+"持牌:");
for(Entry<String,Players>?player_v2:player_v2Set){
System.out.print(player_v2.getKey());
??}
}
}
//Main方法
package?com.imooc.season3.porkDemo;
import?java.util.Collections;
import?java.util.List;
public?class?GameDemo?{
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
CardCreation?cards?=new?CardCreation();?//初始化撲克牌
cards.cardCreation();??//創建撲克牌
cards.cardShow();
?
Players?players?=new?Players();???//初始化游戲玩家
players.playerCreation();?????//創建游戲玩家
Game?games?=new?Game(cards,?players);??//創建游戲變量games
games.pickCards();???//游戲玩家拿牌
games.showCards();
}
}
用了3個晚上寫出來,在每個玩家選出最大的牌子里面糊涂了,導致自己找bug找了很久。其實名字一定要用心起好,才免于自己一直費時間找bug。代碼放上來,每個類都有一定的步驟解釋,各位一起交流下,一起進步!么么噠(*  ̄3)(ε ̄ *)
主要分三個大類:撲克牌、玩家、游戲(發牌、拿牌、比牌)
撲克牌創建:
package?com.imooc.season3.porkDemo; import?java.util.ArrayList; import?java.util.List; /* ?*?創建撲克牌 ?*?①創建一個撲克牌集合,利用List集合 ?*?②創建一個數字數組,裝2,3... ?*?③創建一個花色數組,裝方片,梅花... ?*/ public?class?CardCreation?{ ???????List<String>?cards?=?new?ArrayList<String>(); ???? ???? String[]?digits?=?{"2","3","4","5","6","7","8","9","10","J","Q","K","A"}; ???? String[]?col?={"方片","紅桃","梅花","黑桃"}; ???? public?void?cardCreation(){ ???? for(int?i=0;i<digits.length;i++){ ???? for(int?y=0;y<col.length;y++){ ???? String?tmp?=col[y]+digits[i]; ???? cards.add(tmp); ???? } ???? } ???? ???? ???? } ???? public?void?cardShow(){ ???? System.out.println("============撲克牌創建成功============"); ???????? for(String?cards:cards){ ???????? System.out.print(cards+"??"); ???????? } ???????? System.out.println(""); ???? } }
//創建玩家 package?com.imooc.season3.porkDemo; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.List; import?java.util.Map; import?java.util.Scanner; import?java.util.Set; import?java.util.Map.Entry; import?com.imooc.season3.CollectionDemo.Student; /* ?*?創建游戲玩家 ?*?①玩家具有ID,?昵稱,手中的牌的集合三個屬性 ?*?②游戲設定為兩個玩家,并且ID具有異常捕捉 ?*? ?*/ public?class?Players?{ int[]?playerID; String?playerName; Map<Integer,String>?player?; public?Players(){ ?playerID=new?int[2];?? ?//要賦值必須初始化數組長度 ?player?=new?HashMap<Integer,String>(); } public?Players(int?playerID,String?playerName){ ?player?=new?HashMap<Integer,String>(); ?player.put(playerID,?playerName); } public?void??playerCreation(){ System.out.println(""); System.out.println("============創建玩家============"); for(int?i=0;i<2;i++){ while(true){ System.out.println("請輸入第"+(i+1)+"位玩家的ID"); Scanner?inputID?=new?Scanner(System.in); try{ playerID[i]=inputID.nextInt(); }catch(Exception?e){ System.out.println("請輸入數字?。?!"); continue; } System.out.println("請輸入第"+(i+1)+"位玩家的姓名"); Scanner?inputName?=new?Scanner(System.in); playerName=inputName.next(); player.put(playerID[i],?playerName); break; } } System.out.println(""); System.out.println("============創建玩家成功============"); System.out.println(""); System.out.println("玩家:"+"?"); Set<Entry<Integer,String>>?playerList?=player.entrySet();?//遍歷map的方法--》EntrySet for(Entry<Integer,String>?playerls?:playerList?){ System.out.print(playerls.getKey()+":"+playerls.getValue()); System.out.println(""); } } public?void?pickCards(){ } }
游戲(發牌、拿牌、比牌)
package?com.imooc.season3.porkDemo; import?java.util.Collections; import?java.util.HashMap; import?java.util.Map; import?java.util.Scanner; import?java.util.Set; import?java.util.Map.Entry; import?com.imooc.season3.CollectionDemo.Student; /* ?*?①發牌,打亂牌的循序,然后每個玩家拿到兩張牌 ?*?②比牌 ?*/ public?class?Game?{ public?Map<String,Players>?playersCard_v1;?//兩位玩家的牌--姓名加ID public?Map<String,Players>?playersCard_v2; int?playersCardHold; Scanner?playerHold; CardCreation?cardRule;? CardCreation?cardSet?; Players?players; public?Game(CardCreation?cardSet?,Players?players){ playersCard_v1?=new?HashMap<String,Players>(); playersCard_v2?=new?HashMap<String,Players>(); this.cardSet=cardSet; this.players=players; } public?void?pickCards(){ Collections.shuffle(cardSet.cards);?? //打亂該變量的撲克牌的順序,Randomly?permutes?the?specified?list?using?a?default?source?of?randomness. ??? while(true){ ??? try{ ????System.out.println(""); System.out.println("============請輸入每個玩家的持牌數============"); ??? playerHold=new?Scanner(System.in); ??? playersCardHold?=playerHold.nextInt();?//輸入每個玩家可以持有的撲克牌數目,并捕捉異常 ??? break;} ??? catch(Exception?e){ ??? System.out.println("============輸入非數字,請重新輸入============"); ??? continue; ??? } ??? } ??? ??? for(int?i=0;i<playersCardHold;i++){?//玩家持牌數為2,則給每位玩家發牌2次 ??? ????//兩個玩家,就是總共發兩輪(每輪發給兩個玩家一次) ??? String?tmpCard;?????????????? ??? ?//創建臨時存儲撲克牌、玩家姓名和玩家ID的局部變量 ??? int?tmpPlayerID; ??? String?tmpPlayerName; ??? ??? tmpPlayerID=players.playerID[0];??? ??? //第一個玩家拿牌 ??? tmpPlayerName?=players.player.get(tmpPlayerID); ??? ????System.out.println(""); ? ????System.out.println("==玩家"+tmpPlayerName+"拿牌=="); ? ????tmpCard=cardSet.cards.get(i); ? ???cardSet.cards.remove(i);??????? ? ??//玩家拿完牌要刪除這個牌,已經不存在在可抽取的牌里 ? ????playersCard_v1.put(tmpCard,?new?Players(tmpPlayerID,tmpPlayerName)); ? ??? ? ???tmpPlayerID=players.playerID[1];??? ? ???//第二個玩家拿牌 ??? tmpPlayerName?=players.player.get(tmpPlayerID); ??? ????System.out.println(""); ? ????System.out.println("==玩家"+tmpPlayerName+"拿牌=="); ? ????tmpCard=cardSet.cards.get(i); ? ???cardSet.cards.remove(i); ? ????playersCard_v2.put(tmpCard,?new?Players(tmpPlayerID,tmpPlayerName)); ??? ??? } ????System.out.println(""); System.out.println("==玩家抽牌完畢=="); ??? } public?void?showCards(){ CardCreation?cardRule?=new?CardCreation();? //重新new一個對象,指向一個新的位置 cardRule.cardCreation();???? ?//牌的大小排好隊,需要比對位置。 String?player_v1Name=players.player.get(players.playerID[0]);?? //玩家v1名稱 String?player_v2Name=players.player.get(players.playerID[1]);? //玩家v2名稱 ????? String?player_v1Card?=?null; String?player_v2Card?=?null; int?player_v1Index?=?0; int?player_v2Index?=?0; Set<Entry<String,Players>>?player_v1Set=playersCard_v1.entrySet();??//玩家1 Set<Entry<String,Players>>?player_v2Set=playersCard_v2.entrySet();??//玩家2 if(playersCardHold==1){?? //如果每個玩家持牌數為1,那么就只需要比對返回的Index值 ????for(Entry<String,Players>?player_v1:player_v1Set){ ???? ?player_v1Card=player_v1.getKey();??//拿到撲克牌的值 ???? ?for(String?cardsForRule_v1:cardRule.cards){ ???? ?if(cardsForRule_v1.equals(player_v1Card))??????????????????????????//這個撲克牌位于哪個位置 ???? ?{player_v1Index?=cardRule.cards.indexOf(cardsForRule_v1); ???? ???break;} ?? ?????????} ????} ????System.out.println(""); System.out.println("玩家"+player_v1Name+"拿到"+player_v1Card); ????for(Entry<String,Players>?player_v2:player_v2Set){ ???? ?player_v2Card=player_v2.getKey(); ???? ?for(String?cardsForRule_v2:cardRule.cards){ ???? ?if(cardsForRule_v2.equals(player_v2Card)) ???? ?{player_v2Index?=cardRule.cards.indexOf(cardsForRule_v2); ???? ???break;} ?? ?????????} ????} ????System.out.println(""); System.out.println("玩家"+player_v2Name+"拿到"+player_v2Card); } //玩家持牌數大于2,則需要先對自己的牌進行比對,然后選出最大的進行比對 else{ String?tmpPlayer_v1Cards;?? //創建臨時變量,作為暫時存儲 String?tmpPlayer_v2Cards; int?tmpPlayer_v1Index; int?tmpPlayer_v2Index; for(Entry<String,Players>?player_v1:player_v1Set){ ??tmpPlayer_v1Cards=player_v1.getKey();?? ??//拿到撲克牌的值 ???? ?for(String?cardsForRule_v1:cardRule.cards){ ???? ?if(cardsForRule_v1.equals(tmpPlayer_v1Cards))??//這個撲克牌位于哪個位置 ???? ????{tmpPlayer_v1Index?=cardRule.cards.indexOf(cardsForRule_v1); ???? ???if(tmpPlayer_v1Index>player_v1Index){ ???? ???player_v1Card=tmpPlayer_v1Cards; ???? ???player_v1Index=tmpPlayer_v1Index;?? ???? ????????} ???? ???} ?? ?????????} } System.out.println(""); System.out.println("玩家"+player_v1Name+"拿到的最大撲克牌為"+player_v1Card); ??for(Entry<String,Players>?player_v2:player_v2Set){ ???? ?tmpPlayer_v2Cards=player_v2.getKey(); ???? ?for(String?cardsForRule_v2:cardRule.cards){ ???? ?if(cardsForRule_v2.equals(tmpPlayer_v2Cards)) ???? ?{??tmpPlayer_v2Index?=cardRule.cards.indexOf(cardsForRule_v2); ???? ?if(tmpPlayer_v2Index>player_v2Index){ ???? ???player_v2Index=tmpPlayer_v2Index; ???? ????player_v2Card=tmpPlayer_v2Cards; ???? ??????} ???? ???} ?? ?????????} ????} ????System.out.println(""); System.out.println("玩家"+player_v2Name+"拿到的最大撲克牌為"+player_v2Card); } System.out.println(""); if(player_v1Index>player_v2Index){ System.out.println("玩家"+player_v1Name+"勝"); }else{ System.out.println("玩家"+player_v2Name+"勝"); } System.out.println(""); System.out.print("玩家"+player_v1Name+"持牌:"); for(Entry<String,Players>?player_v1:player_v1Set){ System.out.print(player_v1.getKey()); ??} System.out.println(""); System.out.print("玩家"+player_v2Name+"持牌:"); for(Entry<String,Players>?player_v2:player_v2Set){ System.out.print(player_v2.getKey()); ??} } } //Main方法 package?com.imooc.season3.porkDemo; import?java.util.Collections; import?java.util.List; public?class?GameDemo?{ public?static?void?main(String[]?args)?{ //?TODO?Auto-generated?method?stub CardCreation?cards?=new?CardCreation();?//初始化撲克牌 cards.cardCreation();??//創建撲克牌 cards.cardShow(); ? Players?players?=new?Players();???//初始化游戲玩家 players.playerCreation();?????//創建游戲玩家 Game?games?=new?Game(cards,?players);??//創建游戲變量games games.pickCards();???//游戲玩家拿牌 games.showCards(); } }
2016-02-12
?String?player_v1Name=players.player.get(players.playerID[0]);
這個代碼我有點繞暈了,能不能幫我解釋一下,謝謝!