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;
}
界面如下: