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