Đ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\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;
        }

  • Đâ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

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 :blush:

#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;
    }
1 Like

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

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


    #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 đề :slight_smile:

  • 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 @@ )

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

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

1 Like

Đúng rồi :+1:, Dòng này nè bạn :blush:

//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

1 Like

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

1 Like

à 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;
    }     
    
       

   

2 Likes

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 :blush:

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

1 Like

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

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ế 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 :blush:

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 ?

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;
}

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

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

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ỉ @@

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?