1. 程式人生 > >C語言取牌遊戲

C語言取牌遊戲

取牌遊戲

有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("計算機獲勝"); 
	 } 
}


部分程式碼截圖