绘制一个坦克在控制台

绘制一个坦克在控制台_第1张图片
用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;//放大比例,只对右下角即ENDxy的值进行操作.

    //错误1:放大比例失调,xy的放大比例不同.
    //错误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");


}

你可能感兴趣的:(有趣-好玩,控制台)