[QUOTE=12520980;188093]cái hàm v(), q() của bác là thế nào vậy?[/QUOTE]
cái đó để lấy giá trị của “quan” với “loai”! tại không muốn đặt biến public nên phải làm 2 cái hàm! mà để biến public thì cũng bị hiện lỗi như z! ![]()
Bác up code lên e xem với :D, em đoạn này thử bác
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
//tao class bai
class bai
{
int quan;//quan: A 2 3 4 .... J Q K
int loai;//loai : ♥ ♦ ♣ ♠
//khoi tao khong tham so
public bai()
{
quan = 0;
loai = 0;
}
//khoi tao co tham so
public bai(int a, int b)
{
quan = a;
loai = b;
}
//khoi tao chep
public bai(bai a)
{
quan = a.quan;
loai = a.loai;
}
public void xuat()
{
switch (quan)
{
case 1: Console.Write("A"); break;
case 11: Console.Write("J"); break;
case 12: Console.Write("Q"); break;
case 13: Console.Write("K"); break;
default: Console.Write(quan); break;
}
switch (loai)
{
case 1: Console.Write("♥"); break;
case 2: Console.Write("♦"); break;
case 3: Console.Write("♣"); break;
case 4: Console.Write("♠"); break;
}
}
public int q()
{
return quan;
}
public int l()
{
return loai;
}
}
static byte sosanh(bai v, bai n)
{
if (v.q()>n.q() || (v.q()==n.q() && v.l()<n.l())) return 1;
else return 0;
}
static void doi(ref bai a,ref bai b)
{
bai c = new bai(a);
a = b;
b = c;
}
static void Main(string[] args)
{
bai[,] bbai;
byte[,] chia;//mang nay tinh xem quan bai da duoc chia chua?
chia = new byte[4, 13];//tuong ung voi vi tri cua la bai trong bo bai
bbai = new bai[4, 13];//mang bo bai gom 52 la 4x13
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j++)
{
bbai[i, j] = new bai(j + 1, i + 1);
chia[i, j] = 0;
}
}
int player;
bai[,] pl;
pl = new bai[4, 13];
Random ranq, ranl;
ranq = new Random(unchecked((int)DateTime.Now.Ticks));
ranl = new Random(unchecked((int)DateTime.Now.Ticks));
int q, l;
do
{
Console.Write("nhap so nguoi choi : ");
player = int.Parse(Console.ReadLine());
} while (player < 1 || player > 4);
//thao tac chia bai
int a, b;
for (a = 0; a < 13; a++)
{
for (b = 0; b < player; b++)
{
//lay ngau nhien la bai: ngau nhien gia tri va loai bai
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
chia[l, q] = 1;//quan bai da duoc chia
pl[b, a] = bbai[l, q];//phat cho player
}
}
for (a = 0; a < player; a++)
for (b = 0; b < 13; b++)
for (int c = b+1; c < 13; c++)
if (sosanh(pl[a, b], pl[a, c]) == 1)
{
//bai d = new bai(pl[a, b]);
//pl[a, b] = pl[a, c];
//pl[a, c] = d;
doi(ref pl[a, b],ref pl[a, c]);
}
//xuat bai cua cac player
for (a = 0; a < player; a++)
{
Console.WriteLine("Nguoi choi " + (a + 1));
Console.Write(" ");
for (b = 0; b < 13; b++)
{
pl[a, b].xuat();
Console.Write(" ");
}
Console.WriteLine();
Console.WriteLine();
}
Console.ReadLine();
}
}
}
[QUOTE=11520104;188088]
code này là thự hiện sắp xếp cho từng player
for (a = 0; a < 4; a++)
{
for (b = 0; b < 13; b++)
{
for (int c = 1; c < 13; c++)
{
if (sosanh(pl[a, c], pl[a, b]) == 1) doi(pl[a, c], pl[a, b]);
}
}
}
ai biết chỉ giúp em luôn cái! (_ !)[/QUOTE]
oài! lỗi ở chỗ này đây! ( _!) a phải nhỏ hơn player! cắm mắt cho nó <4!
lúc test toàn nhập 3 với 2! nó báo lỗi! ![]()
Mình có một cách rất đơn giản, dễ hiểu, đó là dùng List<bai> để mô phỏng bộ bài:
- Đầu tiên, tạo một list có 52 lá theo thứ tự, mô phỏng bộ bài lúc ban đầu.
- Để mô phỏng 4 tụ bài, ta tạo ra 4 list rỗng.
- Lần lượt bốc từng lá bài ngẫu nhiên trong bộ bài (random từ 0 -> boBai.Count - 1), phát đều cho mỗi tụ (Remove() khỏi bộ bài, Add() vào tụ cần chia).
- Lặp lại việc chia bài cho đến khi bộ bài hết bài.
Để tiện việc so sánh các quân bài, bạn có thể cho class bai cài đặt IComparable interface. Khi đó nếu cần sort các tụ bài, ta có thể dùng hàm Sort() của List.
[QUOTE=CH0901050;188225]Mình có một cách rất đơn giản, dễ hiểu, đó là dùng List<bai> để mô phỏng bộ bài:
- Đầu tiên, tạo một list có 52 lá theo thứ tự, mô phỏng bộ bài lúc ban đầu.
- Để mô phỏng 4 tụ bài, ta tạo ra 4 list rỗng.
- Lần lượt bốc từng lá bài ngẫu nhiên trong bộ bài (random từ 0 -> boBai.Count - 1), phát đều cho mỗi tụ (Remove() khỏi bộ bài, Add() vào tụ cần chia).
- Lặp lại việc chia bài cho đến khi bộ bài hết bài.
Để tiện việc so sánh các quân bài, bạn có thể cho class bai cài đặt IComparable interface. Khi đó nếu cần sort các tụ bài, ta có thể dùng hàm Sort() của List.[/QUOTE]
y chang ý tưởng ban đầu! cơ mà vấn đề của thớt là tìm + fix lỗi cái code trong #1 chứ k phải hỏi hướng làm bài!
dù sao cũng thanks! mà forum mình close topic làm sao nhỉ??? :-w
Nếu chỉ đổi random mà chạy được thì mình không hiểu thật.
Nhìn vòng lặp random:
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
Thì nếu như chia không có bài nó sẽ treo chứ sao lại được 16 lá nhỉ?
[QUOTE=11520104;188316]y chang ý tưởng ban đầu! cơ mà vấn đề của thớt là tìm + fix lỗi cái code trong #1 chứ k phải hỏi hướng làm bài!
dù sao cũng thanks! mà forum mình close topic làm sao nhỉ??? :-w[/QUOTE]
Ý tưởng có khác đó bạn. Cấu trúc dữ liệu của bạn không có cài đặt hàm loại bỏ những lá bài đã chọn ra khỏi bộ bài mà hiện tại chỉ có khả năng đánh dấu lá bài đã chọn. Điều này dẫn đến lỗi của chương trình vì hàm random sẽ vẫn có thể rơi vào lá đã chọn.
Nếu cài đặt thêm 1 hàm nhỏ để remove lá bài giống như trong List thì sẽ ok.
[QUOTE=CH1101146;188325]Nếu chỉ đổi random mà chạy được thì mình không hiểu thật.
Nhìn vòng lặp random:
do
{
q = ranq.Next(0, 13);
l = ranl.Next(0, 4);
} while (chia[l, q] == 1);//dieu kien: neu la bai chia roi thi lam lap lai thao tac
Thì nếu như chia không có bài nó sẽ treo chứ sao lại được 16 lá nhỉ?[/QUOTE]
lúc test thấy random 4 lá trong phỏm thứ nhất (4 trong 13 lá bài đầu) tiếp tục như z cho 3 phỏm còn lại!
là 16 lá! còn vì sao lại z thì cũng k hiểu!