飞行棋职业你头文件都齐可运行哦

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NON_CONFORMING_SWPRINTFS
#include <graphics.h> // 引用图形库头文件
#include <conio.h>
#include <stdio.h>
#include <windows.h>    //用到了定时函数sleep()
#include <math.h>
#include <string.h>
#include <time.h>


int r[4][4] = { {170,60,290,100},{170,130,290,170},{170,200,290,240},{170,270,290,310} };//三个按钮的二维数组
char aname[30], bname[30];
TCHAR str[300];
//按钮判断函数
RECT r1 = { 0, 40,600, 500 };
RECT r2 = { 0,320,600,750 };
int button_judge(int x, int y)
{
if (x > r[0][0] && x<r[0][2] && y>r[0][1] && y < r[0][3])return 1;
if (x > r[1][0] && x<r[1][2] && y>r[1][1] && y < r[1][3])return 2;
if (x > r[2][0] && x<r[2][2] && y>r[2][1] && y < r[2][3])return 3;
if (x > r[3][0] && x<r[3][2] && y>r[3][1] && y < r[3][3])return 4;
return 0;
}
void NameGiven();
void restart(int map[100]);
void donghua(int map[], int t, int u);
void printmap(int map[]);
int main()
{
int map[100] = { 0,0,0,0,0,2,1,0,0,3,0,0,0,2,0,0,0,2,0,0,4,0,0,1,0,4,0,3,0,0,0,0,0,2,0,0,0,0,2,0,1,0,0,0,0,4,0,0,0,0,2,0,0,0,0,1,0,0,0,0,3,0,0,4,2,0,0,0,0,1,0,0,4,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,4,0,4,0,0,3,2,0,0,0,0,0 };
int i, x ,event = 0, score = 0;
int a = 0, b = 0;
short win_width, win_height;//定义窗口的宽度和高度
win_width = 600; win_height = 600;
initgraph(win_width, win_height);//初始化窗口(黑屏)

for (i = 0; i < 256; i += 5)
{
setbkcolor(RGB(i, i, 0));//设置背景色,原来默认黑色
cleardevice();//清屏(取决于背景色)
Sleep(30);//延时30ms
}
RECT R1 = { r[0][0],r[0][1],r[0][2],r[0][3] };
RECT R2 = { r[1][0],r[1][1],r[1][2],r[1][3] };
RECT R3 = { r[2][0],r[2][1],r[2][2],r[2][3] };
RECT R4 = { r[3][0],r[3][1],r[3][2],r[3][3] };
LOGFONT f;//字体样式指针
gettextstyle(&f);    //获取字体样式
_tcscpy(f.lfFaceName, _T("宋体"));    //设置字体为宋体
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿 
settextstyle(&f); // 设置字体样式
settextcolor(BLACK);    //BLACK在graphic.h头文件里面被定义为黑色的颜色常量
drawtext(_T("输入昵称"), &R1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
drawtext(_T("游戏规则"), &R2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
drawtext(_T("开始游戏"), &R3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
drawtext(_T("退出游戏"), &R4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R4内输入文字,水平居中,垂直居中,单行显示
setlinecolor(LIGHTGRAY);
rectangle(r[0][0], r[0][1], r[0][2], r[0][3]);
rectangle(r[1][0], r[1][1], r[1][2], r[1][3]);
rectangle(r[2][0], r[2][1], r[2][2], r[2][3]);
rectangle(r[3][0], r[3][1], r[3][2], r[3][3]);
MOUSEMSG m;//鼠标指针

while (true)//通过break跳出循环
{
m = GetMouseMsg();//获取一条鼠标消息
//mciSendString("open 桌面:\\BGM1.mp3 alias BGM1", NULL, 0, NULL);//背景音乐
//mciSendString("play BGM1 repeat", NULL, 0, NULL); // 循环播放
switch (m.uMsg)
{
case WM_MOUSEMOVE:
setrop2(R2_XORPEN);
setlinecolor(WHITE);//线条颜色
setlinestyle(PS_SOLID, 4);//设置画线样式为实线
setfillcolor(WHITE);//填充颜色为白色
if (button_judge(m.x, m.y) != 0)
{
if (event != button_judge(m.x, m.y))
{
event = button_judge(m.x, m.y);//记录这一次触发的按钮
fillrectangle(r[event - 1][0], r[event - 1][1], r[event - 1][2], r[event - 1][3]);//有框填充矩形(X1,Y1,X2,Y2)
}
}
else
{
if (event != 0)//上次触发的按钮未被修正为原来的颜色
{
fillrectangle(r[event - 1][0], r[event - 1][1], r[event - 1][2], r[event - 1][3]);//两次同或为原来颜色
event = 0;
}
}
break;
case WM_LBUTTONDOWN:
setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
for (i = 0; i <= 10; i++)
{
setlinecolor(RGB(25 * i, 25 * i, 25 * i));//设置圆颜色
circle(m.x, m.y, 2 * i);
Sleep(20);//停顿30ms
circle(m.x, m.y, 2 * i);//抹去刚刚画的圆
}

 

//按照按钮判断左键单击后的操作
switch (button_judge(m.x, m.y))
{
//复原按钮原型
case 1:
NameGiven();
FlushMouseMsgBuffer();//单击事件后清空鼠标消息
break;
case 2:


outtextxy(120, 450, _T("双人对战,对战双方轮流掷骰子控制自己的骑兵"));
outtextxy(120, 470, _T("双人对战,对战双方轮流掷骰子控制自己的骑兵"));
outtextxy(120, 490, _T("∷平地 ▲幸运罗盘 ★地雷 ■暂停 〓时空隧道"));
outtextxy(120, 510, _T("先到达终点的玩家胜利,若同时到达,则平局"));
outtextxy(120, 530, _T("▲幸运罗盘:可以选择 1.与对方骑兵交换位置 "));
outtextxy(278, 550, _T(" 2.将对方骑兵炸退六步"));
outtextxy(120, 570, _T("★地雷:该玩家被炸退六步"));
break;
case 3:
initgraph(800, 800);//初始化窗口(黑屏)
setbkcolor(RGB(169, 169, 169));//设置背景色
cleardevice();//清屏(取决于背景色)
Sleep(500);

settextstyle(18, 9, _T("黑体"));
//printmap(map);
restart(map);//调用 函数restart(map)
donghua(map, a, b);
Sleep(50000);
closegraph();//关闭绘图界面//?
case 4:
closegraph();//关闭绘图环境
exit(0);//正常退出
default:
FlushMouseMsgBuffer();//单击事件后清空鼠标消息
//printf("\r\n(%d,%d)",m.x,m.y);//打印鼠标坐标,方便调试时确定区域
break;
}
break;
}
}
return 0;
};

void NameGiven()
{
int flag = 1;
InputBox(str, 30, _T("请输入玩家A、B姓名 用空格键隔开"));
swscanf(str, _T("%s%s"), aname, bname);
while (1)
{
if (aname == " " || bname == " " || strcmp(aname, bname) == 0)
{
InputBox(str, 30, _T("请输入玩家A、B姓名 用空格键隔开"));
swscanf(str, _T("%s%s"), aname, bname);
}
else
{
swprintf(str, _T("玩家A名称:%s"), aname);
outtextxy(0, 0, str);
swprintf(str, _T("玩家B名称:%s"), bname);
outtextxy(0, 20, str);
break;
}
}
}

void donghua(int map[], int t, int u)
{
int i;
int a = 0, b = 0;//a代表玩家A在数组中的下标 b代表玩家B在数组中的下标
int x=0, y=0;//x表示掷出骰子时玩家A骰子的值 y表示掷出骰子时玩家B骰子的值
int temp;//中间变量
char c, result[100];
int A = 0, B = 0;//玩家A、B的位置 
int e = 2, q = 2;//控制暂停

cleardevice();

printmap(map);//调用函数printmap(map)用来输出地图
do
{
//判断这个数组内有没有值为10 以保证地图上只有一个A
system("pause");//暂停批文件的处理并显示消息。 
for (i = 0; i < 100; i++)
{
if (map[i] == 10)
{
map[i] = 0;//清除 地图上的A
break;
}
}

//A 掷骰子
if (e == 2)
{
if (q == 0 || q == 1)
{
q++;
}
srand(unsigned(time(NULL)));
x = rand() % 6 + 1;//骰子点数 
A = A + x;//将x的值加到A中
a = A - 1;    //数组的下标
swprintf(str, 300, _T("............掷骰子(会是6吗)............"));
outtextxy(0, 280, str);
swprintf(str, 300, _T("+++++++++玩家A(%s) 掷出%d点! ! !"),aname,x);
outtextxy(0, 300, str);
swprintf(str, 300, _T("---------玩家A(%s) 现在在第%d格 ----------"),aname, A);
outtextxy(0, 320, str);
//swprintf(str, "%d:",map[0]);//
//outtextxy(0, 0, str);
Sleep(1800);
}

//B 掷骰子
if (q == 2)
{
if (e == 0 || e == 1)
{
e++;
}
srand(unsigned(time(NULL)));
y = rand() % 6 + 1;
B = B + y;
b = B - 1;//数组的下标
swprintf(str, 300, _T("............掷骰子(会是6吗)............"));
outtextxy(0, 340, str);
swprintf(str, 300, _T("+++++++++玩家B(%s) 掷出%d点! ! !"),bname,y);
outtextxy(0, 360, str);
swprintf(str, 300, _T("---------玩家B(%s) 现在在第%d格 ----------"), bname, B);
outtextxy(0, 380, str);
Sleep(2000);
cleardevice();
Sleep(200);
}
//a

//普通的道路
if (map[a] == 0)
{
map[a] = 10;//将所在位置变为A
cleardevice();
printmap(map);
}


//情况:幸运罗盘
if (map[a] == 1)
{
system("cls");    //清屏
InputBox(str, 300, _T("恭喜 ! ! ! 来到幸运转盘!\n请做出选择:\n按1和对方骑兵交换位置 \n按2轰炸对方骑兵(炸退六步)\n 按其他键: 还是算了"));
swscanf(str, _T("%d"), &c);
switch (c)
{
case 1:
{
swprintf(str, 300, _T("叮叮叮咚,交换位置............"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("玩家B(%s): \"诶 ? ? ? 怎么回事 ! ! ! "),bname);
outtextxy(0, 20, str);
temp = A;//A和B交换位置
A = B;
B = temp;

b = B - 1;
a = A - 1;
map[a] = 10;
map[b] = 20;
system("cls");
printmap(map);
break;
}
case 2:
{
swprintf(str, 300, _T("轰轰隆隆,玩家B(%s)被炸六步............"), bname);
outtextxy(0, 0, str);

B = B - 6;
b = B - 1;
a = A - 1;//a、b的改变都是为了数组值的变化
map[a] = 10;
map[b] = 20;
cleardevice();
printmap(map);
break;
}
default:
{
break;
}
}
}


//情况:地雷
if (map[a] == 2)
{
A = A - 6;
a = A - 1;
map[a] = 10;//改变地图上的输出的 字符
cleardevice();
swprintf(str, 300, _T("啊啊啊!!! 什么? 踩到地雷 后退6步"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("玩家A(%s)从第%d 格退到第%d 格-------------------------- "), aname, A + 6, A);
outtextxy(0, 20, str);
printmap(map);//调用函数printmap(map)用来输出地图
}


//情况:暂停
if (map[a] == 3)
{
map[a] = 10;
e = 0;
cleardevice();

swprintf(str, 300, _T("暂停了? ? ? 暂停了! ! !"));
outtextxy(0, 0, str);
printmap(map);
}


//情况:时空隧道
if (map[a] == 4)
{
A = A + 10;
a = A - 1;
map[a] = 10;
cleardevice();
swprintf(str, 300, _T("哇哇哇 时空隧道!!"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("冲啊! ! 玩家A(%s)现在在第%d 格--------------------------"), aname, A);
outtextxy(0, 20, str);
printmap(map);//调用函数printmap(map)用来输出地图
}

if (A >= 99)
{
map[99] = 10;
cleardevice();
printmap(map);
}

system("pause");

for (i = 0; i < 100; i++)
{
if (map[i] == 20 || map[i] == 100)
{
map[i] = 0;
break;
}
}

//情况:普通的道路
if (map[b] == 0)
{
map[b] = 20;
cleardevice();
printmap(map);
}


//情况:幸运罗盘
if (map[b] == 1)
{
cleardevice();
InputBox(str, 300, _T("恭喜 ! ! ! 来到幸运转盘!请做出选择:\n按1和对方骑兵交换位置 \n按2轰炸对方骑兵(炸退六步)\n 按其他键: 还是算了\n\n"));
swscanf(str, _T("%d"), &c);
switch (c)
{
case 1:
{
swprintf(str, 300, _T("叮叮叮咚,交换位置............"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("玩家A(%s): \"诶 ? ? ? 怎么回事 ! ! ! "), aname);
outtextxy(0, 20, str);
temp = A;//A和B交换位置
A = B;
B = temp;

b = B - 1;
a = A - 1;
map[a] = 10;
map[b] = 20;
cleardevice();
printmap(map);
break;
}
case 2:
{
swprintf(str, 300, _T("轰轰隆隆,玩家A(%s)被炸六步............"), aname);
outtextxy(0, 0, str);

A = A - 6;
b = B - 1;
a = A - 1;//a、b的改变都是为了数组值的变化
map[a] = 10;
map[b] = 20;
cleardevice();
printmap(map);
break;
}
default:
{
break;
}
}
}


//情况:地雷
if (map[b] == 2)
{
B = B - 6;
b = B - 1;
map[b] = 20;
cleardevice();
swprintf(str, 300, _T("啊啊啊!!! 什么? 踩到地雷 后退6步"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("玩家B(%s)从第%d 格退到第%d 格-------------------------- "), bname, B + 6, B);
outtextxy(0, 20, str);
printmap(map);
}


//情况:暂停
if (map[b] == 3)
{
q = 0;
map[b] = 20;
cleardevice();
swprintf(str, 300, _T("暂停了? ? ? 暂停了! ! !"));
outtextxy(0, 0, str);
printmap(map);
}


//情况:时空隧道
if (map[b] == 4)
{
B = B + 10;
b = B - 1;
map[b] = 20;
cleardevice();
printf("\n\n");
swprintf(str, 300, _T("哇哇哇 时空隧道!!"));
outtextxy(0, 0, str);
swprintf(str, 300, _T("冲啊! ! 玩家B(%s)现在在第%d 格--------------------------"), bname, B);
outtextxy(0, 20, str);
printmap(map);
}

 

else if (B >= 99)
{
map[99] = 20;
cleardevice();
printmap(map);
}
else if (A == B)
{
map[a] = 100;
cleardevice();
printmap(map);
}

} while (A <= 99 && B <= 99);

if (B > A)
{
InputBox(str, 300, _T("B赢了!!B赢了!!B赢了!!\n(输入任意键退出)"));
swscanf(str, _T("%s"), result);
}
else if (A > B)
{
InputBox(str, 300, _T("A赢了!!A赢了!!A赢了!!\n(输入任意键退出)"));
swscanf(str, _T("%s"), result);
}
else if (A == B)
{
InputBox(str, 300, _T("好悲剧~~A B 平局~~~\n(输入任意键退出)"));
swscanf(str, _T("%s"), result);
}


}

void restart(int map[100])
{
int m[100] = { 0,0,0,0,0,2,1,0,0,3,0,0,0,2,0,0,0,2,0,0,4,0,0,1,0,4,0,3,0,0,0,0,0,2,0,0,0,0,2,0,1,0,0,0,0,4,0,0,0,0,2,0,0,0,0,1,0,0,0,0,3,0,0,4,2,0,0,0,0,1,0,0,4,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,4,0,4,0,0,3,2,0,0,0,0,0 };
// 地图代码,由0、1、2、3、4组成

int i;

for (i = 0; i < 100; i++)
map[i] = m[i];


}

void printmap(int map[])//输出地图
{
int i = 0, j = 1;
drawtext(_T(" 骑士飞行棋\n'∷'是平地,'▲'是幸运罗盘,'★'是地雷,'■'是暂停,'〓'是时空隧道\n"), &r1, DT_WORDBREAK);
//sprintf(str, "%d:",map[0]);//
//outtextxy(0, 0, str);
for (i = 0; i < 31; i++)
{
switch (map[i])
{

case 0:outtextxy(20 * i, 80, _T("")); break;
case 1:outtextxy(20 * i, 80, _T("")); break;
case 2:outtextxy(20 * i, 80, _T("")); break;
case 3:outtextxy(20 * i, 80, _T("")); break;
case 4:outtextxy(20 * i, 80, _T("")); break;
case 10:outtextxy(20 * i, 80, _T("A")); break;
case 20:outtextxy(20 * i, 80, _T("B")); break;
case 100:outtextxy(20 * i, 80, _T("@@")); break;
}

}
for (; i < 35; i++)
{
switch (map[i])
{

case 0:outtextxy(600, 80 + 20 * (i - 30), _T("")); break;
case 1:outtextxy(600, 80 + 20 * (i - 30), _T("")); break;
case 2:outtextxy(600, 80 + 20 * (i - 30), _T("")); break;
case 3:outtextxy(600, 80 + 20 * (i - 30), _T("")); break;
case 4:outtextxy(600, 80 + 20 * (i - 30), _T("")); break;
case 10:outtextxy(600, 80 + 20 * (i - 30), _T("A")); break;
case 20:outtextxy(600, 80 + 20 * (i - 30), _T("B")); break;

}
}
for (; i < 66; i++)
{
switch (map[66 - (j++)])
{
case 0:outtextxy(20 * (i - 35), 180, _T("")); break;
case 1:outtextxy(20 * (i - 35), 180, _T("")); break;
case 2:outtextxy(20 * (i - 35), 180, _T("")); break;
case 3:outtextxy(20 * (i - 35), 180, _T("")); break;
case 4:outtextxy(20 * (i - 35), 180, _T("")); break;
case 10:outtextxy(20 * (i - 35), 180, _T("A")); break;
case 20:outtextxy(20 * (i - 35), 180, _T("B")); break;


}
}
for (; i < 69; i++)
{
switch (map[i])
{
case 0:outtextxy(0, 200 + 20 * (i - 66), _T("∷\n")); break;
case 1:outtextxy(0, 200 + 20 * (i - 66), _T("")); break;
case 2:outtextxy(0, 200 + 20 * (i - 66), _T("")); break;
case 3:outtextxy(0, 200 + 20 * (i - 66), _T("")); break;
case 4:outtextxy(0, 200 + 20 * (i - 66), _T("")); break;
case 10:outtextxy(0, 200 + 20 * (i - 66), _T("A")); break;
case 20:outtextxy(0, 200 + 20 * (i - 66), _T("B")); break;

}
}
for (; i < 100; i++)
{
switch (map[i])
{
case 0:outtextxy(20 * (i - 69), 260, _T("")); break;
case 1:outtextxy(20 * (i - 69), 260, _T("")); break;
case 2:outtextxy(20 * (i - 69), 260, _T("")); break;
case 3:outtextxy(20 * (i - 69), 260, _T("")); break;
case 4:outtextxy(20 * (i - 69), 260, _T("")); break;
case 10:outtextxy(20 * (i - 69), 260, _T("A")); break;
case 20:outtextxy(20 * (i - 69), 260, _T("B")); break;
case 100:outtextxy(20 * (i - 69), 260, _T("@@")); break;
}
}

}

猜你喜欢

转载自www.cnblogs.com/zhou1106/p/13374758.html
今日推荐