#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(); } }