骑士飞行棋

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

int player1,player2;//游戏中的两名玩家
int position1,position2;//游戏中的两名玩家在地图中的位置
int Map[128]= {0},Mapcopy[128];//Map是当前掷骰子后的地图数组,Mapcopy是最初建成的地图数组,分别用0-6来表示地图中不同的符号。
int s1,s2;//分别记录进行的游戏玩家赢得局数
int Luckturn[] = { 6, 23, 40, 55, 69, 83 };//幸运轮盘所在的位置
int Landmine[] = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷所在的位置
int Pause[] = { 9, 27, 60, 93 };//暂停
int Timetunnel[] = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道

void Intro();//游戏介绍模块
void Show1();//最开始进入游戏的显示模块
void Show2();//人物选择模块
void Creatmap();//创建地图
void Producemap(int );//将Map数组中所存的数翻译成不同的符号。
void Judge();//判断输入的账号及密码是否符合要求
void Printmap();//打印地图
int Prorandom();//用随机函数来模拟掷骰子
void conplay2(int,int );//在玩家player2进入暂停状态时的特殊判断
void conplay1(int ,int);//在玩家player1进入暂停状态时的特殊判断
void Tran1(int,int );//在玩家player1掷骰子后的判定
void Tran2(int,int );//在玩家player2掷骰子后的判定
void Play();//两名玩家轮流掷骰子
void Result1();//如果player1赢的情况
void Result2();//如果player2赢的情况
int main()
{
    int i,t;
    s1=0;s2=0;
    Show1();
    Show2();
    printf("\n▼请按回车键查看游戏说明。\n\n");
    getchar();
    getchar();
    system("cls");
    Intro();
    Judge();
    system("cls");
    while(1)
    {
         position1=position2=0;
        Creatmap();
        printf("\t\t\t游戏即将开始!\n\n");
        Printmap();
        printf("\n按任意键进入双方对战.\n\n");
        getchar();
        system("cls");
        Play();
        printf("\n\t当前玩家%d与玩家%d赢得的局数比是:    %d:%d\n",player1,player2,s1,s2);
        printf("\t----------------------------------\n\n\n");
        printf("\n是否继续再开一局游戏    1.√   2.×\n");
        scanf("%d",&t);
        getchar();
        if(t==2)
            break;
            system("cls");
            memset(Map,0,sizeof(Map));
    }
    system("cls");
    printf("\n正在退出游戏");
    for(i=0; i<10; i++)
    {
        printf("█");
        Sleep(300);
    }
    printf("\n");
    system("cls");
    return 0;
}
void Intro()
{
    printf("\t\t\t▁▂▃▄▅▆▇█ 游戏说明█▇▆▅▄▃▂▁\n\n\n");
    printf("\t1.分别用符号p1,p2分别来代表游戏中的两名玩家player1与player2当前所在的位置。\n\n");
    printf("\t2.符号¤表示幸运转盘,当玩家走到该位置时有如下两种选择:\n");
    printf("\t  1).选择和对方交换位置。\n");
    printf("\t  2).选择轰炸对方。\n\n");
    printf("\t3.符号〓表示时空隧道,当玩家走到该位置时可以前进10步。\n\n");
    printf("\t4.符号∷表示正常路径。\n\n");
    printf("\t5.符号■表示暂停,当玩家走到该位置时直接轮流到另一名玩家掷骰子。\n\n");
    printf("\t6.符号★表示地雷,当玩家走到该位置时后退六步。\n\n");
    printf("\t7.玩家通过按任意键进行随机掷骰子\n\n");
    printf("\t8.先到终点者便赢得此次比赛\n\n");
    system("color A");
}
void Show1()
{
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
    printf("//                                                            //\n");
    printf("//                                                            //\n");
    printf("//              骑      士      飞     行     棋              //\n");
    printf("//                                                            //\n");
    printf("//                                                            //\n");
    printf("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
    printf("\n\n\n\n");
    system("color 1f");//改变输入输出框的颜色
}

void Show2()//对特殊情况的判断,当输入的数不在1-4之间或者两者游戏人物重复
{
    printf("\n\n");
    printf("~~~~~~~~~~~~~~~~~~~~~~~两    人   对   战~~~~~~~~~~~~~~~~~~~~~~~\n\n");
    printf("请选择角色:1. 戴高乐 2. 艾森豪威尔 3. 麦克阿瑟  4. 巴顿\n");
    printf("请玩家1选择角色:   ");
    scanf("%d",&player1);
    if(player1<1||player1>4)
    {
        printf("您选择的人物不存在请重新选择!\n\n");
        Show2();
    }
    else
    {
        printf("请玩家2选择角色:   ");
        scanf("%d",&player2);
        if(player2<1||player2>4)
        {
            printf("您选择的人物不存在请重新选择!\n\n");
            Show2();
        }
        if(player1==player2)
        {
            printf("\n\n");
            printf("说明:游戏中人物名称不可相同,请重新输入除%d外的人物代号:",player1);
            scanf("%d",&player2);
        }
    }
    printf("\n\n");
}
void Creatmap()
{
    int i;
    for(i=0; i<6; i++)
        Map[Luckturn[i] ]=1;
    for(i=0; i<9; i++)
        Map[Landmine[i] ]=2;
    for(i=0; i<4; i++)
        Map[Pause[i] ]=3;
    for(i=0; i<7; i++)
        Map[Timetunnel[i] ]=4;
    for(i=0; i<=99; i++)
        Mapcopy[i]=Map[i];
}
void Producemap(int i)
{
    system("color B");
    if(Map[i]==0)
        printf("∷");
    else if(Map[i]==1)
        printf("¤");
    else if(Map[i]==2)
        printf("★");
    else if(Map[i]==3)
        printf("■");
    else if(Map[i]==4)
        printf("〓");
    else if(Map[i]==5)
        printf("P1");
    else if(Map[i]==6)
        printf("P2");
    if(i==99)
        printf("end");
}
void Judge()
{
    char num[10],secret[10];
    int l;
    printf("如果您想继续进入游戏,请输入两对战者其中任一人的账号和密码.(其中账号不少于4位,密码不能少于3位!)\n\n\n");
    while(1)//输入账号的判别
    {
        printf("请输入您的账号:");
        scanf("%s",num);
        l=strlen(num);
        if(l<=3)
            printf("您输入的账号不存在,请重新输入!\n");
        else
            break;
    }
    while(1)//输入密码的判别
    {
        printf("请输入您的密码:");
        scanf("%s",secret);
        l=strlen(secret);
        if(l<=2)
            printf("您输入的密码有误!请重新输入:");
        else
            break;
    }
    system("cls");
    int i;
    printf("账号登陆成功!\n-----------------------------------------------  \n\n\n\n\n");
    printf("\t淡定等待,玩命加载");
    for(i=0; i<10; i++)
    {
        printf("▇");
        Sleep(300);//时间延迟函数
    }
    system("cls");//清屏函数
    getchar();
}
void Printmap()//用空格与数组控制地图的输出
{
    int i,j;
    for(i=0; i<=29; i++)
        Producemap(i);
    printf("\n");
    for(i=30; i<=34; i++)
    {
        for(j=0; j<=57; j++)
        {
            printf(" ");
        }
        Producemap(i);
        printf("\n");
    }
    for(i=64; i>=35; i--)
        Producemap(i);
    printf("\n");
    for(i=65; i<=69; i++)
    {
        Producemap(i);
        for(j=0; j<29; j++)
        {
            printf(" ");
        }
        printf("\n");
    }
    for( i=70; i<=99; i++ )
        Producemap(i);
    printf("\n");
    system("color 2f");
}
int Prorandom()//随机数模拟掷骰子的点数
{
    int o;
    srand( (int) time(NULL));
    o=rand()%6+1;
    return o;
}
void conplay2(int now,int tmp)//与函数Tran1中注释类似
{
    int c,t,way,o;
    char p;
    c=Map[now];
    switch(c)
    {
    case 0:
        printf("\n您目前所处的位置是正常的。\n");
        if(tmp==position1)
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        break;
    case 1:
        printf("\n恭喜你到了幸运转盘!有以下两种选择方案:\n");
        printf("\t1.选择和对方交换位置\n\t2.选择轰炸对方\n\n请输入您要选择的方案:\n\n");
        scanf("%d",&way);
        if(way==1)
        {
            Map[tmp]=0;
            Map[position1]=6;
            Map[position2]=5;
            t=position1;
            position1=position2;
            position2=t;
        }
        else
        {
            Map[tmp]=0;
            Map[now]=6;
            Map[position1]=0;
            if(position1>=6)
            {
                position1=position1-6;
                Map[position1]=5;
            }
            else
            {
                position1=0;
                Map[position1]=5;
            }
        }
        Printmap();
        break;
    case 2:
        printf("\n真倒霉,你落到了地雷上边!\n");
        Map[position2]=0;
        Map[tmp]=0;
        if(now>=6)
        {
            Map[now-6]=6;
            position2-=6;
        }
        else
        {
            position2=0;
            Map[0]=6;
        }
        Printmap();
        break;
    case 3:
        printf("\n目前处于暂停状态,并且对手可以连续掷两次骰子\n");
        if(tmp==position2)
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        printf("\n请%d号玩家按任意键掷骰子:",player1);
        getchar();
        scanf("%c",&p);
        o=Prorandom();
        printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player1,o);
        tmp=position1;
        position1+=o;
        break;
    case 4:
        printf("\n^_^,进入时空隧道。\n");
        if(tmp==position1)//判断是否对手在原来没有改变位置前的位置上,若在不能Map[]=0,而是Map[]=对手位置
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[position2]=0;
        Map[now+10]=6;
        position2+=10;
        Printmap();
        break;
    }
}
void conplay1(int now,int tmp)//与函数Tran1中注释类似
{
    int c,t,way,o;
    char p;
    c=Map[now];
    switch(c)
    {
    case 0:
        printf("\n您目前所处的位置是正常的。\n");
        if(tmp==position1)
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        break;
    case 1:
        printf("\n恭喜你到了幸运转盘!有以下两种选择方案:\n");
        printf("\t1.选择和对方交换位置\n\t2.选择轰炸对方\n\n请输入您要选择的方案:\n\n");
        scanf("%d",&way);
        if(way==1)
        {
            Map[tmp]=0;
            Map[position1]=6;
            Map[position2]=5;
            t=position1;
            position1=position2;
            position2=t;
        }
        else
        {
            Map[tmp]=0;
            Map[now]=6;
            Map[position1]=0;
            if(position1>=6)
            {
                position1=position1-6;
                Map[position1]=5;
            }
            else
            {
                position1=0;
                Map[position1]=5;
            }
        }
        Printmap();
        break;
    case 2:
        printf("\n真倒霉,你落到了地雷上边!\n");
        Map[position2]=0;
        Map[tmp]=0;
        if(now>=6)
        {
            Map[now-6]=6;
            position2-=6;
        }
        else
        {
            position2=0;
            Map[0]=6;
        }
        Printmap();
        break;
    case 3:
        printf("\n目前处于暂停状态,并且对手可以连续掷两次骰子\n");
        if(tmp==position2)
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        printf("\n请%d号玩家按任意键掷骰子:",player1);
        getchar();
        scanf("%c",&p);
        o=Prorandom();
        printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player1,o);
        tmp=position1;
        position1+=o;
        break;
    case 4:
        printf("\n^_^,进入时空隧道。\n");
        if(tmp==position1)//判断是否对手在原来没有改变位置前的位置上,若在不能Map[]=0,而是Map[]=对手位置
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[position2]=0;
        Map[now+10]=6;
        position2+=10;
        Printmap();
        break;
    }
}
void Tran1(int now,int tmp)//对游戏者处于不同情况的判断与处理
{
    int c,t,way,o;
    char p;
    c=Map[now];
    switch(c)
    {
    case 0:
        printf("\n您目前所处的位置是正常的。\n");
        if(tmp==position2)//把当前游戏者之前的位置还原为地图中正常的路径,并且将游戏者的掷骰子后的位置移动到正确地点
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[now]=5;
        Printmap();//进行完每次的操作都要打印出来
        break;
    case 1:
        printf("\n恭喜你到了幸运转盘!有以下两种选择方案:\n");
        printf("\t1.选择和对方交换位置\n\t2.选择轰炸对方\n\n请输入您要选择的方案:\n\n");
        scanf("%d",&way);
        if(way==1)//在运动到幸运转盘时进行完选择操作,注意两游戏的psition值的交换
        {
            Map[tmp]=0;
            Map[position1]=6;
            Map[position2]=5;
            t=position1;
            position1=position2;
            position2=t;
        }
        else//当对方所在位置小于6时,应当特殊判断赋值为0否则游戏者从位置直接向后退6步
        {
            Map[tmp]=0;//将地图还原到有正常路径
            Map[now]=5;//改变游戏者应该到的位置
            Map[position2]=0;
            if(position2>=6)
            {
                position2=position2-6;
                Map[position2]=6;
            }
            else//当对方所在位置小于6时,应当特殊判断赋值为0
            {
                position2=0;
                Map[position2]=6;
            }
        }
        Printmap();
        break;
    case 2:
        printf("\n真倒霉,你落到了地雷上边!\n");
        Map[position1]=0;
        Map[tmp]=0;
        if(now>=6)
        {
            Map[now-6]=5;
            position1-=6;
        }
        else//当对方所在位置小于6时,应当特殊判断赋值为0
        {
            position1=0;
            Map[0]=5;
        }
        Printmap();
        break;
    case 3:
        printf("\n目前处于暂停状态,并且对手可以连续掷两次骰子\n\n");
        if(tmp==position2)
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[now]=5;//当前位置的赋值和之前位置的还原
        Printmap();
        printf("\n请%d号玩家按任意键掷骰子:",player2);
        getchar();
        scanf("%c",&p);
        o=Prorandom();
        printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player2,o);
        tmp=position2;
        position2+=o;
        conplay2(position2,tmp);//若游戏玩家在暂停处时,控制对手连走两次
        break;
    case 4:
        printf("\n^_^,进入时空隧道。\n");
        if(tmp==position2)//判断是否对手在原来没有改变位置前的位置上,若在不能Map[]=0,而是Map[]=对手位置
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[position1]=0;
        Map[now+10]=5;
        position1=now+10;
        Printmap();
        break;
    }
}
void Tran2(int now,int tmp)//与函数Tran1中注释类似
{
    int c,t,way,o;
    char p;
    c=Map[now];
    switch(c)
    {
    case 0:
        printf("\n您目前所处的位置是正常的。\n");
        if(tmp==position1)
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        break;
    case 1:
        printf("\n恭喜你到了幸运转盘!有以下两种选择方案:\n");
        printf("\t1.选择和对方交换位置\n\t2.选择轰炸对方\n\n请输入您要选择的方案:\n\n");
        scanf("%d",&way);
        if(way==1)
        {
            Map[tmp]=0;
            Map[position1]=6;
            Map[position2]=5;
            t=position1;
            position1=position2;
            position2=t;
        }
        else
        {
            Map[tmp]=0;
            Map[now]=6;
            Map[position1]=0;
            if(position1>=6)
            {
                position1=position1-6;
                Map[position1]=5;
            }
            else
            {
                position1=0;
                Map[position1]=5;
            }
        }
        Printmap();
        break;
    case 2:
        printf("\n真倒霉,你落到了地雷上边!\n");
        Map[position2]=0;
        Map[tmp]=0;
        if(now>=6)
        {
            Map[now-6]=6;
            position2-=6;
        }
        else
        {
            position2=0;
            Map[0]=6;
        }
        Printmap();
        break;
    case 3:
        printf("\n目前处于暂停状态,并且对手可以连续掷两次骰子\n");
        if(tmp==position2)
            Map[tmp]=6;
        else
            Map[tmp]=0;
        Map[now]=6;
        Printmap();
        printf("\n请%d号玩家按任意键掷骰子:",player1);
        getchar();
        scanf("%c",&p);
        o=Prorandom();
        printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player1,o);
        tmp=position1;
        position1+=o;
        conplay1(position1,tmp);//若游戏玩家在暂停处时,控制对手连走两次
        break;
    case 4:
        printf("\n^_^,进入时空隧道。\n");
        if(tmp==position1)//判断是否对手在原来没有改变位置前的位置上,若在不能Map[]=0,而是Map[]=对手位置
            Map[tmp]=5;
        else
            Map[tmp]=0;
        Map[position2]=0;
        Map[now+10]=6;
        position2+=10;
        Printmap();
        break;
    }
}
void Result1()//输出赢家
{
    printf("\n\n\t----------------------------------\n\n\n");
    printf("\t\t   GAME  OVER\n\n\n");
    if(position1>=99)
    {
        printf("\n\t恭喜%d号选手赢得了比赛,",player1);
        printf("他是");
        switch(player1)
        {
        case 1:
            printf("戴高乐!\n");
            break;
        case 2:
            printf("艾森豪威尔!\n");
            break;
        case 3:
            printf("麦克阿瑟!\n");
            break;
        case 4:
            printf("巴顿!\n");
            break;
        }
    }
}
void Result2()//输出赢家
{
    printf("\n\n\t----------------------------------\n\n\n");
    printf("\t\t   GAME  OVER\n\n\n");
    if(position2>=99)
    {
        printf("\n\t恭喜%d号选手赢得了比赛,",player2);
        printf("他是");
        switch(player2)
        {
        case 1:
            printf("戴高乐!\n");
            break;
        case 2:
            printf("艾森豪威尔!\n");
            break;
        case 3:
            printf("麦克阿瑟!\n");
            break;
        case 4:
            printf("巴顿!\n");
            break;
        }
    }
}
void Play()
{
    char  g1,g2;
    int o1,o2,i=1,tmp;
    while(position1<99&&position2<99)//控制两玩家位置大于等于99后便结束本次比赛
    {
        int o;
        if(i%2!=0)//一名玩家
        {
            printf("请%d号玩家按任意一个键掷骰子:",player1);
//            getchar();
//            scanf("%c",&g1);
//            o1=Prorandom();//获得1-6内的随机数
scanf("%d",&o);
            printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player1,o);
            tmp=position1;//tmp原来的位置
            position1=position1+o;
            if(position1==position2)//position1掷完骰子后应该到的位置,且判断是否会被炸回到原点
            {
                printf("\n对方被你炸回到起点!\n");
                Map[position2]=5;
                Map[tmp]=0;
                Map[0]=6;
                position2=0;
                Printmap();
            }
            else//否则进行对应该到正常路径、地雷、幸运转盘、时空隧道、暂停5种可能的判断
                Tran1(position1,tmp);
            printf("\n\n(请按{任意一个键+回车键}自动转换控制界面.)\n\n");
            getchar();
            getchar();
            system("cls");//清屏
        }
        else//另一名玩家
        {
            printf("请%d号玩家按任意一个键掷骰子:",player2);
//            getchar();
//            scanf("%c",&g2);
//            o2=Prorandom();
scanf("%d",&o);
            printf("\n\n%d号玩家所掷的骰子数为:%d\n\n",player2,o);
            tmp=position2;
            position2=position2+o;
            if(position1==position2)
            {
                printf("\n对方被你炸回到起点!\n");
                Map[position2]=6;
                Map[tmp]=0;
                Map[0]=5;
                position1=0;
                Printmap();
            }
            else
                Tran2(position2,tmp);
            if(Mapcopy[tmp]!=3)
                printf("\n\n(请按{任意一个键+回车键}自动转换控制界面.)\n\n");
            getchar();
            getchar();
            system("cls");
        }
        i++;
    }
    if(position1>=99)
    {
        s1++;
        Result1();
    }
    else if(position2>=99)
    {
        s2++;
        Result2();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值