卡牌接龙 c++

Hi~ o(* ̄▽ ̄*)ブ,我是脏脏包

几天给大家带来卡牌接龙

需要用到youxi.h

好了,上代码

#include<E:/头文件/youxi.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;
}

ヾ( ̄▽ ̄)Bye~Bye~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 请写1个支付宝接龙红包程序. 随机产生1-100的随机数,作为红包金额. 让用户不断的去猜,直到猜正确为止.最后发给用户的红包金额是 红包金额/猜得次数. 2. 循环录入5个人的年龄并计算平均年龄,如果录入的数据出现负数或大于100的数,立即停止输入并报错. 3. 实现要求用户一直输入QQ号码和密码,只要不是123456、888888就一直提示要求重新输入,如果正确则提登录成功. 4. 1-100之间不能够被7整除的数的和. 5. 求1-200之间的所有的整数的累加和 6. 求1-100之间6的倍数的个数 7. 输入班级人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩 8. 2006年培养学员80000人,每年增长25%,请问按此增长速度,到哪一年培训学员人数将达到20万人?*** 9. 从键盘输入10个数,求出最大数 10. 1000~ 5000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数2003的各位数字之和为 2+0+0+3 ,等于5)), 并统计满足条件的整数有多少个。 11. 求1-100中 是7的倍数 的数值之和 12. 求1-1000之间的所有的奇数之和 13.猜数字游戏. 随机产生1个1-100之间的数 让用户猜 当用户输入的数比产生的随机数大 就输出 猜大了 并让用户继续输入新的数.。 当用户输入的比产生的随机数小的时候 就输出 猜小了 并且继续猜 当用户刚好输入的就是这个随机数的时候 提示成功 并显示用户猜了多少次. 14. 老师问学生,这道题你会做了吗? 如果学生答"会了(y)",则可以放学. 如果学生不会做(n),则老师再讲一遍,再问学生是否会做了......直到学生会为止,才可以放学. 直到学生会或老师给他讲了10遍还不会,都要放学 15. 写1个程序. 随机的产生1个2位数的加法运算.让用户输入这个运算的结果 然后判断这个结果是否正确. 来10次. 每个人默认有10分. 产生10个加法运算.操作数的范围在0-100之间. 每产生1个加法运算 就让用户输入结果.判断是否正确. 当回答正确的时候就为用户加1分. 错误的时候就扣1分. 当10道题目回答完毕之后 就显示用户得的分数. ***

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值