跳跃的小球,旅行家问题

By admin in 图书 on 2020年1月16日

#include <stdio.h> #include <windows.h> int main() { char title[200];//能存放200个字符的字符数组,用于保存窗口的标题 HWND hwnd;      //窗口的句柄 RECT rect;      //矩形结构体 int width,height;//窗口的宽度和高度 POINT ptCenter;  //窗口的中心点 HDC hdc;        //窗口的设备上下文 HBRUSH hBrush,hClearBrush,hOldBursh;//画刷 int disX=5,disY=5;//小球每次左右、上下移动5像素 GetConsoleTitle(title,200);//1.获取控制台窗口的标题 hwnd=FindWindow(NULL,title);//2.通过标题得到该窗口的句柄 GetClientRect(hwnd,&rect);//3.获取窗口的宽度与高度 width=rect.right-rect.left;//右边的点减左边的点就是窗口的宽度 height=rect.bottom-rect.top;//下边的点减上边的点就是窗口的高度 ptCenter.x=width/2;//4.获取窗口的中心点,为画圆作准备 ptCenter.y=height/2; hdc=GetDC(hwnd);//5.获取窗口DC hBrush=CreateSolidBrush(RGB(255,0,0));//6.创建红色画刷和黑色画刷 hClearBrush=CreateSolidBrush(RGB(0,0,0)); while(1) { hOldBursh=SelectObject(hdc,hBrush);//7.选择红色的画刷开始画圆  Ellipse(hdc,ptCenter.x-20,ptCenter.y-20,ptCenter.x+20,ptCenter.y+20); //8.间隔10毫秒移动一次小球,移动的距离均为5像素 Sleep(20); //9.选择黑色的画刷进行清除移动的影子。 SelectObject(hdc,hClearBrush); Ellipse(hdc,ptCenter.x-20,ptCenter.y-20,ptCenter.x+20,ptCenter.y+20); if(ptCenter.x+20>=width||ptCenter.x-20<=0) disX=-disX; ptCenter.x+=disX; if(ptCenter.y+20>=height||ptCenter.y-20<=0) disY=-disY; ptCenter.y+=disY; //10.放回原先的画刷 SelectObject(hdc,hOldBursh); } return 0; }

#define WINDOW_WIDTH  400
#define WINDOW_HEIGHT 420
#define MY_INTERVAL 500
#define NUMBER_OF_PIXEL 9

void travel(int *a,int *path,int len){
    int *p,*c,*tmp;
    int i,j,k,flg;
    int b=-1,d;

void myfun(LPVOID sc){
    HWND* hwnd=(HWND*)sc;
    int i,j,*list,ds;
    double dis;
    int path[NUMBER_OF_PIXEL+1]={0};
    char str[1024]={0};
  
 list=(int*)malloc(sizeof(int)*NUMBER_OF_PIXEL*NUMBER_OF_PIXEL);
    memset(list,0,sizeof(int)*NUMBER_OF_PIXEL*NUMBER_OF_PIXEL);
    for(i=0;i<NUMBER_OF_PIXEL;i++){
        for(j=i+1;j<NUMBER_OF_PIXEL;j++){
          
 dis=sqrt((mypix[i].x-mypix[j].x)*(mypix[i].x-mypix[j].x)+(mypix[i].y-mypix[j].y)*(mypix[i].y-mypix[j].y));
            ds=(int)(1000*dis);
            *(list+i*NUMBER_OF_PIXEL+j)=ds;
            *(list+j*NUMBER_OF_PIXEL+i)=ds;
        }
    }

    p=(int*)malloc(sizeof(int)*len);
    c=(int*)malloc(sizeof(int)*len);
    tmp=(int*)malloc(sizeof(int)*len);
    memset(p,0,sizeof(int)*len);
    memset(c,0,sizeof(int)*len);

    travel(list,path,NUMBER_OF_PIXEL);
    for(i=0;i<NUMBER_OF_PIXEL+1;i++){
        myline[i].x=mypix[path[i]].x;
        myline[i].y=mypix[path[i]].y;
    }
    free(list);
    while(1){
        Sleep(MY_INTERVAL);
        showpos++;
        if(showpos>NUMBER_OF_PIXEL+3) showpos=0;
    }
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                   LPSTR szCmdLine,int iCmdShow){
    HWND hWnd;
    WNDCLASSEX winclass;
    winclass.cbSize        = sizeof(WNDCLASSEX);
    winclass.style         = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc   = WindowProc;
    winclass.cbClsExtra    = 0;
    winclass.cbWndExtra    = 0;
    winclass.hInstance     = hInstance;
    winclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = NULL;
    winclass.lpszMenuName  = NULL;
    winclass.lpszClassName = g_szWindowClassName;
    winclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

POINT mypix[NUMBER_OF_PIXEL];
POINT myline[NUMBER_OF_PIXEL+1]={0};
int showpos=0;

    MSG msg;
    bool bDone=false;
    while(!bDone){
        while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
            if(msg.message==WM_QUIT){
                TerminateThread(thrd,NULL);
                bDone=true;
            }else{
                TranslateMessage(&msg);DispatchMessage(&msg);
            }
        }
        InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);
    }
    UnregisterClass(g_szWindowClassName,winclass.hInstance);
    return msg.wParam;
}

    if(!hWnd){
        MessageBox(NULL,”CreateWindowEx Error!”,”error”,0);
    }

char* g_szApplicationName=”旅行家问题(枚举法)”;
char* g_szWindowClassName=”LinrenWindowClass”;

LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
lParam){
    static int cxClient,cyClient;
    static HDC hdcBackBuffer;
    static HBITMAP hBitmap;
    static HBITMAP hOldBitmap;

    switch(msg){
    case WM_CREATE:
        {
            RECT rect;
            GetClientRect(hwnd,&rect);
            cxClient=rect.right;
            cyClient=rect.bottom;
            int i,x,y;
            srand((int)time(0));
            for(i=0;i<100;i++) RandInt(0,0);
            for(i=0;i<NUMBER_OF_PIXEL;i++){
                x=RandInt(20,380);y=RandInt(20,380);
                mypix[i].x=x;mypix[i].y=y;
                Ellipse(hdcBackBuffer,x-5,y-5,x+5,y+5);
            }
            for(i=0;i<NUMBER_OF_PIXEL;i++){
              
 SetPixel(hdcBackBuffer,mypix[i].x,mypix[i].y,NULL);
            }
            hdcBackBuffer=CreateCompatibleDC(NULL);
            HDC hdc=GetDC(hwnd);
            hBitmap=CreateCompatibleBitmap(hdc,cxClient,cyClient);
            hOldBitmap=(HBITMAP)SelectObject(hdcBackBuffer,hBitmap);
            ReleaseDC(hwnd,hdc);
        }
        break;

#include <windows.h>
#include <time.h>
#include <math.h>

    if (!RegisterClassEx(&winclass)){
        MessageBox(NULL,”RegisterClassEx Error!”,”error”,0);return 0;
    }
    
    hWnd=CreateWindowEx(NULL,
        g_szWindowClassName,
        g_szApplicationName,
        WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
        GetSystemMetrics(SM_CXSCREEN)/2-WINDOW_WIDTH/2,
        GetSystemMetrics(SM_CYSCREEN)/2-WINDOW_HEIGHT/2,
        WINDOW_WIDTH,
        WINDOW_HEIGHT,
        NULL,NULL,hInstance,NULL);

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd,&ps);
          
 BitBlt(hdcBackBuffer,0,0,cxClient,cyClient,NULL,NULL,NULL,WHITENESS);
            int i,x,y;
            for(i=0;i<NUMBER_OF_PIXEL;i++){
                x=mypix[i].x;y=mypix[i].y;
                Ellipse(hdcBackBuffer,x-5,y-5,x+5,y+5);
            }
            for(i=0;i<NUMBER_OF_PIXEL&&i<showpos;i++){
                if(myline[i+1].x==0) break;
                MoveToEx(hdcBackBuffer,myline[i].x,myline[i].y,0);
                LineTo(hdcBackBuffer,myline[i+1].x,myline[i+1].y);
            }
          
 BitBlt(ps.hdc,0,0,cxClient,cyClient,hdcBackBuffer,0,0,SRCCOPY);
            EndPaint(hwnd,&ps);Sleep(10);
        }
        break;

    k=0;flg=1;
    while(flg){
        for(p[k]=0;p[k]<len;p[k]++){
            for(i=0;i<k;i++){
                if(p[i]==p[k]) break;
            }
            if(i!=k) continue;
            c[k]++;
            if(k==len-1){
                d=0;
                for(i=0;i<len-1;i++) d+=*(a+p[i]*len+p[i+1]);
                d+=*(a+p[i]*len+p[0]);
                if(b==-1||d<b){
                    b=d;
                    memcpy(tmp,p,sizeof(int)*len);
                }
                for(i=len-1,j=1;c[i]==j&&i>=0;i–,j++);
                if(j==len+1){
                    flg=0;break;
                }
                k=i;
                if(k<len-1){
                    memset(c+k+1,0,sizeof(int)*(len-k-1));
                }
            }
            else k++;
        }
    }
    for(i=0;i<len;i++) path[i]=tmp[i];
    path[i]=tmp[0];
    free(p);free(c);free(tmp);
}

inline int RandInt(int x,int y){
    return rand()%(y-x+1)+x;
}

    case WM_DESTROY:
        {
            SelectObject(hdcBackBuffer,hOldBitmap);
            DeleteDC(hdcBackBuffer);DeleteObject(hBitmap);
            PostQuitMessage(0);
        }break;
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
}

    ShowWindow(hWnd, iCmdShow);UpdateWindow(hWnd);
    
    HANDLE thrd;
  
 thrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myfun,(LPVOID)&hWnd,0,NULL);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2020 大奖888网页版登陆 版权所有