Duclv

Bài Tú Lơ Khơ ver 1

Mar 22nd, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.28 KB | None | 0 0
  1. // khung ma nguon nay su dung cho Bai Tap 2 Lab 06
  2. // can doc ky cac phan comment de hieu muc dich cua cac cau truc va ham
  3. // lan luot cai dat cac ham theo thu tu xuat hien trong ham main
  4. // kiem tra ky viec hoat dong cua moi ham (bang cach in ra cac thong tin)
  5. // co the kiem tra lan luot moi ham bang cach comment cac ham khac
  6. // hien tai chi cho phep choi 1 van la ket thuc
  7. // ma nguon nay dich duoc (khong co loi dich)
  8. // nhung se khong chay duoc do chua co cai dat cho ham
  9.  
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <cstring>
  13. #include <cstdlib>
  14. #include <ctime>
  15. #include <unistd.h>
  16.  
  17. using namespace std;
  18.  
  19. // SO_QUAN_BAI = SO_NGUOI_CHOI * SOQUANBAI
  20. // su dung mot bo bai nho de kiem tra chuong trinh
  21. // sau do thay doi du lieu de co bo bai thuc
  22. #define SO_QUAN_BAI 52          // so quan bai cua bo bai
  23. #define SO_NGUOI_CHOI 4         // so nguoi choi
  24. #define SOQUANBAI 13             // so quan bai moi nguoi nhan duoc sau khi chia bai (=MAX_SIZE)
  25.  
  26. // dinh nghia kieu struct quan bai co 3 truong:
  27. // key: khoa de nhan dien quan bai (0..SO_QUAN_BAI-1).
  28. // Su dung khoa de xac dinh quyen uu tien giua 2 quan bai
  29. // sau khi thiet lap quan bai KHONG duoc phep thay doi khoa
  30. // index: vi tri cua quan bai trong bo bai cua nguoi choi (0..SOQUANBAI-1)
  31. // index giup nhanh chong xac dinh vi tri cua quan bai nay trong bo bai cua nguoi choi
  32. // su dung index trong viec doi cho 2 quan bai trong bo bai cua nguoi choi
  33. // tiepTheo: con tro chi toi quan bai tiep theo. Trong Lab06 chua su dung truong nay.
  34. // them cac truong de in ra so & chat cua quan bai
  35. struct quanbai
  36. {
  37.     int key;
  38.     std::string ten;
  39.     int index;
  40.     struct quanbai *tiepTheo;
  41. };
  42. typedef struct quanbai QuanBai;
  43. // dinh nghia mot mang cac quan bai
  44. QuanBai *QUAN_BAI;
  45.  
  46. // dinh nghia kieu struct luot choi co 2 truong:
  47. // nguoiChoi: ai la nguoi dang choi
  48. // tiepTheo: ai la nguoi choi tiep theo
  49. struct luotchoi
  50. {
  51.     int nguoiChoi;
  52.     struct luotchoi *tiepTheo;
  53. };
  54. typedef struct luotchoi LuotChoi;
  55. // dinh nghia 4 luot choi cho 4 nguoi la mot mang dong
  56. // cac phan tu kieu con tro cua struct luotchoi
  57. // su dung de tao luot choi hoac loai mot nguoi choi ra khoi luot choi
  58. // nhu vay luot choi la mot danh sach lien ket don (vong tron)
  59. LuotChoi **NGUOI_CHOI;
  60.  
  61. void So_Chat(int i, QuanBai &QUAN_BAI)
  62. {
  63.     int so=i/4;
  64.     int chat=i%4;
  65.     std::string a,b;
  66.     switch (chat)
  67.     {
  68.         case 0:
  69.             b=6;
  70.             break;
  71.         case 1:
  72.             b=5;
  73.             break;
  74.         case 2:
  75.             b=4;
  76.             break;
  77.         case 3:
  78.             b=3;
  79.             break;
  80.     }
  81.     switch (so)
  82.     {
  83.         case 0:
  84.             a="3";
  85.             break;
  86.         case 1:
  87.             a="4";
  88.             break;
  89.         case 2:
  90.             a="5";
  91.             break;
  92.         case 3:
  93.             a="6";
  94.             break;
  95.         case 4:
  96.             a="7";
  97.             break;
  98.         case 5:
  99.             a="8";
  100.             break;
  101.         case 6:
  102.             a="9";
  103.             break;
  104.         case 7:
  105.             a="10";
  106.             break;
  107.         case 8:
  108.             a="J";
  109.             break;
  110.         case 9:
  111.             a="Q";
  112.             break;
  113.         case 10:
  114.             a="K";
  115.             break;
  116.         case 11:
  117.             a="A";
  118.             break;
  119.         case 12:
  120.             a="2";
  121.             break;
  122.     }
  123.     QUAN_BAI.ten=a+b;
  124. }
  125.  
  126. // khoi tao bo tu lo kho ban dau co SO_QUAN_BAI quan bai
  127. // can khoi tao khoa key cho moi quan bai
  128. // index & tiepTheo van phai khoi tao mac du chua su dung
  129. void TaoBoTuLoKho(QuanBai *QUAN_BAI)
  130. {
  131.     int i;
  132.     for(i=0;i<SO_QUAN_BAI;i++)
  133.     {
  134.         (QUAN_BAI[i]).key=i;
  135.         So_Chat(i, QUAN_BAI[i]);
  136.     }
  137.    
  138. }
  139.  
  140. // khoi tao mang dong 4 nguoi choi
  141. // do chua xac dinh vong choi nen chua can chi con tro tiepTheo den dau
  142. void taoNguoiChoi(LuotChoi **NGUOI_CHOI)
  143. {
  144.     int i;
  145.     for (i=0;i<SO_NGUOI_CHOI;i++)
  146.     {
  147.         NGUOI_CHOI[i]= new LuotChoi;
  148.         (NGUOI_CHOI[i])->nguoiChoi=i;
  149.     }
  150. }
  151.  
  152. // kiem tra quan bai 1 co duoc uu tien hon quan bai 2 ko (dua vao khoa key)
  153. bool uuTienHon(QuanBai quanBai1, QuanBai quanBai2)
  154. {
  155.     if (quanBai1.key>=quanBai2.key) return true;
  156.     else return false;
  157. }
  158.  
  159. // trao bo tu lo kho
  160. // tao mot mang co SO_QUAN_BAI phan tu duoc sap xep mot cach ngau nhien
  161. // gia tri moi phan tu cua mang boTuLoKho duoc su dung nhu chi so de truy cap
  162. // mang QUAN_BAI de xac dinh la quan bai nao.
  163. // Nhu vay mang boTuLoKho co the coi la mang phu cua mang QUAN_BAI
  164. // thay vi phai trao QUAN_BAI, chi trao chi so cua cac quan bai
  165. // giup viec doi cho don gian & nhanh chong
  166. void traoBoTuLoKho(int *boTuLoKho)
  167. {
  168.     int i,temp1,temp2,temp3;
  169.     for(i=0;i<SO_QUAN_BAI;i++)
  170.     {
  171.         boTuLoKho[i]=i;
  172.     }
  173.     for(i=0;i<100;i++)
  174.     {
  175.         temp1=rand()%SO_QUAN_BAI;
  176.         temp2=rand()%SO_QUAN_BAI;
  177.         temp3=boTuLoKho[temp1];
  178.         boTuLoKho[temp1]=boTuLoKho[temp2];
  179.         boTuLoKho[temp2]=temp3;
  180.     }
  181. }
  182.  
  183. // boBaiCuaNguoiChoi la mang 2 chieu luu 4 bo bai cua 4 nguoi choi
  184. // soQuanBaiCuaNguoiChoi la mang 1 chieu luu so quan bai hien tai cua moi nguoi choi
  185. // sau khi chia bai tat ca moi nguoi choi deu co SOQUANBAI quan bai
  186. // lan luot chia tung quan bai trong boTuLoKho cho tung nguoi choi
  187. // can cap nhat truong index cua QUAN_BAI sau moi lan chia mot quan bai
  188. // de biet quan bai (vi du 3 bich - QUAN_BAI[0]) dang o vi tri nao trong bo bai cua nguoi choi
  189. void chiaBai(int *boTuLoKho, int **boBaiCuaNguoiChoi, int *soQuanBaiCuaNguoiChoi)
  190. {
  191.     int i,temp;
  192.     temp=rand()%SO_NGUOI_CHOI;
  193.     for(i=0;i<SO_NGUOI_CHOI;i++)
  194.     {
  195.         boBaiCuaNguoiChoi[i]= new int[SOQUANBAI];
  196.         soQuanBaiCuaNguoiChoi[i]=0;
  197.     }
  198.    
  199.     for(i=0;i<SO_NGUOI_CHOI*SOQUANBAI;i++)
  200.     {
  201.         (boBaiCuaNguoiChoi[temp])[i/SO_NGUOI_CHOI]=boTuLoKho[i];
  202.         (QUAN_BAI[boTuLoKho[i]]).index=i/SO_NGUOI_CHOI;
  203.         (soQuanBaiCuaNguoiChoi[temp])++;
  204.         temp=(temp+1)%SO_NGUOI_CHOI;
  205.     }
  206.    
  207. }
  208.  
  209. // in ra bo bai cua moi nguoi choi
  210. // de thuan tien theo doi in ra quan bai chua choi va ca quan bai da choi
  211. // dua tren soQuanBaiCuaNguoiChoi de xac dinh dau la phan bai chua choi,
  212. // dau la phan bai da choi (mang khong day)
  213. void inBoBaiCuaNguoiChoi(int* boBaiCuaNguoiChoi, int soQuanBaiCuaNguoiChoi)
  214. {
  215.     int i;
  216.     cout<<endl<<"Chua choi:";
  217.     for(i=0;i<soQuanBaiCuaNguoiChoi;i++)
  218.     {
  219.         cout<<" "<<setw(3)<<(QUAN_BAI[boBaiCuaNguoiChoi[i]]).ten;
  220.     }
  221.     cout<<endl<<"Da choi:";
  222.     for(i=soQuanBaiCuaNguoiChoi;i<SOQUANBAI;i++)
  223.     {
  224.         cout<<" "<<setw(3)<<(QUAN_BAI[boBaiCuaNguoiChoi[i]]).ten;
  225.     }
  226.     cout<<endl;
  227. }
  228.  
  229. // dua vao truong index cua quan bai 3 bich (QUAN_BAI[0])
  230. // de xac dinh nguoi choi co quan bai nay
  231. // index cua 3 bich chinh la vi tri cua quan bai nay trong bo bai cua nguoi choi
  232. // tra ve chi so cua nguoi choi (0..3)
  233. int aiCo3Bich(int **boBaiCuaNguoiChoi)
  234. {
  235.     int i,temp;
  236.     for(i=0;i<SO_NGUOI_CHOI;i++)
  237.     {
  238.         if ((boBaiCuaNguoiChoi[i])[(QUAN_BAI[0]).index]==0) temp=i;
  239.     }
  240.     return temp;
  241. }
  242.  
  243. // sau khi mot quan bai duoc choi ra, can phai cap nhat boBaiCuaNguoiChoi
  244. // bang cach doi cho quan bai vua choi ra khoi phan mang nhung quan bai con lai
  245. // chu y cap nhat truong index cua nhung quan bai sau khi doi cho
  246. void doiCho2QuanBai(int* boBaiCuaNguoiChoi, int i, int j)
  247. {
  248.     int temp;
  249.     if (i==j) return;
  250.     temp=boBaiCuaNguoiChoi[i];
  251.     boBaiCuaNguoiChoi[i]=boBaiCuaNguoiChoi[j];
  252.     boBaiCuaNguoiChoi[j]=temp;
  253.     (QUAN_BAI[boBaiCuaNguoiChoi[i]]).index=i;
  254.     (QUAN_BAI[boBaiCuaNguoiChoi[j]]).index=j;
  255. }
  256.  
  257. // kiem tra xem da ai het bai chua de ket thuc van choi dua vao soQuanBaiCuaNguoiChoi
  258. // true: chua ai het bai
  259. // false: co mot nguoi het bai
  260. bool chuaAiHetBai(int* soQuanBaiCuaNguoiChoi)
  261. {
  262.     int i;
  263.     for(i=0;i<SO_NGUOI_CHOI;i++)
  264.     {
  265.         if (soQuanBaiCuaNguoiChoi[i]==0) return false;
  266.     }
  267.     return true;
  268. }
  269.  
  270. // tao luot choi moi khi chi con mot nguoi choi trong luot
  271. // luot choi la mot danh sach lien ket (vong tron) cac NGUOI_CHOI[i];
  272. // tham so luotChoi truyen vao bao gio cung chi co duy nhat mot nguoi choi
  273. // khi ba nguoi choi mat luot hoac khi bat dau van ai choi 3 bich dau tien
  274. void xacDinhLuotChoi(LuotChoi **NGUOI_CHOI)
  275. {
  276.     int i;
  277.     for(i=0;i<SO_NGUOI_CHOI-1;i++)
  278.     {
  279.         (NGUOI_CHOI[i])->tiepTheo=NGUOI_CHOI[i+1];
  280.     }
  281.     (NGUOI_CHOI[i])->tiepTheo=NGUOI_CHOI[0];
  282. }
  283.  
  284. // cap nhat danh sach luotChoi khi mot nguoi choi mat luot
  285. void nguoiChoiMatLuot(LuotChoi *luotChoi)
  286. {
  287.     LuotChoi *temp=luotChoi;
  288.     while((temp->tiepTheo)->nguoiChoi!=luotChoi->nguoiChoi)
  289.     {
  290.         temp=temp->tiepTheo;
  291.     }
  292.     temp->tiepTheo=luotChoi->tiepTheo;
  293. }
  294.  
  295. // in ra danh sach luot nguoi choi trong vong de thuan tien theo doi
  296. // do danh sach luotChoi la vong tron nen can co tham so soNguoiChoiTrongLuot
  297. // de biet khi nao dung
  298. void inLuotChoi(LuotChoi *luotChoi, int soNguoiChoiTrongLuot)
  299. {
  300.     int i;
  301.     cout<<"Nguoi Choi trong luot: ";
  302.     for(i=0;i<soNguoiChoiTrongLuot;i++)
  303.     {
  304.         cout<<luotChoi->nguoiChoi+1<<" ";
  305.         luotChoi=luotChoi->tiepTheo;
  306.     }
  307.     cout<<"So Nguoi Choi: "<<soNguoiChoiTrongLuot<<endl;
  308. }
  309.  
  310. // chon mot quan bai bat ky trong bo bai cua nguoi choi
  311. // su dung ham rand de lay mot vi tri ngau nhien trong boBaiCuaNguoiChoi.
  312. // Tra ve la quan bai thuc trong mang QUAN_BAI voi chi so la gia tri tai vi tri
  313. // vua sinh ngau nhien trong boBaiCuaNguoiChoi.
  314. QuanBai chonBai(int* boBaiCuaNguoiChoi, int soQuanBaiCuaNguoiChoi)
  315. {
  316.     int temp=rand()%soQuanBaiCuaNguoiChoi;
  317.     return QUAN_BAI[boBaiCuaNguoiChoi[temp]];
  318. }
  319.  
  320. // dua vao truong index cua quanBaiSeChoi de xac dinh vi tri quan bai trong boBaiCuaNguoiChoi
  321. // doi cho quan bai nay voi quan bai cuoi cung trong bo bai con lai cua boBaiCuaNguoiChoi
  322. // cap nhat soQuanBaiCuaNguoiChoi
  323. void choiBai(int* boBaiCuaNguoiChoi, int& soQuanBaiCuaNguoiChoi, QuanBai quanBaiSeChoi)
  324. {
  325.     doiCho2QuanBai(boBaiCuaNguoiChoi, quanBaiSeChoi.index, (soQuanBaiCuaNguoiChoi-1));
  326.     soQuanBaiCuaNguoiChoi--;
  327. }
  328.  
  329. void intatca(int **boBaiCuaNguoiChoi, int *soQuanBaiCuaNguoiChoi)
  330. {
  331.     int i;
  332.     for(i=0;i<SO_NGUOI_CHOI;i++)
  333.     {
  334.         cout << "Nguoi Choi "<<i+1<<": "; inBoBaiCuaNguoiChoi(boBaiCuaNguoiChoi[i], soQuanBaiCuaNguoiChoi[i]); cout << endl;
  335.     }
  336. }
  337.  
  338. int main(int argc, char *argv[])
  339. {
  340.     srand(time(NULL));
  341.     int i;
  342.     LuotChoi *luotChoitam;
  343.     bool boluot;
  344.     // tao bo tu lo kho co SO_QUAN_BAI quan bai
  345.     QUAN_BAI = new QuanBai[SO_QUAN_BAI];
  346.     TaoBoTuLoKho(QUAN_BAI);
  347.  
  348.     // tao SO_NGUOI_CHOI nguoi choi
  349.     NGUOI_CHOI = new LuotChoi*[SO_NGUOI_CHOI];
  350.     taoNguoiChoi(NGUOI_CHOI);
  351.     // khai bao bo tu lo kho co SO_QUAN_BAI quan bai
  352.     // luu chi so cua cac quan bai trong mang QUAN_BAI
  353.     int *boTuLoKho;
  354.     boTuLoKho = new int[SO_QUAN_BAI];
  355.    
  356.     // khai bao SO_NGUOI_CHOI bo bai nguoi choi
  357.     int **boBaiCuaNguoiChoi;
  358.     boBaiCuaNguoiChoi = new int*[SO_NGUOI_CHOI];
  359.    
  360.     // khai bao mang luu so quan bai cua moi boBaiCuaNguoiChoi (mang khong day)
  361.     int *soQuanBaiCuaNguoiChoi;
  362.     soQuanBaiCuaNguoiChoi = new int[SO_NGUOI_CHOI];
  363.  
  364.     // trao bo tu (thuc chat trao chi so cac quan bai)
  365.     traoBoTuLoKho(boTuLoKho);
  366.    
  367.     // thuc hien chia boTuLoKho cho nguoi choi boBaiCuaNguoiChoi
  368.     chiaBai(boTuLoKho, boBaiCuaNguoiChoi, soQuanBaiCuaNguoiChoi);
  369.     // bien quan ly so nguoi choi trong vong choi hien tai
  370.     // can co bien nay do luotChoi la danh sach lien ket don vong tron
  371.     int soNguoiChoiTrongLuot;
  372.     // bien luu quanBaiVuaChoi cua nguoi choi truoc do
  373.     // bien luu quanBaiSeChoi cua nguoi choi hien tai
  374.     QuanBai quanBaiVuaChoi, quanBaiSeChoi;
  375.  
  376.     // khai bao luotChoi. Do luot choi la danh sach lien ket don vong tron
  377.     // nen khong can phai co head. Co the su dung luotChoi nhu la bien chay
  378.     // tren danh sach lien ket don vong tron luotChoi
  379.     LuotChoi *luotChoi;
  380.     // xac dinh nguoi choi dau tien cua luot choi trong van moi
  381.     // la nguoi co 3 bich
  382.     luotChoi = NGUOI_CHOI[aiCo3Bich(boBaiCuaNguoiChoi)];
  383.     // xac dinh luot choi: la danh sach lien ket don vong tron
  384.     xacDinhLuotChoi(NGUOI_CHOI);
  385.     // dau luot choi moi khoi tao bien quan ly so nguoi choi.
  386.     soNguoiChoiTrongLuot = SO_NGUOI_CHOI;
  387.    
  388.     // choi quan bai 3 bich dau tien
  389.     quanBaiSeChoi = QUAN_BAI[0];
  390.     quanBaiVuaChoi=QUAN_BAI[0];
  391.     boluot=true;
  392.     do
  393.     {
  394.         system("CLS");
  395.         inLuotChoi(luotChoi, soNguoiChoiTrongLuot); cout << endl;
  396.         // sau khi nguoi choi chon bai, phai kiem tra quyen uu tien cua quan bai duoc chon
  397.         // va quan bai vua duoc choi ra
  398.         if (uuTienHon(quanBaiSeChoi, quanBaiVuaChoi))
  399.         {
  400.             // neu uu tien hon cho phep choiBai
  401.             // in ra cac thong tin can thiep
  402.             // cap nhat quan bai vua choi
  403.             // cap nhat danh sach luot choi (ai se la nguoi choi tiep theo)
  404.             boluot=false;
  405.             cout<<"Nguoi Choi "<<luotChoi->nguoiChoi+1<<" vua choi quan: "
  406.                 <<(QUAN_BAI[(boBaiCuaNguoiChoi[luotChoi->nguoiChoi])[quanBaiSeChoi.index]]).ten<<endl;
  407.             choiBai(boBaiCuaNguoiChoi[luotChoi->nguoiChoi],
  408.                     soQuanBaiCuaNguoiChoi[luotChoi->nguoiChoi],
  409.                     quanBaiSeChoi);
  410.             quanBaiVuaChoi = quanBaiSeChoi;
  411.            
  412.         }
  413.         else
  414.         {
  415.             // neu khong nguoi choi se mat luot, cap nhat danh sach luotChoi
  416.             luotChoitam=luotChoi;
  417.             luotChoi=luotChoi->tiepTheo;
  418.             nguoiChoiMatLuot(luotChoitam);
  419.             boluot=true;
  420.             // cap nhat so nguoi choi trong luot
  421.             // neu chi con mot nguoi
  422.             // tao luot choi moi dua tren nguoi con lai duy nhat trong luot choi hien tai
  423.             // (danh sach lien ket tron luotChoi)
  424.             // chu y: luot choi moi thi choi con gi cung duoc
  425.             // de thoa man dieu kien kiem tra uu tien, su dung 3 bich la quan bai vua choi
  426.             // -> tiep theo choi quan bai nao cung duoc uu tien het
  427.             soNguoiChoiTrongLuot--;
  428.             if(soNguoiChoiTrongLuot==1)
  429.             {
  430.                 xacDinhLuotChoi(NGUOI_CHOI);
  431.                 soNguoiChoiTrongLuot=SO_NGUOI_CHOI;
  432.                 quanBaiVuaChoi = QUAN_BAI[0];
  433.             }
  434.             // in ra cac thong tin can thiet
  435.             cout<<"Nguoi Choi "<<luotChoitam->nguoiChoi+1<<" bo luot!"<<endl;
  436.         }
  437.         // xac dinh nguoi choi tiep theo dua vao danh sach lien ket luotChoi
  438.         // nguoi vua choi xong chinh la luotChoi
  439.         // giup nguoi choi chon mot quan bai de choi
  440.         // cho ma nguon thuc hien cac cong viec tren vao day
  441.         if(boluot==false) luotChoi=luotChoi->tiepTheo;
  442.         quanBaiSeChoi=chonBai(boBaiCuaNguoiChoi[luotChoi->nguoiChoi], soQuanBaiCuaNguoiChoi[luotChoi->nguoiChoi]);
  443.         // in ra luot choi bai va bo bai cua moi nguoi choi (bao gom quan bai chua choi & da choi)
  444.         cout<<endl;
  445.         intatca(boBaiCuaNguoiChoi, soQuanBaiCuaNguoiChoi);
  446.         system("PAUSE");
  447. //      usleep(100*1000);
  448.        
  449.     }
  450.     // van bai ket thuc khi co mot nguoi choi het bai
  451.     while (chuaAiHetBai(soQuanBaiCuaNguoiChoi));
  452.     for(i=0;i<soNguoiChoiTrongLuot-1;i++)
  453.     {
  454.         luotChoi=luotChoi->tiepTheo;
  455.     }
  456.     cout <<endl<< "Nguoi Choi " << luotChoi->nguoiChoi+1 << " het bai truoc, thang!" << endl;
  457.     system("PAUSE");
  458.     return EXIT_SUCCESS;
  459. }
Advertisement
Add Comment
Please, Sign In to add comment