java實(shí)現(xiàn)紙牌游戲之小貓釣魚(yú)算法
星期天小哼和小哈約在一起玩桌游,他們正在玩一個(gè)非常古怪的撲克游戲——“小貓釣魚(yú)”。游戲的規(guī)則是這樣的:將一副撲克牌平均分成兩份,每人拿一份。小哼先拿出手中的第一張撲克牌放在桌上,然后小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌的上面,就像這樣兩人交替出牌。出牌時(shí),如果某人打出的牌與桌上某張牌的牌面相同,即可將兩張相同的牌及其中間所夾的牌全部取走,并依次放到自己手中牌的末尾。當(dāng)任意一人手中的牌全部出完時(shí),游戲結(jié)束,對(duì)手獲勝。
假如游戲開(kāi)始時(shí),小哼手中有 6 張牌,順序?yàn)?2 4 1 2 5 6,小哈手中也有 6 張牌,順序?yàn)?3 1 3 5 6 4,最終誰(shuí)會(huì)獲勝呢?現(xiàn)在你可以拿出紙牌來(lái)試一試。接下來(lái)請(qǐng)你寫(xiě)一個(gè)程序來(lái)自動(dòng)判斷誰(shuí)將獲勝。這里我們做一個(gè)約定,小哼和小哈手中牌的牌面只有 1~9。
輸入
2 4 1 2 5 6
3 1 3 5 6 4
輸出
小哼win
小哼當(dāng)前手中的牌是 5 6 2 3 1 4 6 5 桌上的牌是 2 1 3 4
這道題目完全考察棧跟隊(duì)列的應(yīng)用,桌面上的牌是棧,個(gè)人手中的牌是隊(duì)列。
附上JAVA實(shí)現(xiàn)的源碼:
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
LinkedList<Integer> a = new LinkedList<Integer>();//A手中的牌
LinkedList<Integer> b = new LinkedList<Integer>();//B手中的牌
Stack<Integer> stack = new Stack<>();//記錄桌面上的牌
int[] book = new int[10];//用來(lái)標(biāo)記哪些牌已經(jīng)在桌上
int n,t,s;
for(int i = 0; i < 10; i++){
book[i] = 0;
}
System.out.println("輸入手中牌的個(gè)數(shù)");
n = scanner.nextInt();
System.out.println("輸入A君手中牌的大小");
for(int i = 1; i<=n; i++){
a.addLast(scanner.nextInt());
}
System.out.println("輸入B君手中牌的大小");
for(int i = 1; i<=n; i++){
b.addLast(scanner.nextInt());
}
System.out.println("輸入完畢開(kāi)始游戲");
while (!a.isEmpty() && !b.isEmpty()) {//當(dāng)有人手中沒(méi)牌游戲結(jié)束
t = a.removeFirst();
if (book[t] == 0) {//A沒(méi)有贏
stack.push(t);//桌面上加一張牌
book[t] = 1;//記錄桌面上已經(jīng)有這張牌了
}else {//A贏了
a.addLast(t);//將打出的牌到到末尾
while (!stack.peek().equals(t)) {//將桌面上的牌按順序放到A的末尾
s = stack.pop();
a.addLast(s);
book[s] = 0;
}
}
//同上B取出牌
t = b.removeFirst();
if (book[t] == 0) {
stack.push(t);
book[t] = 1;
} else {
b.addLast(t);
while (!stack.peek().equals(t)) {
s = stack.pop();
b.addLast(s);
book[s]= 0;
}
}
}
if (!a.isEmpty()) {//A勝利
System.out.println("A君勝利!A手中的牌是");
while (!a.isEmpty()) {
System.out.print(a.removeFirst()+ " ");
}
System.out.println();
if (!stack.isEmpty()) {//桌面上有牌
System.out.println("桌面上的牌是");
for (Integer x : stack) {
System.out.print(x + " ");
}
} else {
System.out.println("桌面沒(méi)有牌了");
}
} else {//B勝利
System.out.println("B君勝利!B手中的牌是");
while (!b.isEmpty()) {
System.out.print(b.removeFirst()+ " ");
}
System.out.println();
if (!stack.isEmpty()) {//桌面上有牌
System.out.println("桌面上的牌是");
for (Integer x : stack) {
System.out.print(x + " ");
}
} else {
System.out.println("桌面沒(méi)有牌了");
}
}
return;//結(jié)束
}
}
結(jié)果:
輸入手中牌的個(gè)數(shù)
6
輸入A君手中牌的大小
2 4 1 2 5 6
輸入B君手中牌的大小
3 1 3 5 6 4
輸入完畢開(kāi)始游戲
A君勝利!A手中的牌是
5 6 2 3 1 4 6 5
桌面上的牌是
2 1 3 4
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring自動(dòng)配置之condition條件判斷下篇
這篇文章主要為大家介紹了SpringBoot?condition條件判斷功能的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖
當(dāng)我們利用Redis存儲(chǔ)熱點(diǎn)數(shù)據(jù)時(shí),突然就過(guò)期失效或者被刪除了,導(dǎo)致大量請(qǐng)求同時(shí)訪問(wèn)數(shù)據(jù)庫(kù),增加了數(shù)據(jù)庫(kù)的負(fù)載,為減輕數(shù)據(jù)庫(kù)的負(fù)載我們利用互斥鎖,本文重點(diǎn)介紹在SpringBoot中如何利用Redis實(shí)現(xiàn)互斥鎖,感興趣的朋友一起看看吧2023-09-09
SpringMVC中Invalid bound statement (not f
本文主要介紹了SpringMVC中Invalid bound statement (not found)常見(jiàn)報(bào)錯(cuò)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Okhttp在SpringBoot中的應(yīng)用實(shí)戰(zhàn)記錄(太強(qiáng)了)
這篇文章主要給大家介紹了關(guān)于Okhttp在SpringBoot中應(yīng)用實(shí)戰(zhàn)的相關(guān)資料,在Spring Boot中使用OkHttp主要是為了發(fā)送HTTP請(qǐng)求和處理響應(yīng),OkHttp是一個(gè)高效、易用的HTTP客戶(hù)端庫(kù),它具有簡(jiǎn)潔的API和強(qiáng)大的功能,需要的朋友可以參考下2023-12-12
Object類(lèi)toString()和equals()方法使用解析
這篇文章主要介紹了Object類(lèi)toString()和equals()方法使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析
這篇文章主要介紹了ConcurrentHashMap線程安全及實(shí)現(xiàn)原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

