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

#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

@ltd bạn có thể xem hộ mình được ko. Chẳng có ai trả lời cả T__T.

:smile: bạn lỗi ở chỗ SoLanDoan = 1; để trong vòng lặp ấy, vì khi bạn để SoLanDoan = 1, ở trong vòng lặp do while thì mỗi lần lặp xong nó lại reset lại cái biến SolanDoan của bạn lại bằng 1, tức là khi bạn đoán xong 1 số (nếu sai) thì nó lại reset số lần đoán của bạn lại bằng 1.

1 Like

Hihi, cảm ơn bạn. Mình xóa soLanDoan = 1; là chạy được rồi ^__^. Chỉ cần cho lên trong phép lặp While ở đầu là ko bị cộng dồn :smiley: .

Cho mình hỏi thêm cái dấu “!=” là gì nhỉ. Sao ko ghi là “=”

'!=' là khác đó bạn, còn '=' trong lập trình thì nó được hiểu là dấu gán ( chứ không phải là so sánh bằng nhé), mình nghĩ bạn nên xem lại các video hướng dẫn lập trình của anh @ltd để có thể biết rõ hơn. :wink:

1 Like

Mình đang xem
Tài liệu lập trình C for newbie - Chương 1: Nền tảng để bắt đầu!
hết chương 1 xong rồi mới xem video của anh Đạt :slight_smile:

2 Likes

bạn ơi mình đang tự học C, làm đến phần này thì mắc cái là nếu chỉ code bộ đếm và chọn số random thì ok. Nhưng vòng lặp để tiếp tục chơi thì mình code xong không chạy gì luôn. Mình code bằng Code::Block trên Ubuntu 14.04. Phần khai báo thư viện đủ cả. Bạn xem mình thiếu chỗ nào ?? chỉ giùm mình với

Bạn up cả code lên thì dễ hơn, mình đoán là cái biến chơi tiếp ban đầu nó = 0 (lúc mới khởi tạo mà không gán gì nó có = 0 không nhể :thinking:) =» không chạy đoạn while và kết thúc ct luôn :smile:

thanks bạn, mình fix được rồi. Biến choitiep=1 thì mới chạy được. Nhưng mình thắc mắc là sao code bạn ko gán giá trị cho choitiep mà vẫn chạy đó thôi,

Đây là code mình fix và chạy menu cấp độ chơi. Bạn thử xem liệu đã ổn chưa? Mình chạy thì ok rồi,

À, mình đang tự học, code trên Linux liệu có khác bạn code trên Win ko nhể ?

[code]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int sobimat=0,sobanchon=0,bodem=1,choitiep=1, max, luachoncapdo;
const int min=1;

while(choitiep!=0)
{
printf(" Hay lua chon cap do choi\n\n");
printf(“1. De nhat tu 1-30\n\n”);
printf(“2. Trung binh tu 1-60\n\n”);
printf(“3. Kha kho day tu 1-500\n\n”);
scanf("%d", &luachoncapdo);
printf("\n");
switch(luachoncapdo)
{
case 1:
max=30;
srand(time(NULL));
sobimat=((rand()%(max-min+1))+min);
bodem=1;
do
{
printf(“So ban chon la: “);
scanf(”%d”, &sobanchon);
if(sobimat<sobanchon)
{
printf(“nho hon\n\n\a”);
bodem+=1;
}
else if(sobimat>sobanchon)
{
printf(“lon hon\n\n\a”);
bodem+=1;
}
else
printf(“chuc mung ban da doan dung sau %d lan\n\n\a”, bodem);
}
while(sobimat!=sobanchon);
break;
case 2:
max=60;
srand(time(NULL));
sobimat=((rand()%(max-min+1))+min);
bodem=1;
do
{
printf(“So ban chon la: “);
scanf(”%d”, &sobanchon);
if(sobimat<sobanchon)
{
printf(“nho hon\n\n\a”);
bodem+=1;
}
else if(sobimat>sobanchon)
{
printf(“lon hon\n\n\a”);
bodem+=1;
}
else
printf(“chuc mung ban da doan dung sau %d lan\n\n\a”, bodem);
}
while(sobimat!=sobanchon);
break;
case 3:
max=500;
srand(time(NULL));
sobimat=((rand()%(max-min+1))+min);
bodem=1;
do
{
printf(“So ban chon la: “);
scanf(”%d”, &sobanchon);
if(sobimat<sobanchon)
{
printf(“nho hon\n\n\a”);
bodem+=1;
}
else if(sobimat>sobanchon)
{
printf(“lon hon\n\n\a”);
bodem+=1;
}
else
printf(“chuc mung ban da doan dung sau %d lan\n\n\a”, bodem);
}
while(sobimat!=sobanchon);
}
printf(“ban co muon choi tiep khong (1/0) ?\n\n”);
printf(“hay nhap vao so khac 0 de tiep tuc tro choi: \n\n”);
scanf("%d", &choitiep);

}

return 0;

}[/code]

Có lẽ là do compiler khác nhau :smile: mình không rõ vụ này lắm, chờ các cao thủ vào hỗ trợ :sweat_smile:

Mà tốt nhất là bạn làm do while á, thì kiểu gì nó cũng chạy 1 lần scanf cái flag kia, cho nó chắc chắn

ok, mình cũng đang tự mày mò học code thử xem sao. Thấy cũng thú vị, mới học đc 3 hôm mày mò đến phần hàm rồi.
Không biết code C này có khác PHP ko nhỉ ? mình mới làm quen, thấy anh em bảo học C đi đã !
p/s: mình học kinh tế, giờ ra đi làm rảnh mò lại đam mê hồi xưa nên tự học vậy ! ^^

1 Like

Nhưng mình thắc mắc là sao code bạn ko gán giá trị cho choitiep mà vẫn chạy đó thôi

@Hiep_Pham2 lý do là @thanhmssl10 hơi ẩu, chưa khởi tạo cho biến local đã mang ra dùng :slight_smile: Giá trị choitiep là không xác định, compiler của bạn ấy cho bạn ấy pass một cách ngẫu nhiên.

2 Likes

Mình tạo mode 2 người chơi thì mình để cho 1 người nhập số, còn 1 người đoán số vừa nhập. Nhưng như thế thì giá trị số lúc nhập vẫn hiển thị trên màn hình, có cách nào ẩn nó đi không nhỉ?

#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:
printf(“ban da chon muc 1\n”);
gioihan=100;

//Khoi tao sobimat
srand(time(NULL));
sobimat=(rand()%(gioihan-min+1))+min;
while(choitiep!=0)
{
sobimat=(rand()%(gioihan-min+1))+min;//khoi lai so bi mat
bodem=1;
//Khoi tao bodem
gioihan=100;
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(“Moi nhap so khac voi so 0 de choi tiep : “);
scanf(”%d”,&choitiep);
}
break;
case 2: printf(“ban da chon muc 2\n”);
gioihan=1000;

//Khoi tao sobimat
srand(time(NULL));
sobimat=(rand()%(gioihan-min+1))+min;
while(choitiep!=0)
{
sobimat=(rand()%(gioihan-min+1))+min;//khoi lai so bi mat
bodem=1;
//Khoi tao bodem
gioihan=1000;
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(“Moi nhap so khac voi so 0 de choi tiep : “);
scanf(”%d”,&choitiep);
}
break;
case 3:
printf(“ban da chon muc 3\n”);
gioihan=10000;

//Khoi tao sobimat
srand(time(NULL));
sobimat=(rand()%(gioihan-min+1))+min;
while(choitiep!=0)
{
sobimat=(rand()%(gioihan-min+1))+min;//khoi lai so bi mat
bodem=1;
//Khoi tao bodem
gioihan=10000;
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(“Moi nhap so khac voi so 0 de choi tiep : “);
scanf(”%d”,&choitiep);

break;
break;

default :
printf(" Chi duoc chon 1 trong 3 truong hop ");
break;
}
}
system(“pause”);
return 0;
}

chỉnh sửa chơi :smiley:

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