Hiển thị kết quả từ 1 đến 4 / 4
  1. #1
    Tham gia
    10-04-2012
    Bài viết
    83
    Like
    20
    Thanked 3 Times in 3 Posts

    giúp em sửa code bài toán kéo- búa bao

    Đề bài: hai bé 1 và bé 2 chơi trò kéo búa bao
    búa thắng kéo
    bao thắng búa
    kéo tháng bao

    hai bé 1 và 2 cũng choi kéo bua bao cho đến khi có bé nào thắng 3 trận liên tiếp là thắng chung cuộc. Code em viết thử nhưng chạy không đúng, các anh chỉ chỉ dùm chỗ sai cho em với, em cám ơn.
    Code:
    #include<iostream.h>
    int kbb(int a,int b); 
    int main()
    {
    	int m,n,i=0,j=0;
    	cout<<"\n********CUOC THI KEO BUA BAO***********";
    
    	cout<<"\nLUAT CHOI:\nChon keo: nhap 1\nChon bua: nhap 2\nChon bao: nhap 3\n";	
    	
    	while(i<3&&j<3)
    	{	
    		do
    		{
    			cout<<"\nBe 1 chon:";
    			cin>>m;
    			cout<<"Be 2 chon:";
    			cin>>n;
    		}
    		while((kbb(m,n)==0));
    			cout<<"\n\t\tBe "<<kbb(m,n)<<" thang\n";
    			if(kbb(m,n)==1)
    			{
    				i++;
    				j=0;
    			}
    			if(kbb(m,n)==2)
    			{
    				j++;
    				i=0;
    			}
    			if(kbb(m,n)==0)
    			{
    				i=0;
    				j=0;
    			}
    			if(i==3)
    			{
    				cout<<"\n*********KET QUA TOAN CUOC CHOI********\n";
    				cout<<"\n\t\tBE 1 THANG \n";
    			}
    			if(j==3)
    			{
    				cout<<"\n*********KET QUA TOAN CUOC CHOI********\n";	
    				cout<<"\n\t\tBE 2 THANG \n";
    			}
    	}
    }
    int kbb(int a,int b)
    {
    	if(((a==1)&&(b==2))||((a==2)&&(b==3))||((a==3)&&(b==1)))
    	return 2;
    	else
    		{
    			if(((a==2)&&(b==1))||((a==3)&&(b==2))||((a==1)&&(b==3)))
    			return 1;
    		}
    }
    Quote Quote

  2. #2
    Tham gia
    20-05-2012
    Location
    NOLA
    Bài viết
    19
    Like
    2
    Thanked 6 Times in 6 Posts
    Bạn có idea đúng nhưng có lẽ chưa biết phát triển nó vào code.

    Code:
    {
    				i++;
    				j=0;
    			}
    nếu như i (bé 1) thắng 1 lượt thì chỉ cần i++, bỏ cái j=0 ra. Why? nếu nhứ bé 2 đã thắng 2 lượt đầu j=0 sẽ reset số lượt thắng của bé 2 thành 0.
    Tương tự như vậy với
    Code:
    if(kbb(m,n)==2)
    			{
    				j++;
    				i=0;
    			}

    Code:
    if(kbb(m,n)==0)
    			{
    				i=0;
    				j=0;
    			}
    nếu như huề thì chỉ cần cout << "Huề";

    1 vấn đề nữa là bạn không cần dùng nhiều while, rồi do while như vậy. chỉ cần while(i<3 && j<3)

    Nên dùng if, else if , else thay vì if, rồi if, rồi lại if . Khi code những programs đơn giản như vậy thì vẫn OK nhưng nếu mai mốt code program phức tạp hơn sẽ tốn rất nhiều memory khi run.

    Ah còn nữa, cái int kbb(int a, int b) bạn cũng nên sữa lại sao cho nó return 1 nếu như bé 1 thắng; 2 nếu bé 2 thắng; và 0 nếu huề hoặc khi người ta input sai .

    Mình sừa code cho bạn rồi nhưng nên tự sữa sẽ giúp bạn khá hơn.

    Code:
    int kbb(int a,int b);
    int main()
    {
    	int m,n,i=0,j=0;
    	cout<<"\n********CUOC THI KEO BUA BAO***********";
    
    	cout<<"\nLUAT CHOI:\nChon keo: nhap 1\nChon bua: nhap 2\nChon bao: nhap 3\n";
    
    	while(i<3&&j<3)
    	{
    
    			cout<<"\nBe 1 chon:";
    			cin>>m;
    			cout<<"Be 2 chon:";
    			cin>>n;
    
    
                if(kbb(m,n)==1)
    			{
    				i++;
    				cout<<"\n\t\tBe "<<kbb(m,n)<<" thang\n";
    			}
    			else if(kbb(m,n)==2)
    			{
    				j++;
    				cout<<"\n\t\tBe "<<kbb(m,n)<<" thang\n";
    			}
    			else
    			{
    				cout<<"\n\t\tHue";
    			}
    	}
    
    			if(i==3)
    			{
    				cout<<"\n*********KET QUA TOAN CUOC CHOI********\n";
    				cout<<"\n\t\tBE 1 THANG \n";
    			}
    			if(j==3)
    			{
    				cout<<"\n*********KET QUA TOAN CUOC CHOI********\n";
    				cout<<"\n\t\tBE 2 THANG \n";
    			}
    	}
    
    int kbb(int a,int b)
    {
        if (a==b || a>3 || b>3)
            return 0;
        else if ( (a==1 && b==3) || (a==2 && b==1) || (a==3 && b==2) )
            return 1;
        else
            return 2;
    }

  3. Thành viên Like bài viết này:


  4. #3
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Nên chứa trị của hàm trả về vào một biến để tránh hàm bị gọi nhiều lần cho cùng một trị tham số. Nếu không thì nên dùng switch/case.

    Tuy nhiên đếm số lần thắng thua liên tiếp mà dùng i, j thì rườm rà quá. Ở đây ta chỉ có 2 người chơi nên dùng âm dương là được rồi

    Giải thuật:
    đặt kq là kết quả hàm so sánh, dt là điểm đang diễn tiến.
    Khởi đầu dt là 0
    Hàm so sánh trả về 0 nếu hoà, 1 nếu a thắng, -1 nếu b thắng
    Nếu dt*kq <= 0 thì dt = 0 (đổi người đang thắng)
    dt = dt + kq
    Nếu dt vươt qua mức +-3 thì một người thắng cuộc

  5. Thành viên Like bài viết này:


  6. #4
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Code:
    // code chơi kéo búa bao
    // búa = 1, kéo = 2, bao = 3
    
    int NhapKeoBuaBao(int n);
    int SoSanhKeoBuaBao(int n1, int n2);
    
    // code chính
    
    int kqDienTien = 0; kqVan = 0;
    
    while (kqDienTien > -3 && kqDienTien < 3)
    {
      // code gọi hàm dưới đây giả sử compiler không tính theo stack
      // tức là nó sẽ tính tham sô thứ 1 trước thám số thứ 2
      // nếu complier tính theo stack, tính tham số thứ 1 sau cùng thì đổi, đưa 2 lên trước
      kqVan = SoSanhKeoBuaBao(NhapKeoBuaBao(1), NhapKeoBuaBao(2));
      // code tính kết quả diễn tiến
      // nếu kết quả ván là hòa thì xóa kết quả diễn tiến
      // nếu đổi dấu (đang thắng thành thua, thì theo kết quả ván,
      // nếu không đổi dấu (tiếp tục thắng) thì cộng thêm kết quả diễn tiến
      kqDienTien = (kqVan==0)? 0 : (kqVan*kqDienTien < 0)? kqVan : kqDienTien + kqVan; 
    }
    
    printf("%d thắng", (kqDienTien > 0)? 1 : 2);
    
    // hết
    
    
    // các hàm liên hệ:
    
    int kqDienTien = 0;
    while (kqDienTien > -3 && kqDienTien < 3)
    {
      n1 = 0
      while (!n1)
      {
        scanf(*n1)
      }
    }
    
    int NhapKeoBuaBao(int n)
    {
      printf("Người thứ %d (1=búa, 2=búa, 3=bao) ", n);
      while (1)
      {
        scanf("%d", &n);
        if (n >= 1 && n <= 3) return n;
        printf("Đã bảo chỉ nhập 1, 2, hoăc 3. Mần ơn nhập lại\n");
      }
    }
    
    int SoSanhKeoBuaBao(int n1, int n2)
    // hàm trả vè 0 nếu hòa, 1 nếu n1 > n2, -1 nếu n1 < n2
    {
      switch (n1-n2)
      {
        case 0: return 0;
        case 1: case -2: return 1;
        default: return -1;
      }
    }

  7. Thành viên Like bài viết này:


Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •