iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

C++30日挑戰之旅系列 第 8

DAY8 用C++來完成猜數字遊戲(上)

  • 分享至 

  • xImage
  •  

題目:

選擇一個四位數字讓對方猜謎,四個位數的數字必須不同,例如: 0941
若對方猜的數字,數字正確位置不對為1B、如果數字跟位置都正確1A,例如5904: 1A 2B,且當4A遊戲結束


解法:

#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()來代替他所提供的功能,而不用全部程式重新在寫一次(不然主程式就會又臭又長)。

第二部分"主功能介紹"的部分就作為明天的講解任務了!請好好期待~


上一篇
DAY7用srand()與swich/case做出撲克牌發牌機
下一篇
DAY9 用C++來完成猜數字遊戲(下)
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言