翻牌模拟器 | Java
一、翻牌配對小游戲
1、玩家數量:2-4名。
2、需要道具:兩兩成對的牌若干。
3、游戲規則:游戲開始前,將牌洗亂,然后全部背面朝上放置在平面上。游戲開始后,每個人每次翻開兩張牌,如果兩張牌匹配,就可以把它們收走,否則要把兩張牌翻回去。直至所有的牌都被拿走,此時統計每名玩家手中牌的數量,牌數多者為勝。
二、UNO
UNO是一種風靡全世界的常見桌游。玩家需在出剩最后1張牌時喊出”UNO“,故而得名。
博主寫文于2023年1月24日,正是春節期間。
家里十分熱鬧,小孩很多,我常常帶著他們一起玩各種游戲,包括但不限于藏與找東西、撲克牌、UNO、和平精英、穿越火線槍戰王者、我的世界、飛行棋、卡坦拓荒、狼人殺等。是的,我剛剛提到了UNO。
23日晚上,我從UNO中去除了四張+4牌,兩張改顏色牌,四張0牌,剩下98張牌。
我用這98張牌和他們玩翻牌配對的游戲。
這場大學生與初中生、小學生的比拼中,大學生取得了徹頭徹尾的勝利,但大學生不滿足于此。
當天晚上躺在床上,這個大學生的腦中,思考的是如何使用他的專業知識來設計一個翻牌游戲。
三、大學生的陰謀
其實這個大學生最初的目的不是完全設計出一個完整的翻牌游戲。
平日里他和善近人,是一個孩子王。誰知道,他是一個徹徹底底的陰謀家!
原來,他的目的是設計出翻牌游戲的版面。
他知道,只要提升了自己的記憶力,提升自己對游戲記憶的敏感程度,他就可以取得勝利!完完全全的勝利!!!
他太渴望勝利了(即使他玩這個游戲就沒有輸過),過去是,現在是,將來也是。
他的陰謀就是偷偷設計出模擬游戲情景的版面,然后用此來訓練自己的記憶力,日后好一舉擊破他可憐的弟弟妹妹表弟表妹們脆弱不堪的心理防線!!!
理論存在,思路清晰,實踐開始。
四、實現過程
1、生成牌組
按照上述提到的內容,首先要生成98張牌。代碼如下:
public static String[] uno = new String[98]; public static char[] color = {'紅','黃','藍','綠'}; public static char[] number = {'1','2','3','4','5','6','7','8','9','轉','禁','加'};public static void GenerateCards(){int k=-1;for (int i=0; i<4; i++) {for (int j=0; j<12; j++) {k++;uno[k] = color[i] + String.valueOf(number[j]);k++;uno[k] = uno[k-1];}}uno[96] = "改"; uno[97] = "改";}其中,“轉”對應的是反轉牌,“禁”對應的是禁止牌,“加”對應的是+2牌,“改”對應的是改顏色牌。
2、洗牌
最初我嘗試生成1個隨機數n(0≤n≤97),然后利用
for (int i=0; i<97; i++) {shuffle[i] = uno[i*n%97]; } shuffle[97] = uno[97];來實現洗牌。但是這種洗牌方式并不理想。
考慮加入布爾數組visit來確定牌是否已經被取走,在此基礎上生成98個隨機數來取牌,代碼如下:
? ? //洗牌public static void ShuffleCards(){Random r = new Random();boolean[] visit = new boolean[98];//第一次洗牌String[] shuffle1 = new String[98];int k=0;Arrays.fill(visit, false);for (int i=0; i<98; i++) {int n = r.nextInt(97);while (visit[n]) {n = (n+1)%98;}shuffle1[k] = uno[n];visit[n] = true;k++;}//第二次洗牌String[] shuffle2 = new String[98];k=0;Arrays.fill(visit, false);for (int i=0; i<98; i++) {int n = r.nextInt(97);while (visit[n]) {n = (n+1)%98;}shuffle2[k] = shuffle1[n];visit[n] = true;k++;}//第三次洗牌String[] shuffle3 = new String[98];k=0;Arrays.fill(visit, false);for (int i=0; i<98; i++) {int n = r.nextInt(97);while (visit[n]) {n = (n+1)%98;}shuffle3[k] = shuffle2[n];visit[n] = true;k++;}//復制System.arraycopy(shuffle3, 0, uno, 0, 98);}三次洗牌已經足夠,如果需要,洗更多次當然也可以。
3、生成GUI與填牌
要闡釋清楚還挺麻煩的,總之我希望的版面大概是這樣:
上面的牌有6行9列,共54張
(備注:不鋪98張是因為場地有限,實際玩的時候不會一次性全部鋪完;同時54和98滿足54×2>98,有抽屜原理可知一定有解)
考慮設計54+3=57個按鈕,每個按鈕都有其對應的事件。
涉及到的代碼有1099行,太多,就不打算放出來了。
五、成果
參考博主在b站發的視頻,
【「Java」翻牌匹配模擬器的半成品=記憶力模擬器-嗶哩嗶哩】 https://b23.tv/4PFvvi0
六、總結反思
重復的工作太多,效率太低
6×9=54個按鈕理應有統一實現,寫一次代碼足矣
但是我卻寫了54個addActionListener,浪費了巨多時間......
上次用C寫了個數獨游戲,這次用Java寫了配對游戲
下次我會考慮用Python寫的,剛好這學期我的大作業學的就是Pygame,專業對口了屬于是
大概就這么多吧,博主去吃晚飯了
總結
以上是生活随笔為你收集整理的翻牌模拟器 | Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02 订阅号与服务号
- 下一篇: 近期接触和学习的新技术