Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // khung ma nguon nay su dung cho Bai Tap 2 Lab 06
- // can doc ky cac phan comment de hieu muc dich cua cac cau truc va ham
- // lan luot cai dat cac ham theo thu tu xuat hien trong ham main
- // kiem tra ky viec hoat dong cua moi ham (bang cach in ra cac thong tin)
- // co the kiem tra lan luot moi ham bang cach comment cac ham khac
- // hien tai chi cho phep choi 1 van la ket thuc
- // ma nguon nay dich duoc (khong co loi dich)
- // nhung se khong chay duoc do chua co cai dat cho ham
- #include <iostream>
- #include <iomanip>
- #include <cstring>
- #include <cstdlib>
- #include <ctime>
- #include <unistd.h>
- using namespace std;
- // SO_QUAN_BAI = SO_NGUOI_CHOI * SOQUANBAI
- // su dung mot bo bai nho de kiem tra chuong trinh
- // sau do thay doi du lieu de co bo bai thuc
- #define SO_QUAN_BAI 52 // so quan bai cua bo bai
- #define SO_NGUOI_CHOI 4 // so nguoi choi
- #define SOQUANBAI 13 // so quan bai moi nguoi nhan duoc sau khi chia bai (=MAX_SIZE)
- // dinh nghia kieu struct quan bai co 3 truong:
- // key: khoa de nhan dien quan bai (0..SO_QUAN_BAI-1).
- // Su dung khoa de xac dinh quyen uu tien giua 2 quan bai
- // sau khi thiet lap quan bai KHONG duoc phep thay doi khoa
- // index: vi tri cua quan bai trong bo bai cua nguoi choi (0..SOQUANBAI-1)
- // index giup nhanh chong xac dinh vi tri cua quan bai nay trong bo bai cua nguoi choi
- // su dung index trong viec doi cho 2 quan bai trong bo bai cua nguoi choi
- // tiepTheo: con tro chi toi quan bai tiep theo. Trong Lab06 chua su dung truong nay.
- // them cac truong de in ra so & chat cua quan bai
- struct quanbai
- {
- int key;
- std::string ten;
- int index;
- struct quanbai *tiepTheo;
- };
- typedef struct quanbai QuanBai;
- // dinh nghia mot mang cac quan bai
- QuanBai *QUAN_BAI;
- // dinh nghia kieu struct luot choi co 2 truong:
- // nguoiChoi: ai la nguoi dang choi
- // tiepTheo: ai la nguoi choi tiep theo
- struct luotchoi
- {
- int nguoiChoi;
- struct luotchoi *tiepTheo;
- };
- typedef struct luotchoi LuotChoi;
- // dinh nghia 4 luot choi cho 4 nguoi la mot mang dong
- // cac phan tu kieu con tro cua struct luotchoi
- // su dung de tao luot choi hoac loai mot nguoi choi ra khoi luot choi
- // nhu vay luot choi la mot danh sach lien ket don (vong tron)
- LuotChoi **NGUOI_CHOI;
- void So_Chat(int i, QuanBai &QUAN_BAI)
- {
- int so=i/4;
- int chat=i%4;
- std::string a,b;
- switch (chat)
- {
- case 0:
- b=6;
- break;
- case 1:
- b=5;
- break;
- case 2:
- b=4;
- break;
- case 3:
- b=3;
- break;
- }
- switch (so)
- {
- case 0:
- a="3";
- break;
- case 1:
- a="4";
- break;
- case 2:
- a="5";
- break;
- case 3:
- a="6";
- break;
- case 4:
- a="7";
- break;
- case 5:
- a="8";
- break;
- case 6:
- a="9";
- break;
- case 7:
- a="10";
- break;
- case 8:
- a="J";
- break;
- case 9:
- a="Q";
- break;
- case 10:
- a="K";
- break;
- case 11:
- a="A";
- break;
- case 12:
- a="2";
- break;
- }
- QUAN_BAI.ten=a+b;
- }
- // khoi tao bo tu lo kho ban dau co SO_QUAN_BAI quan bai
- // can khoi tao khoa key cho moi quan bai
- // index & tiepTheo van phai khoi tao mac du chua su dung
- void TaoBoTuLoKho(QuanBai *QUAN_BAI)
- {
- int i;
- for(i=0;i<SO_QUAN_BAI;i++)
- {
- (QUAN_BAI[i]).key=i;
- So_Chat(i, QUAN_BAI[i]);
- }
- }
- // khoi tao mang dong 4 nguoi choi
- // do chua xac dinh vong choi nen chua can chi con tro tiepTheo den dau
- void taoNguoiChoi(LuotChoi **NGUOI_CHOI)
- {
- int i;
- for (i=0;i<SO_NGUOI_CHOI;i++)
- {
- NGUOI_CHOI[i]= new LuotChoi;
- (NGUOI_CHOI[i])->nguoiChoi=i;
- }
- }
- // kiem tra quan bai 1 co duoc uu tien hon quan bai 2 ko (dua vao khoa key)
- bool uuTienHon(QuanBai quanBai1, QuanBai quanBai2)
- {
- if (quanBai1.key>=quanBai2.key) return true;
- else return false;
- }
- // trao bo tu lo kho
- // tao mot mang co SO_QUAN_BAI phan tu duoc sap xep mot cach ngau nhien
- // gia tri moi phan tu cua mang boTuLoKho duoc su dung nhu chi so de truy cap
- // mang QUAN_BAI de xac dinh la quan bai nao.
- // Nhu vay mang boTuLoKho co the coi la mang phu cua mang QUAN_BAI
- // thay vi phai trao QUAN_BAI, chi trao chi so cua cac quan bai
- // giup viec doi cho don gian & nhanh chong
- void traoBoTuLoKho(int *boTuLoKho)
- {
- int i,temp1,temp2,temp3;
- for(i=0;i<SO_QUAN_BAI;i++)
- {
- boTuLoKho[i]=i;
- }
- for(i=0;i<100;i++)
- {
- temp1=rand()%SO_QUAN_BAI;
- temp2=rand()%SO_QUAN_BAI;
- temp3=boTuLoKho[temp1];
- boTuLoKho[temp1]=boTuLoKho[temp2];
- boTuLoKho[temp2]=temp3;
- }
- }
- // boBaiCuaNguoiChoi la mang 2 chieu luu 4 bo bai cua 4 nguoi choi
- // soQuanBaiCuaNguoiChoi la mang 1 chieu luu so quan bai hien tai cua moi nguoi choi
- // sau khi chia bai tat ca moi nguoi choi deu co SOQUANBAI quan bai
- // lan luot chia tung quan bai trong boTuLoKho cho tung nguoi choi
- // can cap nhat truong index cua QUAN_BAI sau moi lan chia mot quan bai
- // de biet quan bai (vi du 3 bich - QUAN_BAI[0]) dang o vi tri nao trong bo bai cua nguoi choi
- void chiaBai(int *boTuLoKho, int **boBaiCuaNguoiChoi, int *soQuanBaiCuaNguoiChoi)
- {
- int i,temp;
- temp=rand()%SO_NGUOI_CHOI;
- for(i=0;i<SO_NGUOI_CHOI;i++)
- {
- boBaiCuaNguoiChoi[i]= new int[SOQUANBAI];
- soQuanBaiCuaNguoiChoi[i]=0;
- }
- for(i=0;i<SO_NGUOI_CHOI*SOQUANBAI;i++)
- {
- (boBaiCuaNguoiChoi[temp])[i/SO_NGUOI_CHOI]=boTuLoKho[i];
- (QUAN_BAI[boTuLoKho[i]]).index=i/SO_NGUOI_CHOI;
- (soQuanBaiCuaNguoiChoi[temp])++;
- temp=(temp+1)%SO_NGUOI_CHOI;
- }
- }
- // in ra bo bai cua moi nguoi choi
- // de thuan tien theo doi in ra quan bai chua choi va ca quan bai da choi
- // dua tren soQuanBaiCuaNguoiChoi de xac dinh dau la phan bai chua choi,
- // dau la phan bai da choi (mang khong day)
- void inBoBaiCuaNguoiChoi(int* boBaiCuaNguoiChoi, int soQuanBaiCuaNguoiChoi)
- {
- int i;
- cout<<endl<<"Chua choi:";
- for(i=0;i<soQuanBaiCuaNguoiChoi;i++)
- {
- cout<<" "<<setw(3)<<(QUAN_BAI[boBaiCuaNguoiChoi[i]]).ten;
- }
- cout<<endl<<"Da choi:";
- for(i=soQuanBaiCuaNguoiChoi;i<SOQUANBAI;i++)
- {
- cout<<" "<<setw(3)<<(QUAN_BAI[boBaiCuaNguoiChoi[i]]).ten;
- }
- cout<<endl;
- }
- // dua vao truong index cua quan bai 3 bich (QUAN_BAI[0])
- // de xac dinh nguoi choi co quan bai nay
- // index cua 3 bich chinh la vi tri cua quan bai nay trong bo bai cua nguoi choi
- // tra ve chi so cua nguoi choi (0..3)
- int aiCo3Bich(int **boBaiCuaNguoiChoi)
- {
- int i,temp;
- for(i=0;i<SO_NGUOI_CHOI;i++)
- {
- if ((boBaiCuaNguoiChoi[i])[(QUAN_BAI[0]).index]==0) temp=i;
- }
- return temp;
- }
- // sau khi mot quan bai duoc choi ra, can phai cap nhat boBaiCuaNguoiChoi
- // bang cach doi cho quan bai vua choi ra khoi phan mang nhung quan bai con lai
- // chu y cap nhat truong index cua nhung quan bai sau khi doi cho
- void doiCho2QuanBai(int* boBaiCuaNguoiChoi, int i, int j)
- {
- int temp;
- if (i==j) return;
- temp=boBaiCuaNguoiChoi[i];
- boBaiCuaNguoiChoi[i]=boBaiCuaNguoiChoi[j];
- boBaiCuaNguoiChoi[j]=temp;
- (QUAN_BAI[boBaiCuaNguoiChoi[i]]).index=i;
- (QUAN_BAI[boBaiCuaNguoiChoi[j]]).index=j;
- }
- // kiem tra xem da ai het bai chua de ket thuc van choi dua vao soQuanBaiCuaNguoiChoi
- // true: chua ai het bai
- // false: co mot nguoi het bai
- bool chuaAiHetBai(int* soQuanBaiCuaNguoiChoi)
- {
- int i;
- for(i=0;i<SO_NGUOI_CHOI;i++)
- {
- if (soQuanBaiCuaNguoiChoi[i]==0) return false;
- }
- return true;
- }
- // tao luot choi moi khi chi con mot nguoi choi trong luot
- // luot choi la mot danh sach lien ket (vong tron) cac NGUOI_CHOI[i];
- // tham so luotChoi truyen vao bao gio cung chi co duy nhat mot nguoi choi
- // khi ba nguoi choi mat luot hoac khi bat dau van ai choi 3 bich dau tien
- void xacDinhLuotChoi(LuotChoi **NGUOI_CHOI)
- {
- int i;
- for(i=0;i<SO_NGUOI_CHOI-1;i++)
- {
- (NGUOI_CHOI[i])->tiepTheo=NGUOI_CHOI[i+1];
- }
- (NGUOI_CHOI[i])->tiepTheo=NGUOI_CHOI[0];
- }
- // cap nhat danh sach luotChoi khi mot nguoi choi mat luot
- void nguoiChoiMatLuot(LuotChoi *luotChoi)
- {
- LuotChoi *temp=luotChoi;
- while((temp->tiepTheo)->nguoiChoi!=luotChoi->nguoiChoi)
- {
- temp=temp->tiepTheo;
- }
- temp->tiepTheo=luotChoi->tiepTheo;
- }
- // in ra danh sach luot nguoi choi trong vong de thuan tien theo doi
- // do danh sach luotChoi la vong tron nen can co tham so soNguoiChoiTrongLuot
- // de biet khi nao dung
- void inLuotChoi(LuotChoi *luotChoi, int soNguoiChoiTrongLuot)
- {
- int i;
- cout<<"Nguoi Choi trong luot: ";
- for(i=0;i<soNguoiChoiTrongLuot;i++)
- {
- cout<<luotChoi->nguoiChoi+1<<" ";
- luotChoi=luotChoi->tiepTheo;
- }
- cout<<"So Nguoi Choi: "<<soNguoiChoiTrongLuot<<endl;
- }
- // chon mot quan bai bat ky trong bo bai cua nguoi choi
- // su dung ham rand de lay mot vi tri ngau nhien trong boBaiCuaNguoiChoi.
- // Tra ve la quan bai thuc trong mang QUAN_BAI voi chi so la gia tri tai vi tri
- // vua sinh ngau nhien trong boBaiCuaNguoiChoi.
- QuanBai chonBai(int* boBaiCuaNguoiChoi, int soQuanBaiCuaNguoiChoi)
- {
- int temp=rand()%soQuanBaiCuaNguoiChoi;
- return QUAN_BAI[boBaiCuaNguoiChoi[temp]];
- }
- // dua vao truong index cua quanBaiSeChoi de xac dinh vi tri quan bai trong boBaiCuaNguoiChoi
- // doi cho quan bai nay voi quan bai cuoi cung trong bo bai con lai cua boBaiCuaNguoiChoi
- // cap nhat soQuanBaiCuaNguoiChoi
- void choiBai(int* boBaiCuaNguoiChoi, int& soQuanBaiCuaNguoiChoi, QuanBai quanBaiSeChoi)
- {
- doiCho2QuanBai(boBaiCuaNguoiChoi, quanBaiSeChoi.index, (soQuanBaiCuaNguoiChoi-1));
- soQuanBaiCuaNguoiChoi--;
- }
- void intatca(int **boBaiCuaNguoiChoi, int *soQuanBaiCuaNguoiChoi)
- {
- int i;
- for(i=0;i<SO_NGUOI_CHOI;i++)
- {
- cout << "Nguoi Choi "<<i+1<<": "; inBoBaiCuaNguoiChoi(boBaiCuaNguoiChoi[i], soQuanBaiCuaNguoiChoi[i]); cout << endl;
- }
- }
- int main(int argc, char *argv[])
- {
- srand(time(NULL));
- int i;
- LuotChoi *luotChoitam;
- bool boluot;
- // tao bo tu lo kho co SO_QUAN_BAI quan bai
- QUAN_BAI = new QuanBai[SO_QUAN_BAI];
- TaoBoTuLoKho(QUAN_BAI);
- // tao SO_NGUOI_CHOI nguoi choi
- NGUOI_CHOI = new LuotChoi*[SO_NGUOI_CHOI];
- taoNguoiChoi(NGUOI_CHOI);
- // khai bao bo tu lo kho co SO_QUAN_BAI quan bai
- // luu chi so cua cac quan bai trong mang QUAN_BAI
- int *boTuLoKho;
- boTuLoKho = new int[SO_QUAN_BAI];
- // khai bao SO_NGUOI_CHOI bo bai nguoi choi
- int **boBaiCuaNguoiChoi;
- boBaiCuaNguoiChoi = new int*[SO_NGUOI_CHOI];
- // khai bao mang luu so quan bai cua moi boBaiCuaNguoiChoi (mang khong day)
- int *soQuanBaiCuaNguoiChoi;
- soQuanBaiCuaNguoiChoi = new int[SO_NGUOI_CHOI];
- // trao bo tu (thuc chat trao chi so cac quan bai)
- traoBoTuLoKho(boTuLoKho);
- // thuc hien chia boTuLoKho cho nguoi choi boBaiCuaNguoiChoi
- chiaBai(boTuLoKho, boBaiCuaNguoiChoi, soQuanBaiCuaNguoiChoi);
- // bien quan ly so nguoi choi trong vong choi hien tai
- // can co bien nay do luotChoi la danh sach lien ket don vong tron
- int soNguoiChoiTrongLuot;
- // bien luu quanBaiVuaChoi cua nguoi choi truoc do
- // bien luu quanBaiSeChoi cua nguoi choi hien tai
- QuanBai quanBaiVuaChoi, quanBaiSeChoi;
- // khai bao luotChoi. Do luot choi la danh sach lien ket don vong tron
- // nen khong can phai co head. Co the su dung luotChoi nhu la bien chay
- // tren danh sach lien ket don vong tron luotChoi
- LuotChoi *luotChoi;
- // xac dinh nguoi choi dau tien cua luot choi trong van moi
- // la nguoi co 3 bich
- luotChoi = NGUOI_CHOI[aiCo3Bich(boBaiCuaNguoiChoi)];
- // xac dinh luot choi: la danh sach lien ket don vong tron
- xacDinhLuotChoi(NGUOI_CHOI);
- // dau luot choi moi khoi tao bien quan ly so nguoi choi.
- soNguoiChoiTrongLuot = SO_NGUOI_CHOI;
- // choi quan bai 3 bich dau tien
- quanBaiSeChoi = QUAN_BAI[0];
- quanBaiVuaChoi=QUAN_BAI[0];
- boluot=true;
- do
- {
- system("CLS");
- inLuotChoi(luotChoi, soNguoiChoiTrongLuot); cout << endl;
- // sau khi nguoi choi chon bai, phai kiem tra quyen uu tien cua quan bai duoc chon
- // va quan bai vua duoc choi ra
- if (uuTienHon(quanBaiSeChoi, quanBaiVuaChoi))
- {
- // neu uu tien hon cho phep choiBai
- // in ra cac thong tin can thiep
- // cap nhat quan bai vua choi
- // cap nhat danh sach luot choi (ai se la nguoi choi tiep theo)
- boluot=false;
- cout<<"Nguoi Choi "<<luotChoi->nguoiChoi+1<<" vua choi quan: "
- <<(QUAN_BAI[(boBaiCuaNguoiChoi[luotChoi->nguoiChoi])[quanBaiSeChoi.index]]).ten<<endl;
- choiBai(boBaiCuaNguoiChoi[luotChoi->nguoiChoi],
- soQuanBaiCuaNguoiChoi[luotChoi->nguoiChoi],
- quanBaiSeChoi);
- quanBaiVuaChoi = quanBaiSeChoi;
- }
- else
- {
- // neu khong nguoi choi se mat luot, cap nhat danh sach luotChoi
- luotChoitam=luotChoi;
- luotChoi=luotChoi->tiepTheo;
- nguoiChoiMatLuot(luotChoitam);
- boluot=true;
- // cap nhat so nguoi choi trong luot
- // neu chi con mot nguoi
- // tao luot choi moi dua tren nguoi con lai duy nhat trong luot choi hien tai
- // (danh sach lien ket tron luotChoi)
- // chu y: luot choi moi thi choi con gi cung duoc
- // de thoa man dieu kien kiem tra uu tien, su dung 3 bich la quan bai vua choi
- // -> tiep theo choi quan bai nao cung duoc uu tien het
- soNguoiChoiTrongLuot--;
- if(soNguoiChoiTrongLuot==1)
- {
- xacDinhLuotChoi(NGUOI_CHOI);
- soNguoiChoiTrongLuot=SO_NGUOI_CHOI;
- quanBaiVuaChoi = QUAN_BAI[0];
- }
- // in ra cac thong tin can thiet
- cout<<"Nguoi Choi "<<luotChoitam->nguoiChoi+1<<" bo luot!"<<endl;
- }
- // xac dinh nguoi choi tiep theo dua vao danh sach lien ket luotChoi
- // nguoi vua choi xong chinh la luotChoi
- // giup nguoi choi chon mot quan bai de choi
- // cho ma nguon thuc hien cac cong viec tren vao day
- if(boluot==false) luotChoi=luotChoi->tiepTheo;
- quanBaiSeChoi=chonBai(boBaiCuaNguoiChoi[luotChoi->nguoiChoi], soQuanBaiCuaNguoiChoi[luotChoi->nguoiChoi]);
- // in ra luot choi bai va bo bai cua moi nguoi choi (bao gom quan bai chua choi & da choi)
- cout<<endl;
- intatca(boBaiCuaNguoiChoi, soQuanBaiCuaNguoiChoi);
- system("PAUSE");
- // usleep(100*1000);
- }
- // van bai ket thuc khi co mot nguoi choi het bai
- while (chuaAiHetBai(soQuanBaiCuaNguoiChoi));
- for(i=0;i<soNguoiChoiTrongLuot-1;i++)
- {
- luotChoi=luotChoi->tiepTheo;
- }
- cout <<endl<< "Nguoi Choi " << luotChoi->nguoiChoi+1 << " het bai truoc, thang!" << endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment