⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw.cpp

📁 利用c++编写的带人工智能的跳棋程序。屏幕的中央是棋盘
💻 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 + -