#include<Windows.h>
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <time.h>
#define USERTANKMAP 1
#define ENETANKMAP 2
#define USERTANK "■"
#define TANK_DIR_UP 0
#define TANK_DIR_DW 2
#define TANK_DIR_LF 1
#define TANK_DIR_RH 3
//用户坦克
typedef struct USER     //速度为3
{
	int x;
	int y;
	int life;   //默认为50
	int aggressivity;  //默认为25
	int dir;
}user, *Puser;
//全局的用户坦克
user myuser;

//字符打印
void PrintChar(int Wide, int High, char*pszChar, WORD wAttr) {
	//1.设置光标属性
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize = 1;
	cci.bVisible = FALSE;
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(hOut, &cci);
	//2.修改光标在控制台中的坐标位置
	COORD loc;
	loc.X = Wide * 2;
	loc.Y = High;
	//3.设置光标在控制台中的坐标位置
	SetConsoleCursorPosition(hOut, loc);
	// 设置打印符号的前景色背景色
	SetConsoleTextAttribute(hOut, wAttr);
	// 输出你想输出的
	printf("%s", pszChar);
}
void tankchar(int Wide, int High, char*pszChar, WORD wAttr) {
	switch (myuser.dir)
	{
	case TANK_DIR_LF:
		PrintChar(myuser.x, myuser.y, USERTANK, wAttr);
		///////////////////////////////////////////////////////////
		PrintChar(myuser.x, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x - 1, myuser.y, USERTANK, wAttr);
		PrintChar(myuser.x, myuser.y + 1, USERTANK, wAttr);
		PrintChar(myuser.x + 1, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x + 1, myuser.y + 1, USERTANK, wAttr);
		break;
	case TANK_DIR_RH:
		PrintChar(myuser.x, myuser.y, USERTANK, wAttr);
		///////////////////////////////////////////////////////////
		PrintChar(myuser.x + 1, myuser.y, USERTANK, wAttr);
		PrintChar(myuser.x, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x, myuser.y + 1, USERTANK, wAttr);
		PrintChar(myuser.x - 1, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x - 1, myuser.y + 1, USERTANK, wAttr);
		break;
	case TANK_DIR_UP:
		PrintChar(myuser.x, myuser.y, USERTANK, wAttr);
		//////////////////////////////////////////////////////////
		PrintChar(myuser.x + 1, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x + 2, myuser.y, USERTANK, wAttr);
		PrintChar(myuser.x + 2, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x + 1, myuser.y - 2, USERTANK, wAttr);
		break;
	case TANK_DIR_DW:
		PrintChar(myuser.x, myuser.y, USERTANK, wAttr);
		///////////////////////////////////////////////////////////
		PrintChar(myuser.x - 1, myuser.y, USERTANK, wAttr);
		PrintChar(myuser.x - 1, myuser.y - 1, USERTANK, wAttr);
		PrintChar(myuser.x, myuser.y + 1, USERTANK, wAttr);
		PrintChar(myuser.x + 1, myuser.y, USERTANK, wAttr);
		PrintChar(myuser.x + 1, myuser.y - 1, USERTANK, wAttr);
		break;
	default:
		break;
	}
}
void TankMove(int m_nDir)
{
	if (myuser.x > 3 || myuser.x<37 || myuser.y >3 || myuser.y<37)
	{
		PrintChar(myuser.x + 1, myuser.y, "  ", 0x00);
		system("cls");
		switch (m_nDir) {
		case TANK_DIR_UP:
			myuser.y--;
			break;
		case TANK_DIR_DW:
			myuser.y++;
			break;
		case TANK_DIR_LF:
			myuser.x--;
			break;
		case TANK_DIR_RH:
			myuser.x++;
			break;
		}
		tankchar(myuser.x, myuser.y, USERTANK, 0x44);
	}
}
bool ChangeDir(char cDir) {
	int nNewDir = -1;
	switch (cDir) {
	case 'W':
	case 'w':
		nNewDir = TANK_DIR_UP;
		break;
	case 's':
	case 'S':
		nNewDir = TANK_DIR_DW;
		break;
	case 'a':
	case 'A':
		nNewDir = TANK_DIR_LF;
		break;
	case 'd':
	case 'D':
		nNewDir = TANK_DIR_RH;
		break;
	case 'q':
	case 'Q':
		exit(0);
		break;
	case 'e':
	case 'E':
		_getch();
		break;
	default:
		break;
	}
	myuser.dir = nNewDir;
	TankMove(nNewDir);
	return true;
}
void main()
{
	//////////////////模拟按下shit键////////////////
	keybd_event(VK_SHIFT, 0, 0, 0);
	keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
	myuser.x = 20;
	myuser.y = 20;
	myuser.dir = TANK_DIR_DW;
	PrintChar(myuser.x, myuser.y, USERTANK, 0x55);
	char ch = _getch();
	if (ch == 'w' || ch == 'W' || ch == 'a' || ch == 'A' || ch == 's' || ch == 'S' || ch == 'd' || ch == 'D') {
		// 设置坦克的移动时间间隔
		clock_t tBegin = clock(), tEnd = 0;
		while (true) {
			if (_kbhit())
			{
				char ch = _getch();
				ChangeDir(ch);
			}
			tEnd = clock();
			if (tEnd - tBegin > 200)
			{
				tBegin = tEnd;
				TankMove(myuser.dir);
			}
		}
	}
}