30/09/2018, 16:56

Đoán số ngẫu nhiên trong C


    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {
        int sobimat=0,sodudoan=0,bodem=1,choitiep;
        const int max=100,min=1;
    srand(time(NULL));
        sobimat=(rand()%(max-min+1))+min;
    while(choitiep!=0)
    {
        do
        {
            printf("Nhap so du doan: ");
            scanf("%d",&sodudoan);
            if (sodudoan<sobimat)
            {printf("lon hon
");
            bodem+=1;}
            else if(sodudoan>sobimat)
            {printf(" nho hon
");
            bodem+=1;}
            else 
            printf("Chuc mung ban da doan dung so bi mat sau %d lan
",bodem);
            }
            while(sodudoan!=sobimat);
            printf(" Cam on ban da tham gia tro choi
");
    printf(" Ban co muon tham gia tiep khong (1/0)
");
    printf("Moi nhap so khac voi so 0 de choi tiep :  ");
    scanf("%d",&choitiep);    
        }
        system("pause");
        return 0;
        }

  • Đây là đoạn code đoán số ngẫu nhiên và sẽ cho người chơi chơi lại nếu muốn + đếm số lần đoán đúng của người chơi .
    bằng cách thêm vòng lặp while bao quanh vòng lặp do while , nên có thể cho phép người chơi chơi tiếp nếu nhập vào 1 số khác 0 ( đây là giải pháp của mình ). Nhưng vấn đề nảy ra ở đây là như trong ảnh
  • Thứ 1 là việc lặp lại thì có nhưng bộ đếm bị cộng dồn ( ở lần thứ 1 thì đúng 17 lần mới đoán trúng số ở lần chơi thứ 2 nó + thêm 2 lần của ván mới ra KQ =19). Nếu như k để chế độ thêm ván mới thì mọi thứ vẫn bình thường
  • Thứ 2 là KQ của các số bí mật của từng ván khác nhau đều giống y hệt trong hình số bí mật là 7
    -Mong mọi người giải đáp thắc mắc
Thành Phạm viết 19:09 ngày 30/09/2018

Bạn chỉ cần đưa vào trong while thứ nhất 2 dòng mình mới thêm vào là được, nó có chức năng reset lại bộ đếm và tạo số bí mật mới cho lần chơi mới

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int sobimat=0,sodudoan=0,bodem=1,choitiep;
    const int max=100,min=1;

while(choitiep!=0)
{
    //Khoi tao sobimat
    srand(time(NULL));
    sobimat=(rand()%(max-min+1))+min;
    //Khoi tao bodem
    bodem=1;
    do
    {
        printf("Nhap so du doan: ");
        scanf("%d",&sodudoan);
        if (sodudoan<sobimat)
        {printf("lon hon\n");
        bodem+=1;}
        else if(sodudoan>sobimat)
        {printf(" nho hon\n");
        bodem+=1;}
        else
        printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
        }
        while(sodudoan!=sobimat);
        printf(" Cam on ban da tham gia tro choi\n");
printf(" Ban co muon tham gia tiep khong (1/0)\n");
printf("Moi nhap so khac voi so 0 de choi tiep :  ");
scanf("%d",&choitiep);
    }
    system("pause");
    return 0;
    }
anonymous viết 19:10 ngày 30/09/2018

mình cho vào thử nhưng mà nó chỉ đc 2 ván đầu là không sao , nhưng ván thứ 3 lại bị cộng dồn vào ván thứ 2 . để tí code lại xem sao

Thành Phạm viết 19:03 ngày 30/09/2018

Máy mình chạy ổn mà nhỉ , hay bạn thử cho nó printf biến bodem ra để theo dõi nó xem nó thay đổi như nào

anonymous viết 19:08 ngày 30/09/2018

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {
        int sodudoan=0,sobimat=0,bodem=1,choitiep;
        const int max=100,min=1;
        printf("Chuong trinh doan so ngau nhien tu 1 den 100\n");
        while(choitiep!=0)
        {
            srand(time(NULL));
            sobimat=(rand()%(max-min+1))+min;
            do
            {
                printf("Nhap so ban du doan: ");
                scanf("%d",&sodudoan);
                if(sodudoan>sobimat)
                {printf("Nhap so nho hon:  ");
                bodem+=1;}
                else if (sodudoan<sobimat)
                {printf(" Nhap so lon hon: ");
                bodem+=1;}
                else
                {printf(" Chuc mung ban da nhap dung so bi mat sau %d lan",bodem);}
            }
            while(sodudoan!=sobimat);
        printf("Neu muon choi tiep thi hay nhap 1 so khac khong: ");
        scanf("%d",&choitiep);
        }
    system("pause");
    return 0;
    }          

  

Mình nhập thử chương trình kia , chạy thử ok rồi .nhưng khi viết trình bày lại cho đẹp nó lại ra cái lỗi ảo ảo mà mình thấy 2 cái nó như nhau chả lẽ complie có vấn đề

  • Yêu cầu thứ 2 của bài là tạo mode cho 2 người chơi và gợi ý là : " Sự khác nhau ở 2 mode là cách tạo số bí mật , trường hợp sử dụng rand() như trên , và TH sử dụng scanf " ( k hiểu gì luôn @@ )
Thành Phạm viết 18:57 ngày 30/09/2018

Chương trình của bạn thiếu mất reset biến bodem rồi
Đề hai thì bạn cứ nghiên cứu đi nhá

anonymous viết 18:56 ngày 30/09/2018

nghĩa là phải nhét cả bộ đếm vào vòng while đầu hả bạn

Thành Phạm viết 19:07 ngày 30/09/2018

Đúng rồi , Dòng này nè bạn

//Khoi tao bodem
bodem=1; 

Nếu không có nó thì bộ đếm bị cộng dồn khi bắt đầu lượt chơi mới

anonymous viết 18:57 ngày 30/09/2018

ok cảm ơn bạn :v thế là cũng hiểu kha khá , chuyển sang hàm được rồi

anonymous viết 19:06 ngày 30/09/2018

à bạn ơi cho mình hỏi luôn mình tạo mức độ khó của game thông qua cái bảng menu chọn mức 1 thì từ 1 dến 100 , mức 2 từ 1 đến 1000 , mức 3 từ 1 đến 10000 . Dùng lệnh switch sửa mãi k đc :v


    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {
        int sobimat=0,sodudoan=0,bodem=1,choitiep,gioihan,luachon=0;
        const int min=1;
    printf(" lua chon muc choi\n");
    printf(" Muc 1 : tu 1 den 100\n");
    printf(" Muc 2: tu 1 den 1000\n");
    printf("Muc 3: tu 1 den 10000\n");
    printf(" Lua chon cua ban : ");
    scanf("%d",&luachon);
    switch(luachon)
    {
        case 1: 
    while(choitiep!=0)
    {
        //Khoi tao sobimat
        srand(time(NULL));
        sobimat=(rand()%(gioihan-min+1))+min;
        printf("Sobi mat la : %d\n",sobimat);
        //Khoi tao bodem
        gioihan=100;
        do
        {
            printf("Nhap so du doan: ");
            scanf("%d",&sodudoan);
            if (sodudoan<sobimat)
            {printf("lon hon\n");
            bodem+=1;
            printf("bo dem la %d\n",bodem);}
            else if(sodudoan>sobimat)
            {printf(" nho hon\n");
            bodem+=1;
                printf("bo dem la %d\n",bodem);}
            else
            printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
            }
            while(sodudoan!=sobimat);
    printf(" Cam on ban da tham gia tro choi\n");
    printf("Moi nhap so khac voi so 0 de choi tiep :  ");
    scanf("%d",&choitiep);
        }
        break;
    case 2: 
    while(choitiep!=0)
    {
        //Khoi tao sobimat
        srand(time(NULL));
        sobimat=(rand()%(gioihan-min+1))+min;
        printf("Sobi mat la : %d\n",sobimat);
        //Khoi tao bodem
        gioihan=1000;
        do
        {
            printf("Nhap so du doan: ");
            scanf("%d",&sodudoan);
            if (sodudoan<sobimat)
            {printf("lon hon\n");
            bodem+=1;
            printf("bo dem la %d\n",bodem);}
            else if(sodudoan>sobimat)
            {printf(" nho hon\n");
            bodem+=1;
                printf("bo dem la %d\n",bodem);}
            else
            printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
            }
            while(sodudoan!=sobimat);
    printf(" Cam on ban da tham gia tro choi\n");
    printf("Moi nhap so khac voi so 0 de choi tiep :  ");
    scanf("%d",&choitiep);
        }
        break;
        case 3: 
    while(choitiep!=0)
    {
        //Khoi tao sobimat
        srand(time(NULL));
        sobimat=(rand()%(gioihan-min+1))+min;
        printf("Sobi mat la : %d\n",sobimat);
        //Khoi tao bodem
        gioihan=10000;
        do
        {
            printf("Nhap so du doan: ");
            scanf("%d",&sodudoan);
            if (sodudoan<sobimat)
            {printf("lon hon\n");
            bodem+=1;
            printf("bo dem la %d\n",bodem);}
            else if(sodudoan>sobimat)
            {printf(" nho hon\n");
            bodem+=1;
                printf("bo dem la %d\n",bodem);}
            else
            printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
            }
            while(sodudoan!=sobimat);
    printf(" Cam on ban da tham gia tro choi\n");
    printf("Moi nhap so khac voi so 0 de choi tiep :  ");
    scanf("%d",&choitiep);
        }
        break;
       default :
           printf(" Chi duoc chon 1 trong 3 truong hop ");
           break;
           }
           system("pause");
           return 0;
    }     
    
       

   

Thành Phạm viết 19:08 ngày 30/09/2018

Mình thấy chạy cũng hợp lý đấy chứ, mỗi tội là cho đáp án luôn thôi

anonymous viết 19:08 ngày 30/09/2018

mình để đáp án để test lại xem đúng không đấy nhưng mà cái đáp án nó vượt quá 10000 :v

Thành Phạm viết 19:10 ngày 30/09/2018

Mình test chưa thấy lần nào vượt cả

anonymous viết 19:08 ngày 30/09/2018

mình chả hiểu cái compiler nhà mình bị sao nữa , toàn bị vống lên mặc dù đã sửa chi tiết rồi , kể cả cái chương trình mình post y nguyên trên mình copy lại nó vẫn bị sai @@

Thành Phạm viết 18:58 ngày 30/09/2018

Thế thì bạn phải test lại từng ít một, test xem đoạn code tạo số random có sai không, tại sao sai, máy mình chạy tốt

anonymous viết 18:58 ngày 30/09/2018

bạn copy chương trình của mình chạy không sai đúng không ? Mình cũng chạy lại cái chương trình mình vừa post bị sai là sao ?

Thành Phạm viết 19:08 ngày 30/09/2018

Code trên máy mình đây

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int sobimat=0,sodudoan=0,bodem=1,choitiep,gioihan,luachon=0;
    const int min=1;
printf(" lua chon muc choi\n");
printf(" Muc 1 : tu 1 den 100\n");
printf(" Muc 2: tu 1 den 1000\n");
printf("Muc 3: tu 1 den 10000\n");
printf(" Lua chon cua ban : ");
scanf("%d",&luachon);
switch(luachon)
{
case 1:
while(choitiep!=0)
{
    //Khoi tao sobimat
    srand(time(NULL));
    sobimat=(rand()%(gioihan-min+1))+min;
    printf("Sobi mat la : %d\n",sobimat);
    //Khoi tao bodem
    gioihan=100;
    do
    {
        printf("Nhap so du doan: ");
        scanf("%d",&sodudoan);
        if (sodudoan<sobimat)
        {printf("lon hon\n");
        bodem+=1;
        printf("bo dem la %d\n",bodem);}
        else if(sodudoan>sobimat)
        {printf(" nho hon\n");
        bodem+=1;
            printf("bo dem la %d\n",bodem);}
        else
        printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
        }
        while(sodudoan!=sobimat);
printf(" Cam on ban da tham gia tro choi\n");
printf("Moi nhap so khac voi so 0 de choi tiep :  ");
scanf("%d",&choitiep);
    }
    break;
case 2:
while(choitiep!=0)
{
    //Khoi tao sobimat
    srand(time(NULL));
    sobimat=(rand()%(gioihan-min+1))+min;
    printf("Sobi mat la : %d\n",sobimat);
    //Khoi tao bodem
    gioihan=1000;
    do
    {
        printf("Nhap so du doan: ");
        scanf("%d",&sodudoan);
        if (sodudoan<sobimat)
        {printf("lon hon\n");
        bodem+=1;
        printf("bo dem la %d\n",bodem);}
        else if(sodudoan>sobimat)
        {printf(" nho hon\n");
        bodem+=1;
            printf("bo dem la %d\n",bodem);}
        else
        printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
        }
        while(sodudoan!=sobimat);
printf(" Cam on ban da tham gia tro choi\n");
printf("Moi nhap so khac voi so 0 de choi tiep :  ");
scanf("%d",&choitiep);
    }
    break;
    case 3:
while(choitiep!=0)
{
    //Khoi tao sobimat
    srand(time(NULL));
    sobimat=(rand()%(gioihan-min+1))+min;
    printf("Sobi mat la : %d\n",sobimat);
    //Khoi tao bodem
    gioihan=10000;
    do
    {
        printf("Nhap so du doan: ");
        scanf("%d",&sodudoan);
        if (sodudoan<sobimat)
        {printf("lon hon\n");
        bodem+=1;
        printf("bo dem la %d\n",bodem);}
        else if(sodudoan>sobimat)
        {printf(" nho hon\n");
        bodem+=1;
            printf("bo dem la %d\n",bodem);}
        else
        printf("Chuc mung ban da doan dung so bi mat sau %d lan\n",bodem);
        }
        while(sodudoan!=sobimat);
printf(" Cam on ban da tham gia tro choi\n");
printf("Moi nhap so khac voi so 0 de choi tiep :  ");
scanf("%d",&choitiep);
    }
    break;
   default :
       printf(" Chi duoc chon 1 trong 3 truong hop ");
       break;
       }
       system("pause");
       return 0;
}
anonymous viết 19:05 ngày 30/09/2018

chuẩn rồi nếu như code trên thì cái phần mềm Dev C++ của mình lỗi ở đâu đó rồi

Thành Phạm viết 19:08 ngày 30/09/2018

Mình dùng code::block, bây giờ bạn viết một chương trình mới chỉ có đoạn code tạo số thôi để kiểm tra lại đoạn đó, phải biết sai ở đâu thì mới sửa được

anonymous viết 19:03 ngày 30/09/2018

có vẻ tách riêng bộ tạo số ra thì vẫn đúng nhưng mà sao cái chương trình trên cùng 1 code mà 2 soft , cái đúng , cái sai nhỉ @@

loi viết 19:08 ngày 30/09/2018
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int sobiMat = 0, soNguoiDoan = 0, soLanDoan = 1, choitiep, luachon = 0;
    while (choitiep)
    {
        soLanDoan = 1;
        printf("=== Lua chon do kho tro choi === \n");
        printf("1. Tim so bi mat tu 1~100 \n");
        printf("2. Tim so bi mat tu 1~1000 \n");
        printf("3. Tim so bi mat tu 1~10000 \n");
        printf("Hay lua chon mot trong ba so: 1 , 2 , 3 \n");
        scanf("%d", &luachon);

        if (luachon == 1)
        {

                const int  Max = 100, Min = 1;
                srand(time(NULL));
                sobiMat = (rand()%(Max - Min + 1)) + Min;
                /*tao so ngau nhien*/


                do
                    {
                        printf("Ban can nhap mot so bat ki tu 1 ~ 100 \n");
                        scanf("%d", &soNguoiDoan);
                        printf("\n");
                        
                        if (soNguoiDoan > sobiMat)
                            {
                                printf("So bi mat nho hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else if (soNguoiDoan < sobiMat)
                            {
                                printf("So bi mat lon hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else
                            printf("Chuc mung ban da tim duoc so bi mat, so lan doan so bi mat cua ban la %d \n",soLanDoan);
                    }while (sobiMat != soNguoiDoan);



        }
        else if (luachon == 2)
        {

                const int Max = 1000, Min = 1;
                srand(time(NULL));
                sobiMat = (rand()%(Max - Min + 1)) + Min;
                /*tao so ngau nhien*/

                do
                    {
                        printf("Ban can nhap mot so bat ki tu 1 ~ 1000 \n");
                        scanf("%d", &soNguoiDoan);
                        printf("\n");
                        
                        if (soNguoiDoan > sobiMat)
                            {
                                printf("So bi mat nho hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else if (soNguoiDoan < sobiMat)
                            {
                                printf("So bi mat lon hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else
                            printf("Chuc mung ban da tim duoc so bi mat, so lan doan so bi mat cua ban la %d \n",soLanDoan);
                    }while (sobiMat != soNguoiDoan);


        }
        else if (luachon == 3)
        {

                const int Max = 10000, Min = 1;
                srand(time(NULL));
                sobiMat = (rand()%(Max - Min + 1)) + Min;
                /*tao so ngau nhien*/

                do
                    {
                        printf("Ban can nhap mot so bat ki tu 1 ~ 10000\n");
                        scanf("%d", &soNguoiDoan);
                        printf("\n");
                        
                        if (soNguoiDoan > sobiMat)
                            {
                                printf("So bi mat nho hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else if (soNguoiDoan < sobiMat)
                            {
                                printf("So bi mat lon hon so nhap cua ban \n");
                                soLanDoan++;
                            }

                        else
                            printf("Chuc mung ban da tim duoc so bi mat, so lan doan so bi mat cua ban la %d \n",soLanDoan);
                    }while (sobiMat != soNguoiDoan);


        }
        printf("De tiep tuc tro choi ban go so 1, de ngung cuoc choi ban go so 0:");
        scanf("%d", &choitiep);
    }
    return 0;
}

Tại sao biến soLanDoan của mình ko hoạt động nhỉ. Nó nằm trong vòng lặp “do … while” , soLanDoan = 1. Bị sai gì à.

Đáng nhẽ soLanDoan = 3 chứ ko phải = 1 như trong hình

Bài liên quan
0