C++遊戲編程:卡牌遊戲

CardGame

一段時間一直喜歡玩歡樂鬥地主~~本來打算做出一個“跑得快”(有的地方叫爭上游),技術有點欠缺,於是做出了一個類似打牌的卡牌遊戲。
玩家將與兩個電腦玩家進行遊戲,一副牌總共有54張,洗牌後分爲3疊,玩家隨機得到一疊以開始。
每次只能出一張牌,牌的點數必須比上家的牌的點數大,無牌出則輸入 0 以PASS。率先清空牌庫的玩家獲勝。
所謂的54張牌其實就是類似撲克牌的54個數字,當然出牌的形式就是輸入自己“牌庫”裏的一個數字。

int c[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //一副牌

源代碼先給出:

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<windows.h>
using namespace std;

int c[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  //一副完整的牌  
int player1[18]; 
int player2[18];
int player3[18];  //將牌分爲三份

//遊戲規則 
void Instructions(){
	char s;
	cout<<"歡迎來到卡牌接龍遊戲!"<<endl;
	cout<<"是否查看遊戲規則?是(y)否(任意字符):";
	cin>>s;
	if(s == 'y'){
		cout<<endl;
		cout<<"一副牌總共有54張,洗牌後分爲3疊,玩家隨機得到一疊以開始。"<<endl;
		cout<<"每次只能出一張牌,牌的點數必須比上家的牌的點數大,無牌出則輸入 0 以PASS!率先清空牌庫的玩家獲勝!"<<endl; 
		cout<<endl;
	}
	else
	    cout<<endl;
}

//洗牌函數,打亂牌的順序 
void Shuffle(int *c){
	cout<<"洗牌中。。。"<<endl;
	srand(unsigned(time(NULL)));
	Sleep(1000);
	int a = rand();
	while(a>0){
		for(int i = 53; i > 0; i--){
			srand(unsigned(time(NULL))); 
            int currentRandom = rand() % i;
            swap(c[i],c[currentRandom]);
        }
        a--;
	}
	
	//發牌, 分爲三份 
	for(int i = 0;i < 18;i++){
		player1[i] = c[i];
	}
	
	for(int i = 18;i < 36;i++){
		player2[i-18] = c[i];
	}
	
	for(int i = 36;i < 54;i++){
		player3[i-36] = c[i];
	}
}

//二分搜索算法,爲了找到要出的牌在牌庫中的位置 
int Binary_Search(int *a, int start, int end, int key){
	int mid;
	while(start <= end){
		mid = (start + end) / 2;
		if(a[mid] < key){
			start = mid + 1;
		}
		else if (a[mid] > key){
			end = mid - 1;
		}
        else{
        	return mid;
		}
	}
	return -1;
}

//快速排序算法,用於排自己的手牌 
void QuickSort(int *a, int left, int right){
	if(left >= right){
		return ;
	}
	
	int i = left;
	int j = right;
	int key = a[left];
	
	while(i < j){
		while(i < j && key <= a[j]){
			j--;
		}
		a[i] = a[j];
		while(i < j && key >= a[i]){
			i++;
		}
		a[j] = a[i];
	}
	a[i] = key;
	QuickSort(a,left,i-1);
	QuickSort(a,i+1,right);
}

//出牌函數,出掉的牌 牌庫中變爲 0 
void Play(int p,int *player,int round){
	if(round == 1){
		cout<<"你出牌 "<<player[p]<<endl;
	}
    else if(round == 0){
    	cout<<"電腦玩家1出牌 "<<player[p]<<endl;
    }
    else if(round == -1){
    	cout<<"電腦玩家2出牌 "<<player[p]<<endl;
    }
	player[p] = 0;
	QuickSort(player,0,17);
} 

//自動將三份牌排序 
void Sort(){
	QuickSort(player1,0,17);
	QuickSort(player2,0,17);
	QuickSort(player3,0,17);
}

//展示牌庫 
void Display(int *player){
	cout<<endl;
	cout<<"你的牌庫:"; 
	for(int i = 0;i < 18;i++){
		if(player[i] != 0)
		    cout<<player[i]<<" ";
	}
	cout<<endl;
}

//電腦智能選擇要出的牌 
int Smart(int current,int *player,int pc){
	int i,S_current;
	if(current == 0){
		for(i = 0;i < 18;i++){
            if(player[i] > 0){
            	S_current = player[i];
                Play(i,player,pc);
			    return S_current;
			}
		}
	}
	else{
		for(i = 0;i < 18;i++){
            if(player[i] > current){
                S_current = player[i];
                Play(i,player,pc);
			    return S_current;
            }
        }
	}
	
	if(pc == 0){
		cout<<"電腦玩家1PASS"<<endl;
	    return current;
	} 
	else{
		cout<<"電腦玩家2PASS"<<endl; 
	    return current;
	}
}

//判斷出的牌是否符合規則 
int Judge(int p,int H_current,int S_current,int *player){	
	if(p == -1){
		return 1;
	}
	else if(H_current <= S_current)
	    return 2;
	else
	    return 3;
}

//玩家出牌 
int Human(int S_current,int *player){
	int H_current,p,i;
	cin>>H_current;
	if(H_current == 0){
		cout<<"我PASS"<<endl;
		return S_current;
	}
 
	bool j = false;
	while(!j){
		if(H_current == 0){
		    cout<<"我PASS"<<endl;
		    return S_current;
	    }
	    p = Binary_Search(player,0,17,H_current);
	    i = Judge(p,H_current,S_current,player);
	    if(i == 3){
		    Play(p,player,1);
	        return H_current;
	    }
	    else if(i == 1){
		    cout<<"你沒有此牌!"<<endl;
		    cin>>H_current;
	    }
	    else{
	    	cout<<"你無法出此牌!"<<endl;
	    	cin>>H_current;
	    }
	}	
}

//判斷輸贏 
bool Win(int *player){
	int s = 0;
	for(int i = 0;i < 18;i++){
		s += player[i];
	}
	if(s == 0)
	    return true;
	else
	    return false;
}

//宣佈結果 
void Result(bool S1,bool S2,bool H){
	if(S1){
		cout<<endl;
		cout<<"你輸了!"<<endl;
		cout<<"電腦玩家1獲得勝利!"<<endl;
	}
	else if (S2){
		cout<<endl;
		cout<<"你輸了!"<<endl;
		cout<<"電腦玩家2獲得勝利!"<<endl;
	}
	else if (H){
		cout<<"你贏了!"<<endl;
	}
}



int main(){
	Instructions(); //規則 
	Shuffle(c);   //洗牌 
    Sort();    //排序 
    
    //隨機選擇先手 
    srand(unsigned(time(NULL))); 
    int pick = rand() % 3;
    
    int S1_current = 0;
    int S2_current = 0;
    int H_current = 0;  //記錄出的牌 
    bool S1_result = false;
    bool S2_result = false;
    bool H_result = false;  //判斷輸贏的變量 
    
    //根據先手先出牌原則,以圓桌的順序一一出牌,一旦有牌庫清空,便跳出循壞 
    if (pick == 0) {
        while(!S1_result && !S2_result && !H_result){
     	    Display(player1);
            H_current = Human(S2_current,player1);
            if(H_current == S1_current){
            	H_current = 0;
            }
            
            H_result = Win(player1);
            if(H_result == true)
                break;
                
            S1_current = Smart(H_current,player2,0);
            if(S1_current == S2_current){
            	S1_current = 0;
            }
            
            S1_result = Win(player2);
            if(S1_result == true)
                break;
                
            S2_current = Smart(S1_current,player3,-1);
            if(S2_current == H_current){
            	S2_current = 0;
            }
            
            S2_result = Win(player3);
            if(S2_result == true)
                break;
        }
        Display(player1);
    }
    else if(pick == 1){
        while(!S1_result && !S2_result && !H_result){
     	    S1_current = Smart(H_current,player2,0);
     	    if(S1_current == S2_current){
            	S1_current = 0;
            }
            
            S1_result = Win(player2);
            if(S1_result == true)
                break;
                
            S2_current = Smart(S1_current,player3,-1);
            if(S2_current == H_current){
            	S2_current = 0;
            }
            
            S2_result = Win(player3);
            if(S2_result == true)
                break;
            
            Display(player1);
            H_current = Human(S2_current,player1);
            if(H_current == S1_current){
            	H_current = 0;
            }
            
            H_result = Win(player1);
            if(H_result == true)
                break;
                
        }
        Display(player1);
    }
    else{
        while(!S1_result && !S2_result && !H_result){
            S2_current = Smart(S1_current,player3,-1);
            if(S2_current == H_current){
            	S2_current = 0;
            }
            
            S2_result = Win(player3);
            if(S2_result == true)
                break;
                
            Display(player1);
            H_current = Human(S2_current,player1);
            if(H_current == S1_current){
            	H_current = 0;
            }
            
            H_result = Win(player1);
            if(H_result == true)
                break;
                
            S1_current = Smart(H_current,player2,0);
            if(S1_current == S2_current){
            	S1_current = 0;
            }
            
            S1_result = Win(player2);
            if(S1_result == true)
                break;
                
        }
        Display(player1);
    }
    
    Result(S1_result,S2_result,H_result);   //宣佈結果 
    system("pause");
	return 0;
}

界面如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發佈了18 篇原創文章 · 獲贊 85 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章