📄 draw.cpp
字号:
//此文件定义了所有作图的函数
#include "structs.h"
#include <graphics.h>
#include <iostream.h>
#include<conio.h>
#include<dos.h>
void draw_InitGraph() // 初始化图形模式
{
static int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
}
void draw_ShowBoard(_Nodes *Nodes) // 画棋盘
{
int colorSet[7]={0,RED,GREEN,YELLOW,BLUE,BROWN,WHITE}; // 对应于不用游戏者的棋子颜色
int cut[3][2]={ {10,0},{5,8},{-5,8}}; // 用于舍掉圆圈里面的线
setcolor(WHITE);
settextstyle(1,0,15);
outtextxy(10,10,"Press 'w' to move up");
outtextxy(10,20,"Press 's' to move down");
outtextxy(10,30,"Press 'a' to move right");
outtextxy(10,40,"Press 'd' to move left");
outtextxy(10,50,"Press 'space' to sellct");
outtextxy(10,60,"Press 'q' to quit");
outtextxy(10,70,"Press 'h' to regret");
outtextxy(10,80,"Press 'r' to restart");
setcolor(WHITE); // 前景色为白色
for(int i=0,j;i<121;i++)
{
circle(Nodes[i].cood.x,Nodes[i].cood.y,10); // 画圆圈,半径为10
if(Nodes[i].Chessman>0) // 如果有棋子
{
setfillstyle(1,colorSet[Nodes[i].Chessman]); // 设置填充模式
// 将棋子填充颜色
floodfill(Nodes[i].cood.x,Nodes[i].cood.y,WHITE);
}
for(j=0;j<3;j++) // 每个棋子只画三个方向的直线,
// 这样便可以画出所有的直线
if(Nodes[i].pointers[j]) // 如果该方向有节点存在
line(Nodes[i].cood.x+cut[j][0],Nodes[i].cood.y+cut[j][1],
Nodes[i].pointers[j]->cood.x-cut[j][0],Nodes[i].pointers[j]->cood.y-cut[j][1]);
if(Nodes[i].sellect) //如果序号为i的棋子被选中
{
setfillstyle(2,WHITE); //转换填充模式,填充
floodfill(Nodes[i].cood.x,Nodes[i].cood.y,WHITE);
}
}
}
void draw_GamerControl(int NowplayerIndex) // 显示当前控制权的掌握者
{
char *names[]={ "Gamer1 Control","Gamer2 Control"};
settextstyle(1,0,15); // 设置文本输出模式
outtextxy(50,200,names[NowplayerIndex]); // 输出文本
}
void draw_SellectChessman(_Nodes *Nodes,int index) // 选择棋子之后重画棋盘
{
cleardevice();
draw_ShowBoard(Nodes);
}
void draw_MoveChess(_Nodes *Nodes,int*road,int end) // 画棋子所走的路径
{
int k,color;
_Nodes *Next; // 指向节点的指针
int colorSet[7]={0,RED,GREEN,YELLOW,BLUE,BROWN,WHITE}; // 对应于游戏者的不用颜色
color=Nodes[end].Chessman; // 获得游戏者的颜色
cleardevice(); // 清屏
draw_ShowBoard(Nodes); // 画棋盘
setfillstyle(1,BLACK); // 设置填充模式
/*由于调用_ChessBoard::MoveIt(int)后,上面的draw_ShowBoard()已经在目标点画上棋子所以在此要先清除*/
floodfill(Nodes[end].cood.x,Nodes[end].cood.y,WHITE);
setfillstyle(1,colorSet[color]); // 设置填充模式
floodfill(Nodes[road[0]].cood.x,Nodes[road[0]].cood.y,WHITE); // 填充路径重第一个节点(起始节点)
for(k=0;road[k]!=end&&k<121;k++) // 画路径
{
delay(500); // 停留0.5秒
Next=&Nodes[road[k]]; // 指向路径中的下一个节点
setfillstyle(1,BLACK); // 设置填充的模式,掩盖当前的节点
floodfill(Next->cood.x,Next->cood.y,WHITE); // 填充
setfillstyle(1,colorSet[color]); // 设置填充的模式,画下一个节点
// 填充下一个节点
floodfill(Nodes[road[k+1]].cood.x,Nodes[road[k+1]].cood.y,WHITE);
}
}
void draw_Movesellect(_Nodes *Nodes,int index) // 选择框变换之后重画棋盘
{
draw_ShowBoard(Nodes); // 画棋盘
setcolor(YELLOW); // 设置前景色为红色
circle(Nodes[index].cood.x,Nodes[index].cood.y,10); // 画选择框
setcolor(WHITE); // 将前景色恢复为白色
}
void draw_ShowWin(int wingamer) // 赢棋处理
{
char *names[]={ "Gamer1 Win","Gamer2 Win"};
setcolor(RED); // 设置前景色为红色
settextstyle(0,0,5); // 设置文本输出模式
outtextxy(80,200,names[wingamer]); // 输出文本
getch();
}
void draw_EndGame() // 游戏结束的处理
{
setcolor(YELLOW); // 设置前景色为黄色
settextstyle(0,0,7); // 设置文本输出模式
outtextxy(80,200,"Game Over"); // 输出文本
getch(); // 等待键盘输入
closegraph(); // 退出图形模式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -