c语言小游戏 基础纸牌,贪吃蛇

博客目录

贪吃蛇

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
char m;
int x,y,fx,fy,ta,blength=2;//为了方便,数组第0个元素不要了,直接从1开始 
                        //length>=1必须的 
int sbody_move;
struct sbody
{
    int bx;
    int by;
}sbody[1801];
int ou(int n)
{
    if(n%2==1) n=n+1;
    return n;
}
void map()
{
    //地图20*60 活动空间18*58
    printf("by Wang Baotong on 2016.11.13\nYour body length=%d,goal=20\n",blength);
    int i,a,b,pr=0; 
    for (i=1;i<=60;i++)    //第一行全为“- ”
         printf("-");
    printf("\n");
     for(i=1;i<=18;i++)//中间18行  
    {
        printf("|");
        for(a=1;a<=58;a++)//具体打印某个值 
        {
            if(i==y && a==x)    pr=1; //蛇头 
            if(i==fy && a==fx)    pr=1; //产生食物 
            else 
            {
                for(b=1;b<=blength;b++)
                {
                    if(sbody[b].bx==a && sbody[b].by==i)
                    {
                        pr=1;
                        break; 
                    } 
                }
            }
            if(pr==0) printf(" ");       
            if(pr==1) printf("*");
            pr=0;
        }
        printf("|");
        printf("\n");
    } 
    for (i=1;i<=60;i++)    //最后一行全为“- ”
         printf("-");
    printf("\n");
}
void move()
{
    sbody[sbody_move].bx=x;//摆动身体 
    sbody[sbody_move].by=y;
    sbody_move-=1;
    if(sbody_move<=0)
    sbody_move=blength;
    switch(m)//蛇头坐标改变 
    {
    case 's':y+=1;break;
    case 'a':x-=2;break;
    case 'd':x+=2;break;
    case 'w':y-=1;
    }

void s_introducer()//游戏初始化... 
{
    printf("by_Wang Baotong on 2016.11.13\nasdw控制移动方向,请切换成英文输入法,身体长度达到20胜利\n");
    system("pause");
     m='d';
    x=10;
    y=10;
    sbody[1].by=10;
    sbody[1].bx=8;
    sbody[2].by=9;
    sbody[2].bx=8;
    sbody_move=blength;
    char ta;
}
void food()
{
    int data,guess,ran,i;
    srand((unsigned)time(NULL));
    ran=rand();
    f:                            //每个坐标必须为偶数 
    fy=ou(rand()%(17)+1);        //data (1,17)   x58  y18
    fx=ou(rand()%(57)+1);        //(1,57)
    if(x==fx && y==fy) goto f;    //food不能在头上 
    for(i=1;i<=blength;i++)//food不能再身体上 
    {
         if(sbody[i].bx==fx && sbody[i].by==fy)
         {
            goto f;
         }
    }
}
main()
{
    system("mode con cols=65 lines=25");
    s_introducer();//游戏初始化  打酱油的无伤大雅的开局介绍和进入游戏。 
    int win=0,de=1,i,gameover=0,fe=0;
    for(;gameover==0;)            //主程序 ===================== 
    {
         move();
         if(x>58 || x<1 || y>18 || y<1)//判断游戏是否结束 活动空间x58  y18 /判断是否撞墙 
            break;    
         
        for(i=1;i<=blength;i++)//判断是否咬到自己 
         {
             if(sbody[i].bx==x && sbody[i].by==y)
             {
                gameover=1;
                 break;
             }
        }
        if(gameover==1) break;
            system("cls");
        if(kbhit())
          {
              ta=m;
                 m=getch();//判断按下某键 asdw作为控制
            if(m=='a' && ta=='d') m=ta;
            if(m=='d' && ta=='a') m=ta;
            if(m=='w' && ta=='s') m=ta;
            if(m=='s' && ta=='w') m=ta;
            de=0;
        }
        if(x==fx && y==fy)
        {
            blength+=1;
            fe=0;
        }
        if(blength>=20) 
        {
            win=1;
            break;
        }
        map();
        if(fe==0)
        {
            food();//如果食物不存在,产生食物。
            fe=1;
        }
        if(de==1)
            Sleep(80);
        if(de==0)
            de=1;
    }
    if(win==0) printf("=========Gameover.You fail!=========\n");
    if(win==1) printf("=========Gameover.You win!=========\n");
    system("pause"); 
}

纸牌

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<windows.h>
char ku[16]="34567890JQKA2XD";//种类集合,共15种牌,相对大小按照顺序 大小王不可以挂 
char fone[55]="34567890JQKA2XD34567890JQKA234567890JQKA234567890JQKA2";//一副牌 54张 
char deskpuk[4];
int player,renyi,deskpamount;//1为玩家   0为AI
struct sbody
{
    char puk[27];//等整理完毕pukexc后就没用了 
    int sum;
    int kusum[16];
    int pass;
}pla[2];
int findpuknumb(char n)//寻找种类n在ku[]中的相对大小(序号从0开始)n=p时返回-1//***finished 
{
    if(n=='p') return -1;//pass最小 
    int i=-1;
    while(ku[++i]!=n);
    return i;
}
void fenpuk()//***finished 
{
    int ran=0,i,a;
    //for(a=0;a<54;a++)    printf("%c",fone[a]);
    for(i=0;i<54;i++)//分54张牌 每人27张 
    {
        if(pla[ran].sum==27)
        {
            pla[!ran].puk[pla[!ran].sum++]=fone[i];
            //printf("sum=%d,i=%d,ch=%c\n",pla[!ran].sum,i,fone[i]);
            continue;
        }
        ran=rand()%2;//产生随机数01
        if(ran)    pla[1].puk[pla[1].sum++]=fone[i];
        else pla[0].puk[pla[0].sum++]=fone[i];
    }

}
void pukexc()//基于扑克库ku[]进行扑克归类排序。  //***finished
{
    int n=0,num,i;
    char p;
    while(n<=1)//两个玩家运行两次 
    {
        for(i=0;i<27;i++)
        {
        p=pla[n].puk[i];

        num=findpuknumb(p);
        pla[n].kusum[num]++;
        
        }    
        n++;    
    }
}
int fablepuk(int x,int min,int sum,char *p)//查找玩家x手里:大于等于min且数量大于等于sum的牌,返回扑克数目 
{            //第三个变量为用于存放 所有该类型的牌 的数组指针 且成员数应大于等于4 如果扑克牌不存在不作改变数组 
    int i,a;            //***本函数不改变玩家手中牌的种类和数目 ,只提供搜索服务***
    for(i=min;i<15;i++)     
    {
        if(pla[x].kusum[i]==0 || pla[x].kusum[i]<sum)//不符合函数要求 
            continue;
        for(a=0;a<pla[x].kusum[i];a++)
            p[a]=ku[i];
        return pla[x].kusum[i];
    }
    return 0; 
}
void echo(int n)
{
    int i,a;
    system("cls");
    printf("跑得快——初级,by wbt   2016.11.23\n");
    printf("大管小,王不能挂,不能连出不能带,不憋三\n0为10,X为小王(xiao),D为大王(da)\n");
    //打印AI的部分 
    printf("=========================================\n");
    printf("[玩家]\\=====帅气AI=====/:(%d)              \n\n                  ",pla[0].sum); 
    if((n==1 || pla[0].pass==1) && pla[1].sum!=0)//且的意思是  游戏没有结束 
    {
        printf("→");
        if(pla[0].pass==0)
        {
            for(i=0;i<deskpamount;i++)    
            printf("%c",deskpuk[i]);
        }
        if(pla[0].pass==1)
            printf("pass");
        printf("←");
    }
    
    printf("\n\n\n");
    if(pla[0].sum==0 && n!=-2) printf("\n---------------You lose!!----------------");
    if(n==-2) printf("--------------准备好了吗---------------");
    if(pla[1].sum==0 && n!=-2) printf("\n---------------You win!!----------------");
    printf("\n\n\n");
    
    //玩家部分  
    if(n==2 || pla[1].pass==1)
    {
        printf("                  →");
        if(pla[1].pass==0)
        {
            for(i=0;i<deskpamount;i++)//只有玩家出牌才会刷 
                printf("%c",deskpuk[i]);
        }
        if(pla[1].pass==1)
            printf("pass");
        printf("←");
    }
    printf("\n[玩家]\\===高贵程序猿===/:(%d)\n",pla[1].sum);
    for(i=0;i<15;i++)//按照降序输出玩家剩余的牌. 
    {
    a=0;
    while(++a<=pla[1].kusum[i])    
            printf("%c",ku[i]);
    printf(" ");
    }    
    printf("\n\n=========================================\n");
}
void introduction()
{
     //变量初始化 
    pla[0].sum=0;
    pla[1].sum=0;
    player=rand()%2;
    int i;
    for(i=0;i<27;i++)
    {    pla[0].puk[i]='.';
        pla[1].puk[i]='.';
        pla[0].kusum[i]=0;
        pla[1].kusum[i]=0;
    }
    renyi=1;
    deskpamount=0;
    echo(-2); 
    system("pause");
}
int aiuppuk()            //***finished
{
    int puknumb=-1,i,amount=0,sum,min;
    char puk[4];
    if(renyi==1)
    {
        sum=0;
        min=0;
    }
    else
    {
        sum=deskpamount;
        min=findpuknumb(deskpuk[0])+1;
    }
    amount=fablepuk(0,min,sum,puk);
    i=-1;
    //内存出牌! 
    if(amount<deskpamount && renyi==0) //数目不足且不能任意出牌 
    {
        renyi=1;
        pla[0].pass=1;
        echo(-1);
        pla[0].pass=0;
        return 0;
    }
    else //数目足够或者能任意出牌 
    {
        if(renyi==0)    amount=deskpamount;
        renyi=0;
    }
    while(++i<amount)
    {
        deskpuk[i]=puk[i];
    }
    //减少手中牌 
    pla[0].sum-=amount;
    pla[0].kusum[findpuknumb(deskpuk[0])]-=amount;
    deskpamount=amount;
    echo(1);
    return 1;
}
char dx(char n)//***finished
{
    if(n>='a' && n<='z')
        n-='a'-'A';
    return n;
}
int plauppuk()//------------ 

    int i,a,x,t,t1,length,numb,pass;
    char input[100];//无奈之举 出此下策 
    printf("\n");
    do            //所有的continue;前面都要加一句x=1; 
    {
        x=0;
        printf("请输入你要出的牌,输入pass过牌:");
        gets(input);
        if(input[0]=='\0')//任意==1时,判断机制会有bug,允许玩家输入空牌,这一句避免这个bug 
        {
            x=1;
            continue;
        } 
        for(i=0;i<4;i++)
            input[i]=dx(input[i]);
        length=strlen(input);
        if(length>4)
        {
            printf("\n输入错误!!!\n");//不能超过4个 
            x=1;
            continue;
        }
        numb=findpuknumb(input[0]);
        pass=input[0]=='P' && input[1]=='A' && input[2]=='S'&& input[3]=='S';
        if(pass==1 && renyi==1)
        {
            printf("不能过牌\n");
            x=1;
            continue;
        } 
        if(pass==1 && renyi==0)//玩家pass 
        {
            renyi=1;
            pla[1].pass=1;
            echo(-1);
            pla[1].pass=0;
            Sleep(1000);
            return 0;
        }
        if(length!=deskpamount && renyi==0 && pass==0)//判断错误输入, //数目是否匹配 
        {
            printf("请选择%d张牌!\n",deskpamount);
            x=1;
            continue;
        } 
        t=0;
        x=0;
        for(i=1;i<length;i++)//几张牌的组合是否符合规则 
        {
            if(input[i]==input[0]) 
            {
                t++;
                break;
            }
            if(t<length-1&&i==length-1)
            {
                x=1;
                printf("您选择的牌不符合游戏规则\n");
                break;
            }
        }
        if(x) continue;
        if(pass==0)
        {
            for(i=0;i<length;i++)//是否存在于种类库ku
            {
                t=0;
                for(a=0;a<15;a++)
                {
                    if(input[i]==ku[a])
                    {
                        t++;
                        break;
                    }
                }
                if(t==0)//不合格 
                {
                    printf("您输入的扑克不正确\n");
                    x++;
                    break;
                }
            }
        }
        if(x) continue;
        if(numb<=findpuknumb(deskpuk[0]) && renyi==0)//大小是否合适 
        {
            printf("您的牌太小\n");
            x=1;
            continue;
        }
        if(length>pla[1].kusum[numb])
        {
            printf("您的牌数目不足\n");
            x=1;
            continue;
        }
    break;
    }
    while(x);//0为合格1不合格
//    printf("\n*6*%d\n",player);//player为1 
    //内存出牌 
    i=-1;
    while(++i<4)
        deskpuk[i]=input[i];
    //strcpy(deskpuk,input);//可能是数据溢出导致player被冲掉 
    renyi=0;
    deskpamount=length;
    echo(2);
    //减少手中牌 
    pla[1].sum-=length;
    pla[1].kusum[numb]-=length; 
    Sleep(1000);
}
     //(策略系统——太难了待定吧。) 
main()
{
    int a;
    while(1)
    {
    srand((unsigned)time(NULL));
    introduction();//介绍和初始化 
    fenpuk();//分牌 
    pukexc();//扑克排序归类 
    echo(-1);
    while(1)    //出牌管理系统
    {
        if(pla[0].sum==0||pla[1].sum==0) break;
        if(player==1)
        {
            plauppuk();//玩家
        }
        else    aiuppuk();
        player=!player;
    }
    echo(0);
    system("pause"); 
    }
}

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/82726502