欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)24點(diǎn)小游戲

 更新時(shí)間:2019年01月24日 16:16:05   作者:WendyRay  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java實(shí)現(xiàn)24點(diǎn)小游戲的具體代碼,供大家參考,具體內(nèi)容如下

程序設(shè)計(jì)要求:

24點(diǎn)游戲是經(jīng)典的紙牌益智游戲。

常見(jiàn)游戲規(guī)則:

從撲克中每次取出4張牌。使用加減乘除,第一個(gè)能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求編程解決24點(diǎn)游戲。

基本要求: 隨機(jī)生成4個(gè)代表?yè)淇伺婆泼娴臄?shù)字字母,程序自動(dòng)列出所有可能算出24的表達(dá)式,用擅長(zhǎng)的語(yǔ)言(C/C++/Java或其他均可)實(shí)現(xiàn)程序解決問(wèn)題。

1.程序風(fēng)格良好(使用自定義注釋模板)
2.列出表達(dá)式無(wú)重復(fù)。

算法設(shè)計(jì)思路:

算法采用了窮舉的方法,對(duì)所有數(shù)字和操作符進(jìn)行組合,從而找到所有的情況。
剛開(kāi)始將四個(gè)數(shù)進(jìn)行分組排序。
算法中我采用了將四個(gè)數(shù)分為1種的,兩種的(在兩種中又分為兩種數(shù)的個(gè)數(shù)分別為1和3的,個(gè)數(shù)分別為2和2的),三種的和四種的,將所有情況排序排了出來(lái)。
每次只運(yùn)算2個(gè)數(shù),然后將結(jié)果拿去進(jìn)行下一次運(yùn)算。剛開(kāi)始有4個(gè)數(shù),拿出兩個(gè)數(shù)進(jìn)行第一次運(yùn)算,運(yùn)算后得出三個(gè)數(shù),然后在這三個(gè)數(shù)中再拿出兩個(gè)進(jìn)行第二次運(yùn)算,運(yùn)算后就有兩個(gè)數(shù)了,第三次運(yùn)算就是將這兩個(gè)數(shù)進(jìn)行計(jì)算,得出最后值,判斷最后這個(gè)值是否為24,若為24,則輸出表達(dá)式,若不是,則輸出提示消息。
現(xiàn)在在這4個(gè)數(shù)確定位置的情況下,再來(lái)改變操作符,即每次2個(gè)數(shù)進(jìn)行運(yùn)算的時(shí)候,有4種情況。在下一次計(jì)算的時(shí)候同樣有4種情況,最后一次計(jì)算(第3次)同理。這樣就找到了所有解的情況。

算法流程圖為:

下面是代碼:

package Game;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Compute {
 //定義隨機(jī)產(chǎn)生的四個(gè)數(shù)
 static int number[] = new int[4];
 //轉(zhuǎn)換后的num1,num2,num3,num4
 static int m[]=new int [4];
 static String n[] = new String[4];
 //用來(lái)判斷是否有解
 static boolean flag = false;
 //存放操作符
 static char[] operator = { '+', '-', '*', '/' };
 private static Object key;
 
 public static void main(String[] args){
 Random rand = new Random();
 System.out.println("下列給出四個(gè)數(shù)字,使用+,-,*,/進(jìn)行計(jì)算使最后計(jì)算結(jié)果為24");
 for(int i=0;i<4;i++){
 number[i]=rand.nextInt(13)+1;//隨機(jī)生成四個(gè)int型數(shù)
 
 if(number[i]==1){
 System.out.println("A");//如果隨機(jī)生成的數(shù)為1,則顯示為撲克牌牌面中的A
 }
 else if(number[i]==11){
 System.out.println("J");//如果隨機(jī)生成的數(shù)為11,則顯示為撲克牌牌面中的J
 }
 else if(number[i]==12){
 System.out.println("Q");//如果隨機(jī)生成的數(shù)為12,則顯示為撲克牌牌面中的Q
 }
 else if(number[i]==13){
 System.out.println("K");//如果隨機(jī)生成的數(shù)為13,則顯示為撲克牌牌面中的K
 }
 else
 System.out.println(number[i]);
 }
 System.out.println("可能的結(jié)果有:");
 calculate();
 
 }
 
 
 //給定2個(gè)數(shù)和指定操作符的計(jì)算
 public static int calcute(int count1, int count2, char operator) {
 if (operator == '+') {
 return count1 + count2;
 } 
 else if (operator == '-') {
 return count1 - count2;
 }
 else if (operator == '*') {
 return count1 * count2;
 }
 else if ((operator == '/' )&& (count2 != 0) && (count1%count2==0)) {
 return count1 / count2; 
 }
 else {
 return -1;  
 }
 }
 

 //計(jì)算生成24的函數(shù)
 public static void calculate(){
 
 Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 //存放數(shù)字,用來(lái)判斷輸入的4個(gè)數(shù)字中有幾個(gè)重復(fù)的,和重復(fù)的情況
 for (int i = 0; i < number.length; i++) { 
 if(map.get(number[i]) == null){ 
 map.put(number[i], 1); 
 } 
 else { 
 map.put(number[i], map.get(number[i]) + 1); 
 } 
 }
 if(map.size() == 1){
 //如果只有一種數(shù)字,此時(shí)只有一種排列組合,如5,5,5,5
 calculation(number[0], number[1],number[2],number[3]);
 }
 else if(map.size()==2){
 //如果只有2種數(shù)字,有2種情況,如1,1,2,2和1,1,1,2
 int index = 0;//用于數(shù)據(jù)處理
 int state = 0;//判斷是哪種情況
 for (Integer key : map.keySet()) {
 if(map.get(key) == 1){
 //如果是有1個(gè)數(shù)字和其他3個(gè)都不同,將number變?yōu)?number[0]=number[1]=number[2],
 //將不同的那個(gè)放到number[3],方便計(jì)算
 number[3] = key;
 state = 1;
 }
 else if(map.get(key)==2){
 //如果是兩兩相同的情況,將number變?yōu)閚umber[0]=number[1],number[2]=number[3]的情況
 number[index++]=key;
 number[index++]=key;
 }
 else{
 number[index++]=key;
 }
 }
 //列出2種情況的所有排列組合,并分別計(jì)算
 if(state == 1){
 calculation(number[3],number[1],number[1],number[1]);
 calculation(number[1],number[3],number[1],number[1]);
 calculation(number[1],number[1],number[3],number[1]);
 calculation(number[1],number[1],number[1],number[3]);
 }
 if(state==0){
 calculation(number[1],number[1],number[3],number[3]);
 calculation(number[1],number[3],number[1],number[3]);
 calculation(number[1],number[3],number[3],number[1]);
 calculation(number[3],number[3],number[1],number[1]);
 calculation(number[3],number[1],number[3],number[1]);
 calculation(number[3],number[1],number[1],number[3]);
 }
 }
 else if(map.size()==3){
 //有3種數(shù)字的情況
 int index = 0; 
 for (Integer key : map.keySet()) { 
 if(map.get(key) == 2){ 
 //將相同的2個(gè)數(shù)字放到number[2]=number[3] 
 number[2] = key; 
 number[3] = key; 
 } 
 else { 
 number[index++] = key; 
 }
 }
 //排列組合,所有情況
 calculation(number[0],number[1],number[3],number[3]);
 calculation(number[0],number[3],number[1],number[3]);
 calculation(number[0],number[3],number[3],number[1]);
 calculation(number[1],number[0],number[3],number[3]);
 calculation(number[1],number[3],number[0],number[3]);
 calculation(number[1],number[3],number[3],number[0]);
 calculation(number[3],number[3],number[0],number[1]);
 calculation(number[3],number[3],number[1],number[0]);
 calculation(number[3],number[1],number[3],number[0]);
 calculation(number[3],number[0],number[3],number[1]);
 calculation(number[3],number[0],number[1],number[3]);
 calculation(number[3],number[1],number[0],number[3]);
 }
 else if(map.size() == 4){
 //4個(gè)數(shù)都不同的情況
 calculation(number[0],number[1],number[2],number[3]);
 calculation(number[0],number[1],number[3],number[2]);
 calculation(number[0],number[2],number[1],number[3]);
 calculation(number[0],number[2],number[3],number[1]);
 calculation(number[0],number[3],number[1],number[2]);
 calculation(number[0],number[3],number[2],number[1]);
 calculation(number[1],number[0],number[2],number[3]);
 calculation(number[1],number[0],number[3],number[2]);
 calculation(number[1],number[2],number[3],number[0]);
 calculation(number[1],number[2],number[0],number[3]);
 calculation(number[1],number[3],number[0],number[2]);
 calculation(number[1],number[3],number[2],number[0]);
 calculation(number[2],number[0],number[1],number[3]);
 calculation(number[2],number[0],number[3],number[1]);
 calculation(number[2],number[1],number[0],number[3]);
 calculation(number[2],number[1],number[3],number[0]);
 calculation(number[2],number[3],number[0],number[1]);
 calculation(number[2],number[3],number[1],number[0]);
 calculation(number[3],number[0],number[1],number[2]);
 calculation(number[3],number[0],number[2],number[1]);
 calculation(number[3],number[1],number[0],number[2]);
 calculation(number[3],number[1],number[2],number[0]);
 calculation(number[3],number[2],number[0],number[1]);
 calculation(number[3],number[2],number[1],number[0]);
 }
 if(flag==false)
 System.out.println("這四張牌面數(shù)字無(wú)法經(jīng)過(guò)運(yùn)算得到24!");
 }
 
 
 public static void calculation(int num1, int num2, int num3, int num4){
 
 for (int i = 0; i < 4; i++){
 //第1次計(jì)算,先從四個(gè)數(shù)中任意選擇兩個(gè)進(jìn)行計(jì)算
 char operator1 = operator[i];
 int firstResult = calcute(num1, num2, operator1);//先選第一,和第二個(gè)數(shù)進(jìn)行計(jì)算
 int midResult = calcute(num2, num3, operator1);//先選第二和第三兩個(gè)數(shù)進(jìn)行計(jì)算
 int tailResult = calcute(num3,num4, operator1);//先選第三和第四倆個(gè)數(shù)進(jìn)行計(jì)算
 for (int j = 0; j < 4; j++){
 //第2次計(jì)算,從上次計(jì)算的結(jié)果繼續(xù)執(zhí)行,這次從三個(gè)數(shù)中選擇兩個(gè)進(jìn)行計(jì)算
 char operator2 = operator[j];
 int firstMidResult = calcute(firstResult, num3, operator2);
 int firstTailResult = calcute(num3,num4,operator2);
 int midFirstResult = calcute(num1, midResult, operator2);
 int midTailResult= calcute(midResult,num4,operator2);
 int tailMidResult = calcute(num2, tailResult, operator2);
 for (int k = 0; k < 4; k++){
 //第3次計(jì)算,也是最后1次計(jì)算,計(jì)算兩個(gè)數(shù)的結(jié)果,如果是24則輸出表達(dá)式
 char operator3 = operator[k];
 //在以上的計(jì)算中num1,num2,num3,num4都是整型數(shù)值,但若要輸出為帶有A,J,Q,K的表達(dá)式,則要將這四個(gè)數(shù)都變?yōu)镾tring類(lèi)型,下同
 if(calcute(firstMidResult, num4, operator3) == 24){
 m[0]=num1;
 m[1]=num2;
 m[2]=num3;
 m[3]=num4;
 for(int p=0;p<4;p++){
 if(m[p]==1){
 n[p]="A";}
 if(m[p]==2){
 n[p]="2";}
 if(m[p]==3){
 n[p]="3";}
 if(m[p]==4){
 n[p]="4";}
 if(m[p]==5){
 n[p]="5";}
 if(m[p]==6){
 n[p]="6";}
 if(m[p]==7){
 n[p]="7";}
 if(m[p]==8){
 n[p]="8";}
 if(m[p]==9){
 n[p]="9";}
 if(m[p]==10){
 n[p]="10";}
 if(m[p]==11){
 n[p]="J";}
 if(m[p]==12){
 n[p]="Q";}
 if(m[p]==13){
 n[p]="k";}
 }
 System.out.println("((" + n[0] + operator1 + n[1] + ")" + operator2 + n[2] + ")" + operator3 + n[3]);
 flag = true;//若有表達(dá)式輸出,則將說(shuō)明有解,下同
 }
 if(calcute(firstResult, firstTailResult, operator3) == 24){
 System.out.println("(" + n[0] + operator1 + n[1] + ")" + operator3 + "(" + n[2] + operator2 + n[3] + ")"); 
 flag = true;
 }
 if(calcute(midFirstResult, num4, operator3) == 24){
 m[0]=num1;
 m[1]=num2;
 m[2]=num3;
 m[3]=num4; 
 for(int p=0;p<4;p++){
 if(m[p]==1){
 n[p]="A";}
 if(m[p]==2){
 n[p]="2";}
 if(m[p]==3){
 n[p]="3";}
 if(m[p]==4){
 n[p]="4";}
 if(m[p]==5){
 n[p]="5";}
 if(m[p]==6){
 n[p]="6";}
 if(m[p]==7){
 n[p]="7";}
 if(m[p]==8){
 n[p]="8";}
 if(m[p]==9){
 n[p]="9";}
 if(m[p]==10){
 n[p]="10";}
 if(m[p]==11){
 n[p]="J";}
 if(m[p]==12){
 n[p]="Q";}
 if(m[p]==13){
 n[p]="k";}
 }
 System.out.println("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))" + operator3 + n[3]);
 flag = true;
 }
 if(calcute(num1,midTailResult, operator3) == 24){
 m[0]=num1;
 m[1]=num2;
 m[2]=num3;
 m[3]=num4;
 for(int p=0;p<4;p++){
 if(m[p]==1){
 n[p]="A";}
 if(m[p]==2){
 n[p]="2";}
 if(m[p]==3){
 n[p]="3";}
 if(m[p]==4){
 n[p]="4";}
 if(m[p]==5){
 n[p]="5";}
 if(m[p]==6){
 n[p]="6";}
 if(m[p]==7){
 n[p]="7";}
 if(m[p]==8){
 n[p]="8";}
 if(m[p]==9){
 n[p]="9";}
 if(m[p]==10){
 n[p]="10";}
 if(m[p]==11){
 n[p]="J";}
 if(m[p]==12){
 n[p]="Q";}
 if(m[p]==13){
 n[p]="k";}
 }
 System.out.println(" " + n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")" + operator2 + n[3] + ")"); 
 flag = true;
 }
 if(calcute(num1,tailMidResult,operator3) == 24){
 m[0]=num1;
 m[1]=num2;
 m[2]=num3;
 m[3]=num4;
 for(int p=0;p<4;p++){
 if(m[p]==1){
 n[p]="A";}
 if(m[p]==2){
 n[p]="2";}
 if(m[p]==3){
 n[p]="3";}
 if(m[p]==4){
 n[p]="4";}
 if(m[p]==5){
 n[p]="5";}
 if(m[p]==6){
 n[p]="6";}
 if(m[p]==7){
 n[p]="7";}
 if(m[p]==8){
 n[p]="8";}
 if(m[p]==9){
 n[p]="9";}
 if(m[p]==10){
 n[p]="10";}
 if(m[p]==11){
 n[p]="J";}
 if(m[p]==12){
 n[p]="Q";}
 if(m[p]==13){
 n[p]="k";}
 }
 System.out.println(" " + n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 + n[3] + "))"); 
 flag = true;
 } 
 }
 } 
 }
 } 
} 

運(yùn)行及測(cè)試截圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring啟動(dòng)加載程序的幾種方法介紹

    spring啟動(dòng)加載程序的幾種方法介紹

    本篇文章主要介紹了spring啟動(dòng)加載程序的幾種方法介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • idea2020.2卡死在reading maven projects

    idea2020.2卡死在reading maven projects

    這篇文章主要介紹了idea2020.2卡死在reading maven projects,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • IDEA中maven依賴(lài)報(bào)紅的問(wèn)題解決辦法

    IDEA中maven依賴(lài)報(bào)紅的問(wèn)題解決辦法

    這篇文章主要給大家介紹了關(guān)于IDEA中maven依賴(lài)報(bào)紅的問(wèn)題解決辦法,在使用IDEA過(guò)程中,經(jīng)常會(huì)出現(xiàn)maven依賴(lài)報(bào)紅的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java中多種循環(huán)Map的常見(jiàn)方式詳解

    Java中多種循環(huán)Map的常見(jiàn)方式詳解

    Java中的Map是一種鍵值對(duì)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),其中每個(gè)鍵都唯一,與一個(gè)值相關(guān)聯(lián),下面這篇文章主要給大家介紹了關(guān)于Java中多種循環(huán)Map的常見(jiàn)方式,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-01-01
  • java后端返回?cái)?shù)據(jù)給前端時(shí)去除值為空或NULL的屬性、忽略某些屬性代碼示例

    java后端返回?cái)?shù)據(jù)給前端時(shí)去除值為空或NULL的屬性、忽略某些屬性代碼示例

    在Java開(kāi)發(fā)中我們處理JSON數(shù)據(jù)時(shí)經(jīng)常會(huì)遇到空值(null)的情況,這篇文章主要給大家介紹了關(guān)于java后端返回?cái)?shù)據(jù)給前端時(shí)去除值為空或NULL的屬性、忽略某些屬性的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java開(kāi)啟新線程并傳參方法代碼實(shí)現(xiàn)

    Java開(kāi)啟新線程并傳參方法代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java開(kāi)啟新線程并傳參方法代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java 重命名 Excel 工作表并設(shè)置工作表標(biāo)簽顏色的示例代碼

    Java 重命名 Excel 工作表并設(shè)置工作表標(biāo)簽顏色的示例代碼

    這篇文章主要介紹了Java 重命名 Excel 工作表并設(shè)置工作表標(biāo)簽顏色的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot整合MyBatis四種常用的分頁(yè)方式(詳細(xì)總結(jié))

    SpringBoot整合MyBatis四種常用的分頁(yè)方式(詳細(xì)總結(jié))

    這篇文章詳細(xì)給大家總結(jié)了SpringBoot整合MyBatis四種常用的分頁(yè)方式,文中通過(guò)代碼示例為大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 基于Spring boot @Value 注解注入屬性值的操作方法

    基于Spring boot @Value 注解注入屬性值的操作方法

    這篇文章主要介紹了結(jié)合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    這篇文章主要介紹了SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01

最新評(píng)論