2016年12月16日 星期五

(1A2B遊戲)手把手教你如何光源氏計畫培養電腦成為你的1A2B遊戲伴侶 Part1 數字拆解

廢話不多說 今天寫一下如何讓電腦成為你心目中的伴侶
結果如下圖:



在此先說明此1A2B的遊戲規則之後文章不在贅述

1.是一個4位數,其中0~9不得在同一個4位數內出現兩次而且千位數不能是0所以以下是不能出現的情況(EX:0123,1223,1315,1454等)所以範圍1023~9876
2.本遊戲是讓電腦猜你心裡的數字後,你回答幾A幾B,所以..流程=>電腦猜你數字假設(1234)=>你心目中的答案是1235所以你回答3A0B=>....以此類推,直到電腦猜到你的數字為止
3.使用者不得欺負電腦,如5A0B不可能出現的數字,或者一次的遊戲內是你心裡想的答案不斷更換,若有以上情況電腦應該都會出現ERROR提示使用者.....


4.電腦成功猜出數字時(當你輸入4A0B時),會高興的跟你說猜到了


-------------------以上為本1A2B大概的遊戲規則-------------------
現在大家清楚了遊戲規則後我大概分成幾個步驟 

1.輸入兩個數字 拆數字(稍後本文介紹)
2.比對1A2B
3.創造一個1023~9876之間的陣列且不得有重複數字(請見規則1)此陣列用來標記有無可能是使用者猜的數字 有可能則1不可能則0幾A幾B
4.電腦每次產生一個亂數在1023~9876之間且不得重複數字出現每猜完一次下一次亂數就不可能再出現(利用第二步的陣列)
5.結合 功能整合 
-----------------------數字拆解讓電腦辨別幾A幾B---------------------
首要達成目標 使用者輸入兩個數字讓電腦做比對動作,並顯示幾A幾B
假設有兩個數字1023 1024整數
我們自己去比對一個一個看 那麼既然知道是一個一個
也就可以知道我們能用陣列一個一個下去比對
如下:我把1023 1024個別存到box1和box2這兩個陣列裡面
所以創出兩個陣列大小為4 然後一個一個去比對用迴圈方式做4次

當然若要比對,基本上就是要拆數字 給個觀念
1234=(A*1000+B*100+C*10+D*1)相信這個大家都會算
那麼若用電腦拆數字呢??
我們設一A,B,C,D的整數
是不是就變成...
1234/1000=A
1234=(1234-A*1000)/100=B
1234=(1234-A*1000-B*100)/10=C
1234=(1234-A*1000-B*100-C*10)/1=D
我們發現每次數字拆解都是4次而且取值都需要上一次的結果
抓下來運算 需要一個巢狀迴圈
所以......JAVA結果為 
程式碼如下:Dismantling為函數拆解
 
import java.util.*;
public class NumberComparison
{
 static int a1=0,b1=0,i=0,a=0,b=0,c=0,d=0;
 static int[] box1=new int[4];
 static int[] box2=new int[4];
 public static void main(String args[])
 {
  Scanner sc=new Scanner (System.in);
  System.out.println("a1的數值為");
  a1=sc.nextInt();
  System.out.println("b1的數值為");
  b1=sc.nextInt();
  Dismantling1(a1);
  Dismantling2(b1);
  for(i=0;i<=3;i++)
  {
   System.out.println("box1\t"+box1[i]);
   
  }
  for(i=0;i<=3;i++)
  {
   System.out.println("box2\t"+box2[i]);
   
  }
  
  
  
 }
 
 public static void Dismantling1(int a1)
 {
   for(i=0;i<=3;i++)
   {
    switch(i)
    {
     case 0:
      a=a1/1000;
      box1[i]=a;
      break;
     case 1:
      b=(a1-a*1000)/100;
      box1[i]=b;
      break;
     case 2:
      c=(a1-a*1000-b*100)/10;
      box1[i]=c;
              break;
     case 3:
      d=(a1-a*1000-b*100-c*10)/1;
      box1[i]=d;
      break;
    } 
    
   }
  }
 public static void Dismantling2(int b1)
 {
   for(i=0;i<=3;i++)
   {
    switch(i)
    {
     case 0:
      a=b1/1000;
      box2[i]=a;
      break;
     case 1:
      b=(b1-a*1000)/100;
      box2[i]=b;
      break;
     case 2:
      c=(b1-a*1000-b*100)/10;
      box2[i]=c;
              break;
     case 3:
      d=(b1-a*1000-b*100-c*10)/1;
      box2[i]=d;
      break;
    } 
    
   }
  }
} 

2 則留言:

  1. 那麼若用電腦拆數字呢??
    我們設一A,B,C,D的整數
    是不是就變成...
    1234/1000=A
    1234=(1234-A*1000)/100=B
    1234=(1234-A*1000-B*100)/10=C
    1234=(1234-A*1000-B*100-C*10)/1=D



    這個部分 把數字當字串就好了
    用charAt()

    回覆刪除
    回覆
    1. 恩~對 如果把數字當字串...感謝提供方法
      剛開始找字串陣列很苦惱...沒想到能用charAt()
      ps.本篇是老師提供的想法 看來可以少好幾列了程式碼了

      刪除