C語言取牌遊戲
阿新 • • 發佈:2018-12-18
取牌遊戲
有54張撲克牌,兩個人輪流拿牌,每人每次最少取1張,最多取4張,誰拿最後一張誰輸。編寫模擬計算機先拿牌且必勝的演算法。
分析: 為了保證計算機勝利,因此最後的牌必須是人取到,而且只能剩餘1張。通過觀察發現,除去最後一張牌,還剩餘53張牌。
除去第一次計算機取牌,之後的每次計算機如果要贏得遊戲,可以根據人取了多少張牌進行調整,以保證剩餘最後一張只能給人取到。
由於人與計算機的取牌數量侷限在[1,4],因此人機每次合計取牌可控制為(1+4)=5張。
因此計算機取牌為了保證勝利,N1=(54-1)%5(求餘) 之後,計算機根據人出了多少牌進行調整,保證每次人機取牌總數為5。 即: 人取1張,計算機取4張 人取2張,計算機取3張 人取3張,計算機取2張 人取4張,計算機取1張 這樣可以保證計算機先拿牌且必勝。
//取牌必勝演算法// #include<stdio.h> int main(){ int total=54; //剩餘牌總數 int who; //標記是人還是計算機取牌,0是計算機取,1是人取 int num; //出牌數,大於等於1且小於等4 int n0; //計算機先取牌數 int N=5; //人機調整範圍 printf("******歡迎參加取牌遊戲******\n"); who=0; printf("\n標記%d\n",who); printf("計算機先取牌\n"); n0=(54-1)%N; //計算先取牌數 printf("計算機取了%d張牌\n",n0); total=total-n0; printf("現在還剩下%d張牌\n",total); while(total>=1) { who=1; printf("\n標記%d\n",who); printf("輪到您取牌啦\n"); scanf("%d",&num); while(num<1||num>4||num>total) //限定取牌數量,同時防止取牌數量大於剩餘牌數 { printf("取牌數量不對,請重新取牌\n"); scanf("%d",&num); } printf("您取了%d張牌\n",num); total=total-num; printf("現在還剩下%d張牌\n",total); if(total==0) //判斷張數是否為0,如果是則可以跳出迴圈,結束取牌 { break; } else{ who=0; printf("\n標記%d\n",who); printf("計算機取了%d張牌\n",N-num); total=total-N+num; printf("現在還剩下%d張牌\n",total); } } if(total==0) { printf("\n"); if(who=0) printf("您獲勝!\n"); else printf("計算機獲勝"); } }