Ý tưởng viết game cờ cá ngựa c++

Mình đang làm bài tập viết game cơ cá ngựa c++…
+Mình dùng mảng 1 chiều để đánh số các vị trí từ 0-48 , (0,11,23,47 là vị trí xuất phát của người chơi 1,2,3,4)nhưng bị vướn lúc xuất mảng ra dưới dạng bàn cờ ( ma trận mxn);
+Mình còn vướn ở vòng lặp if cứ if lồng trong if hoài (chăng hạn khi xingau=1||xingau=6 thì đc ra quân , xong if(xingau=1||xingau=6) thì hỏi có ra quân ko rồi cứ if vậy hoai.
=>Mọi người ai có ý nào hay giúp với :smiley:

so sánh 2 dấu bằng bạn êu :v
Còn cách vẽ thì dùng gotoxy(x,y) :v

1 Like

Bạn nói rõ chỗ gotoxy đc ko mình xài VS 2013

Để so sánh xem a = b hay không thì viết là if (a==b) chứ không phải là a = b nhé!

uhm mình viết tượng trưng cho nhanh đó mà :smiley:

gotoxy(x,y) là đưa con trỏ đến vị trí x,y trên màn hình console.
anyway, show code ra cho mọi người dòm cho dễ nhìn lỗi :slight_smile:

1 Like

giả sử mình muốn gán các giá trị 0 đến 47 , và in ra hình bàn cờ thế này …có cách nào dùng vòng lặp in đc ko

Dùng vòng lặp đc, nếu bạn tìm ra quy luật ._.
Nhưng có vẻ cái bảng trên thì ko có quy luật :stuck_out_tongue:

1 Like

Ngồi thử vẽ ra tọa độ vài ô để tìm quy luật, cuối cùng viết hết 48 ô cũng méo ra :joy:

[ 8, 1]  0
[ 8, 2]  1
[ 8, 3]  2
[ 8, 4]  3
[ 8, 5]  4
[ 8, 6]  5
[ 9, 6]  6
[10, 6]  7
[11, 6]  8
[12, 6]  9
[13, 6] 10
[13, 7] 11
[13, 8] 12
[12, 8] 13
[11, 8] 14
[10, 8] 15
[ 9, 8] 16
[ 8, 8] 17
[ 8, 9] 18
[ 8,10] 19
[ 8,11] 20
[ 8,12] 21
[ 8,13] 22
[ 7,13] 23
[ 6,13] 24
[ 6,12] 25
[ 6,11] 26
[ 6,10] 27
[ 6, 9] 28
[ 6, 8] 29
[ 5, 8] 30
[ 4, 8] 31
[ 3, 8] 32
[ 2, 8] 33
[ 1, 8] 34
[ 1, 7] 35
[ 1, 6] 36
[ 2, 6] 37
[ 3, 6] 38
[ 4, 6] 39
[ 5, 6] 40
[ 6, 6] 41
[ 6, 5] 42
[ 6, 4] 43
[ 6, 3] 44
[ 6, 2] 45
[ 6, 1] 46
[ 7, 1] 47
for (int i = 0; i < 4; i++)
{
    cout << "Nguoi Choi " << i + 1 << " Nhap So Nut"; cin >> NguoiChoi[i].SoNut;
    NguoiChoi[i].SoCaNgua = 0;
    if (NguoiChoi[i].SoNut == 6 || NguoiChoi[i].SoNut == 1 && NguoiChoi[i].SoCaNgua == 0)
    {
        NguoiChoi[i].CaNgua[i] = i * 12;
        a[i * 12] = i + 65;
        NguoiChoi[i].SoCaNgua++;
        NguoiChoi[i].SoNut3 = 0;

        Goi(a);
        cout << "Nguoi Choi " << i + 1 << " Nhap So Nut"; cin >> NguoiChoi[i].SoNut;
        if (NguoiChoi[i].SoNut == 6 || NguoiChoi[i].SoNut == 1 && NguoiChoi[i].SoCaNgua == 1)
        {

            a[i * 12] = 'O';
            NguoiChoi[i].CaNgua[i] += NguoiChoi[i].SoNut;
            a[NguoiChoi[i].CaNgua[i]] = 65 + i;
            NguoiChoi[i].SoNut4 = 0;
            Goi(a);
            cout << "Nguoi Choi " << i + 1 << " Nhap So Nut"; cin >> NguoiChoi[i].SoNut;
        }
        Goi(a);
        if (NguoiChoi[i].SoNut != 6 || NguoiChoi[i].SoNut != 1 && NguoiChoi[i].SoNut4 == 0 && NguoiChoi[i].SoCaNgua == 1)
        {
            a[NguoiChoi[i].CaNgua[i]] = 'O';
            NguoiChoi[i].CaNgua[i] += NguoiChoi[i].SoNut;
            a[NguoiChoi[i].CaNgua[i]] = 65 + i;
            if (NguoiChoi[i].SoNut == 6 || NguoiChoi[i].SoNut == 1 && NguoiChoi[i].SoCaNgua >= 1)
            {
                char c;
                cout << "ban co muon xuat quan ko "; cin >> c;
                switch (c)
                {
                    case'c':
                    NguoiChoi[i].CaNgua[NguoiChoi[i].SoCaNgua] = i * 12;
                    a[NguoiChoi[i].CaNgua[NguoiChoi[i].SoCaNgua]] = i + 65;
                    NguoiChoi[i].SoCaNgua++;
                    Goi(a);
                    break;
                }
            }
        }
        Goi(a);
    }
}

Mình khá rồi ở điều kiện if , cứ if lồng trong if mãi , dùng while thì nó báo lỗi ( cái điều kiện di chuyển trong cờ cá ngựa á) , mình làm nó cứ xoay vòng vòng

Nếu xem bàn cờ như 1 hệ tọa độ descartes, trục hoành là giá trị của x, trụng tung là giá trị của y, thử tưởng tượng, bạn muốn vẽ một bàn cờ như trên trong vòng lặp for thì với mỗi giá trị z tại vòng lặp (z chạy từ 1-> 47), bạn phải tìm được 2 giá trị x và y :

ax + by = z

Có nghĩa là phải có một quy luật nào đó để mỗi giá trị của z sẽ có 1 và chỉ 1 cặp nghiệm x và y và ngược lại. Vì nhìn trong hình thì độ thị của bạn lại không phải là đường thẳng, nên để lấy được tập nghiệm này, nó phải là tập hợp của các phương trình và bất phương trình :

ax + by < = 47
ax + by >= 1
x <= 13
y <= 13
a1x + b1y = z1
a2x + b2y = z2 ........ v v.

Do đó cách tốt nhất để bạn tổ chức dữ liệu cho bàn cờ này là sử dụng 1 danh sách liên kết : mảng 2 chiều Arr[x,y] | struct, Class, … Trong đó, x,y là chứa giá trị tọa độ của node trên bàn cờ.
Bạn “for” (đối với danh sách liên kết thì có kiểu “for” khác nhé :smiley: ) quanh cái danh sách liên kết đó, tại mỗi phần tử thì lấy giá trị x,y ra, sau đó sử dụng hàm gotoxy(x,y) , rồi muốn vẽ ký từ nào vào vị trí đó thì vẽ.

Có thể mình chưa tìm ra luật sinh cho bài toán này, nhưng nếu nó có thì việc cài đặt chắc cũng là không đơn giản.

1 Like

uhm do mình muốn in màu khác nhau cho môzi người chơi…nên mình dùng 8 for…mình vẽ đc rồi…mình dùng mảng 1 chiều để dễ truy xuất.
giờ còn giải thuật ,đg rồi ở điều kiện di chuyển quân cờ…

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