データ構造実践プロジェクトのロシアのルーレット賭けゲーム

39829 ワード

ロシアのルーレット賭博は、多くの人が聞いたことがあるだろう.残忍な賭博ゲームだ.ゲームの道具は左輪ピストルで、そのルールも簡単です.左輪ピストルの6つの弾槽に1つ以上の弾丸を勝手に入れ、回転輪を任意に回転させた後、回転輪を閉めます.ゲームの参加者は交代でピストルを自分に向けて、引き金を引く:銃に当たったり、怯えたりして、負けた側です.最後まで頑張れば勝者だ.
本節の実践項目はラウンド賭けと似ています.
ゲームのルール
:n人の参加者は1つのリングに並んで、毎回司会者が左輪ピストルに弾丸を入れて、ランダムに回転して回転輪を閉めて、ゲームは最初の人から、交代で銃を持っています.撃たれた者は賭博テーブルを脱退し、脱退した者の次の人は第一人者として次のゲームを開始する.最後に残りの一人が勝者になるまで.要求:ルーレットのゲームルールをシミュレートし、ゲームの最終勝者を見つける.
せっけい構想
同様の問題を解決するには、リニア・テーブルを用いたシーケンス・ストレージ構造とチェーン・ストレージ構造の両方が実現され、ゲームのルールに従って、チェーン・ストレージ構造を使用する場合、ループ・チェーン・テーブルを使用するだけで簡単に問題を解決できます.
シーケンスストレージ構造シミュレーションホイール賭け
シーケンスストレージ構造を採用する場合も、配列の先頭と末尾を頭の中で接続します.すなわち、配列の最後の位置から次の位置を探す必要がある場合、配列の最初の位置にジャンプすることができます.(余剰演算で解決)
実装コードは次のとおりです.
  1. #include
  2. #include #include typedef struct gambler{ int number; }gambler;
    int main(){ int n; int round=1; int location=1; int shootNum; int i,j; srand((int)time(0));// ( , , ) printf(" :"); scanf("%d",&n); printf(" 1-%d
    ",n);
    gambler gamblers[n+1];// for (i=1;i<=n; i++) {// gamblers[i].number=i; } // , while (n!=1) { printf(" %d , %d ,",round,gamblers[location].number); shootNum=rand()%6+1; printf(" %d
    ",shootNum);
    for (i=location; i<location+shootNum; i++);// (i-1 , i ) i=i%n;// , i if (i==1 || i==0) {// i=1 i=0 , , i i=n+i; } printf(" %d , :
    ",gamblers[i-1].number);
    // , , for (j=i-1; j+1<=n; j++) { gamblers[j]=gamblers[j+1]; } n--;// n n-1 for (int k=1; k<=n; k++) { printf("%d ",gamblers[k].number); } printf("
    ");
    location=i-1;//location // location if (location>n) { location%=n; } round++; } printf(" :%d
    ",gamblers[1].number);
    }

    :5
    1-5
    1 , 1 , 4
    4 , :
    1 2 3 5
    2 , 5 , 6
    1 , :
    2 3 5
    3 , 2 , 2
    3 , :
    2 5
    4 , 5 , 5
    5 , :
    2
    :2
    , , 。

     
         
    1. #include
    2. #include
    3. #include
    4. typedef enum {false,true} bool;
    5. typedef struct line{
    6. int No;
    7. struct line * next;
    8. }line;
    9. // ,
    10. void initLine(line ** head,int n){
    11. *head=(line*)malloc(sizeof(line));
    12. (*head)->next=NULL;
    13. (*head)->No=1;
    14. line * list=*head;
    15. for (int i=1; i<n; i++) {
    16. line * body=(line*)malloc(sizeof(line));
    17. body->next=NULL;
    18. body->No=i+1;
    19. list->next=body;
    20. list=list->next;
    21. }
    22. list->next=*head;//
    23. }
    24. //
    25. void display(line * head){
    26. line * temp=head;
    27. while (temp->next!=head) {
    28. printf("%d ",temp->No);
    29. temp=temp->next;
    30. }
    31. printf("%d
      ",temp->No);
    32. }
    33. int main() {
    34. line * head=NULL;
    35. srand((int)time(0));
    36. int n,shootNum,round=1;
    37. printf(" :");
    38. scanf("%d",&n);
    39. initLine(&head,n);
    40. line* lineNext=head;//
    41. // , ,
    42. while (head->next!=head) {
    43. printf(" %d , %d ,",round,lineNext->No);
    44. shootNum=rand()%n+1;
    45. printf(" %d
      ",shootNum);
    46. line *temp=lineNext;
    47. // ,
    48. for (int i=1; i<shootNum-1; i++) {
    49. temp=temp->next;
    50. }
    51. // ,
    52. printf(" %d , :
      ",temp->next->No);
    53. line * del=temp->next;
    54. temp->next=temp->next->next;
    55. if (del==head) {
    56. head=head->next;
    57. }
    58. free(del);
    59. display(head);
    60. //
    61. lineNext=temp->next;
    62. round++;//
    63. }
    64. printf(" :%d
      ",head->No);
    65. return 0;
    66. }

    の :
    ギャンブラー の :5
    1ラウンド から、 1の から、 は4 の き を くと ります
    4の は を し、 りの の は の りである.
    1 2 3 5
    2ラウンド から、 5の から、 は3 の き を くと ります
    2の は を し、 りの の は の りである.
    1 3 5
    3ラウンド から、 3の から、 は4 の き を くと ります
    3 の は を し、 りの の は の りである.
    1 5
    4ラウンド から、 5の から、 は4 の き を くと ります
    1の は を し、 りの の は の りである.
    5
    に した の は:5です.
    まとめ
    このセクションでは、ホイール けの さなゲームを りて、リニアテーブルの ストレージ とチェーンストレージ を し、プロジェクトの に じて2つの コードの を で することができれば、 の の に に ることができます.