題目: 選擇一個四位數字讓對方猜謎,四個位數的數字必須不同,例如: 0941 若對方猜的數字,數字正確位置不對為1B、如果數字跟位置都正確1A,例如5904: 1A 2B,且當4A遊戲結束
解法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 #include <iostream> #include <ctime> #include<iostream> using namespace std; bool checkNumber(int x); int generateNumber(); bool cmpNumber(int x, int y); int main() { int x, s, a; s=time(0);//seed srand(s); x = generateNumber();//目標數字 c: cin >> a;//猜測數字 switch(a) { case 0: { cout << x << endl; return 0; break; } default: { if(cmpNumber(a,x)==true) return 0; else goto c; break; } } } bool checkNumber(int x) { int d1, d2, d3, d4; d1 = x / 1000; d2 = (x / 100) % 10; d3 = (x / 10) % 10; d4 = x % 10; if(x<=9876&&x>=123) { if((d1!=d2)&&(d2!=d3)&&(d3!=d4)&&(d4!=d1)&&(d1!=d3)&&(d2!=d4)) return (true); else return (false); } else return (false); } int generateNumber() { int num; a: num = rand() % 9754 + 123; if(checkNumber(num)==false) goto a; else return num; } bool cmpNumber(int x, int y) { int g1, g2, g3, g4; g1 = y / 1000; g2 = (y / 100) % 10; g3 = (y / 10) % 10; g4 = y % 10; int d1, d2, d3, d4; d1 = x / 1000; d2 = (x / 100) % 10; d3 = (x / 10) % 10; d4 = x % 10; int i, j; i = 0; j = 0; if(g1==d2||g1==d3||g1==d4) j++; else if(g1==d1) i++; if(g2==d1||g2==d3||g2==d4) j++; else if(g2==d2) i++; if(g3==d1||g3==d2||g3==d4) j++; else if(g3==d3) i++; if(g4==d1||g4==d2||g4==d3) j++; else if(g4==d4) i++; cout << i << "A" << j << "B" << endl; if(i==4) return (true); else return (false); }
解釋與詳細介紹 第一部分:自定義函式介紹 首先我們會先使用三個函式來代表程式的不同功能段
generateNumber():產生數字 checkNumber(int x):對照數字是否符合”每個位數皆不相同”且介於”0123~9876”的範圍內 cmpNumber(int x, int y):比較猜測數字與目標數字的差別,並輸出幾A幾B
在程式中我們時常用字定義的函式來分區程式段,讓程式的執行更為便利與有條理。而寫法以先令出其”型態”,並令出名字與髓所需變數(列於括號內)。本題為例,bool cmpNumber(int x, int y)便是代表cmpNumber()是一個boolean樣式的函式(也就是成果只包含”True(1)”和”False(0)”)。而我們就能在程式的其他地方以cmpNumber()來代替他所提供的功能,而不用全部程式重新在寫一次(不然主程式就會又臭又長)。
第二部分”主功能介紹”的部分就作為明天的講解任務了!請好好期待~