用MoveToEx和LineTo按要求画块.这些块组成了坦克.但是我对如何抹掉画过的东西不太清楚.大约是”刷新GDI”?或者用底色全屏覆写.
// 接受参数进行判断.cpp : 定义控制台应用程序的入口点。
//判断当前输入ascii, 模拟一个控制台画出一个坦克来.
//Author:dalerkd
//0.2版本2015年3月25日 14:40:01
//0.3版本2015年3月25日 17:45:22
//特点可以使用相对坐标模拟控制台
//缺点:不知如何抹掉画出的线条.哈哈需要手工拉下进度条.666
#include "stdafx.h"
#include "stdlib.h"
#include "conio.h"
#include <Windows.h>
//本代码没有对“非数字”进行判断,这是为了程序的扩展。当然你可以通过对ascii的限制来完成判断的目的。
//本程序输入再多也不溢出哟
//是否可以通过外在的规则文件的输入使之能变通地解决一些问题?任Kitty—2015-3-11 20:20:27
//该函数总是可以获取当前输入的字符的ASCII,并通过switch-case对其进行判断.
//该函数用于画某宽度的线,
struct Tankea
{
POINT START;
POINT END;
int WIDTH;
}strTanke;
void bpaintwidth(HDC hdc,POINT START,POINT END,int WIDTH)
{
//MoveToEx(hdc,START.x,START.y,NULL);
//本函数未对WIDTH进行处理,而是直接计算宽度.以后可以改进哟.
if(START.x>=END.x||START.y>=END.y)
{
exit(-1);
}
int iSNx,iSNy,iENx,iENy;//定义变量
iSNx=START.x;
iSNy=START.y;
iENx=END.x;
iENy=END.y;
for(int i=0;i<=(END.x-START.x+1);i++,iSNx++)
{
MoveToEx(hdc,iSNx,iSNy,NULL);
LineTo(hdc,iSNx,iENy);
}
}
//从指定结构体数组获取需要的数据.结构体数组的格式为:{POINT START,POINT END,int WIDTH}
void rpaint(HDC hdc,Tankea tW[6],int iJiaodu,POINT pBasePOINT)//传入pBasePOINT,用于指定输入位置左上角的绝对坐标
{
//tW[]数组要不要初始化?答案是要初始化.汗
POINT STARTA;//用于传参数给绘图程序
POINT ENDA;
int WIDTHA=0;
int iFangda=10;//放大比例,只对右下角即END的x和y的值进行操作.
//错误1:放大比例失调,x和y的放大比例不同.
//错误2:结构体数组第二次循环
for(int i=0;i<6;i++)
{
STARTA.x=tW[i].START.x*iFangda+pBasePOINT.x;//换算绝对值
STARTA.y=tW[i].START.y*iFangda+pBasePOINT.y;
ENDA.x=tW[i].END.x*iFangda+pBasePOINT.x;
ENDA.y=tW[i].END.y*iFangda+pBasePOINT.y;
WIDTHA=tW[i].WIDTH*iFangda;
//调用绘线宽的程序
bpaintwidth(hdc,STARTA,ENDA,WIDTHA);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HWND hwnd;
HDC hdc;
Tankea tW[6]={
{{1,0},{2,1},1},
{{0,1},{1,2},1},
{{1,1},{2,2},1},
{{2,1},{3,2},1},
{{0,2},{1,3},1},
{{2,2},{3,3},1}
};
//定义W的结构体数组,{相对坐标,相对坐标,相对线宽)
Tankea tA[6]={
{{1,0},{2,1},1},
{{2,0},{3,1},1},
{{0,1},{1,2},1},
{{1,1},{2,2},1},
{{1,2},{2,3},1},
{{2,2},{3,3},1}
};
Tankea tD[6]={
{{0,0},{1,1},1},
{{1,0},{2,1},1},
{{1,1},{2,2},1},
{{2,1},{3,2},1},
{{0,2},{1,3},1},
{{1,2},{2,3},1}
};
Tankea tS[6]={
{{0,0},{1,1},1},
{{2,0},{3,1},1},
{{0,1},{1,2},1},
{{1,1},{2,2},1},
{{2,1},{3,2},1},
{{1,2},{2,3},1}
};
//获取console的设备上下文句柄
hwnd = GetConsoleWindow();
hdc = GetDC(hwnd);
//调整一下console背景颜色,否则看不清线条
system("color 3D");
system("title 你好WASD.按“T”键退出");
/*while(1)
{*/
//system("CLS");这个东西擦不掉线
printf ("输入要判断的数:");
char tmp[2];
int iXiabiao=0;
/*while(1)
{*/
iXiabiao=!(iXiabiao);//一共有两个位置,通过这个语句使循环存储字符,每次可以回溯上一个输入的字符
tmp[iXiabiao]=_getch();
//putchar(tmp[iXiabiao]);//回显输入,可关闭
//system("CLS");
switch (tmp[iXiabiao])//想对什么响应就加入case吧.
{
/*case '\r':
{;
}*/
case 't':
{
exit(0);
}
case 'T':
{
exit(0);
}
case 'w':
{
POINT pw;//显示的左上角绝对坐标
pw.x=20;
pw.y=20;
rpaint(hdc,tW,0,pw);//(设备上下文,对象,角度,坐标)
break;
}
case 'W':
{
POINT pw;//显示的左上角绝对坐标
pw.x=20;
pw.y=20;
rpaint(hdc,tW,0,pw);//(设备上下文,对象,角度,坐标)
break;
}
case 'a':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tA,0,pw);
break;
}
case 'A':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tA,0,pw);
break;
}
case 'd':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tD,0,pw);
break;
}
case 'D':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tD,0,pw);
break;
}
case 's':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tS,0,pw);
break;
}
case 'S':
{
POINT pw;
pw.x=20;
pw.y=20;
rpaint(hdc,tS,0,pw);
break;
}
default:
break;
}
//}
//}
system("pause");
}