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