| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 528 人关注过本帖
标题:C贪吃蛇源码,帮看看为什么分数上不了200分就玩不了了
只看楼主 加入收藏
HandsomeOX
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-9-26
收藏
 问题点数:0 回复次数:1 
C贪吃蛇源码,帮看看为什么分数上不了200分就玩不了了
程序代码:
#include <windows.h>  
#include <time.h>

typedef enum _bool{false,true} bool;

//定义蛇结构
struct _Snake
{
    int X;
    int Y;
    int Snake_fx;
}Snake[300];

int SnakeNum=3;    //蛇长度,初始为3
int SnakeFX=3;    //蛇头方向
POINT Food;        //食物
int Block=20;    //块大小
int WinW,WinH;    //屏幕尺寸
int Score;//分数

bool isCONFINE(int x,int y);    //蛇头前进方向边界检测
bool isFOOD(int x,int y);        //蛇头前进方向食物检测
bool isOWN(int x,int y);        //蛇头前进方向是自身
void eatFOOD();                    //吃食物
void creFOOD();                    //生成食物
bool isOver(HWND hwnd,int x,int y);    //游戏结束
void setAppText(HWND hwnd,int score);//设置标题

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;  

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
                    PSTR szCmdLine, int iCmdShow)  
{  
    static TCHAR szAppName[] = TEXT ("zfSnake") ;  
    HWND         hwnd ;  
    MSG          msg ;  
    WNDCLASS     wndclass ;  
  
    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  
    wndclass.lpfnWndProc   = WndProc ;  
    wndclass.cbClsExtra    = 0 ;  
    wndclass.cbWndExtra    = 0 ;  
    wndclass.hInstance     = hInstance ;  
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;  
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ; 
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
    wndclass.lpszMenuName  = NULL ;  
    wndclass.lpszClassName = szAppName ;  
  
    if (!RegisterClass (&wndclass))  
    {  
        MessageBox (NULL, TEXT ("This program requires Windows NT!"),   
            szAppName, MB_ICONERROR) ;  
        return 0 ;  
    }  
  
    hwnd = CreateWindow (szAppName,              
        TEXT ("zfSnake"),   
        WS_OVERLAPPEDWINDOW,       
        CW_USEDEFAULT,             
        CW_USEDEFAULT,              
        816,             
        638,               
        NULL,                         
        NULL,                        
        hInstance,                   
        NULL) ;                       
  
    ShowWindow (hwnd, iCmdShow) ;  
    UpdateWindow (hwnd) ;  
  
    while (GetMessage (&msg, NULL, 0, 0))  
    {  
        TranslateMessage (&msg) ;  
        DispatchMessage (&msg) ;  
    }  
    return msg.wParam ;  
}  
  
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
    HDC         hdc;  
    PAINTSTRUCT ps ;  
    HPEN hPen,hPenOld;
    RECT winR;

    int i;
    int TempFX1,TempFX2;

    switch (message)  
    {  
    case WM_CREATE:
        SetTimer (hwnd, 0, 100, NULL) ;//设置时间

        //获取客户区大小
        GetClientRect(hwnd,&winR);
        WinW=winR.right;
        WinH=winR.bottom;

        //初始化蛇
        for(i=0;i<SnakeNum;i++)
        {
            Snake[i].X=400;Snake[i].Y=200+i*20;Snake[i].Snake_fx=SnakeFX;
        }
        
        creFOOD(); //随机生成食物
        Score=0;

        return 0 ;  
  
    case WM_PAINT:  
  
        hdc = BeginPaint (hwnd, &ps);  
        hPen = CreatePen( PS_SOLID, 1, RGB( 0, 0, 0 ));
        hPenOld = ( HPEN )SelectObject ( hdc, hPen );
        
        //画网格地图
        for(i=0;i<=WinH;i=i+Block)
        {
            MoveToEx(hdc,0,i,NULL);
            LineTo(hdc,WinW,i);
        }
        for(i=0;i<=WinW;i=i+Block)
        {
            MoveToEx(hdc,i,0,NULL);
            LineTo(hdc,i,WinH);
        }

        //FillRgn(hdc,CreateRectRgn(0,0,20,20),(HBRUSH)hPen);
        for(i=0;i<SnakeNum;i++)
        {
            FillRgn(hdc,CreateRectRgn(Snake[i].X,Snake[i].Y,Snake[i].X+20,Snake[i].Y+20),(HBRUSH)(hPen));
        }

        FillRgn(hdc,CreateRectRgn(Food.x*20,Food.y*20,Food.x*20+20,Food.y*20+20),(HBRUSH)(hPen));
        
        setAppText(hwnd,Score*10);

        SelectObject (hdc , hPenOld);
        EndPaint(hwnd, &ps);
        return 0;  
  
    case WM_TIMER:  
        if((SnakeFX==1 && Snake[0].Snake_fx==2) || (SnakeFX==2 && Snake[0].Snake_fx==1)) goto xx;
        if((SnakeFX==3 && Snake[0].Snake_fx==4) || (SnakeFX==4 && Snake[0].Snake_fx==3)) goto xx;
        
        switch(SnakeFX)
        {
        case 1:
            if(isOver(hwnd,Snake[0].X-Block,Snake[0].Y)) return 0;

            if(isFOOD(Snake[0].X-Block,Snake[0].Y))
            {
                eatFOOD();
            }
            Snake[0].Snake_fx=1;
            break;
        case 2:
            if(isOver(hwnd,Snake[0].X+Block,Snake[0].Y)) return 0;

            if(isFOOD(Snake[0].X+Block,Snake[0].Y))
            {
                eatFOOD();
            }
            Snake[0].Snake_fx=2;
            break;
        case 3:
            if(isOver(hwnd,Snake[0].X,Snake[0].Y-Block)) return 0;

            if(isFOOD(Snake[0].X,Snake[0].Y-Block))
            {
                eatFOOD();
            }
            Snake[0].Snake_fx=3;
            break;
        case 4:
            if(isOver(hwnd,Snake[0].X,Snake[0].Y+Block)) return 0;

            if(isFOOD(Snake[0].X,Snake[0].Y+Block))
            {
                eatFOOD();
            }
            Snake[0].Snake_fx=4;
            break;
        }

        //蛇前进
xx:
        for(i=0;i<SnakeNum;i++)
        {
            switch(Snake[i].Snake_fx)
            {
            case 1:
                Snake[i].X=Snake[i].X-Block;
                break;
            case 2:
                Snake[i].X=Snake[i].X+Block;
                break;
            case 3:
                Snake[i].Y=Snake[i].Y-Block;
                break;
            case 4:
                Snake[i].Y=Snake[i].Y+Block;
                break;
            }
            
        }
        TempFX1=Snake[0].Snake_fx;
        for(i=1;i<SnakeNum;i++)
        {
            TempFX2=Snake[i].Snake_fx;
            Snake[i].Snake_fx=TempFX1;
            TempFX1=TempFX2;
        }
        
        InvalidateRect(hwnd, NULL, true); 
        return 0;  
    case WM_KEYDOWN:        //处理键盘消息  
        switch(wParam)  
        {  
        case VK_LEFT:  
            SnakeFX = 1;  
            break;  
        case VK_RIGHT:  
            SnakeFX = 2;  
            break;  
        case VK_UP:  
            SnakeFX = 3;  
            break;  
        case VK_DOWN:  
            SnakeFX = 4;  
            break;  
        }  
        return 0;  
    case WM_DESTROY:  
        PostQuitMessage (0) ;  
        return 0 ;  
    }  
    return DefWindowProc (hwnd, message, wParam, lParam) ;  
} 

bool isCONFINE(int x,int y)
{
    if((x<0 || x>780) || (y<0 || y>580))
        return true;
    return false;
}

bool isFOOD(int x,int y)
{
    if(Food.x*20==x && Food.y*20==y)
        return true;
    return false;
}
bool isOWN(int x,int y)
{
    int i;
    for(i=0;i<SnakeNum;i++)
    {
        if(Snake[i].X==x && Snake[i].Y==y)
            return true;
    }
    return false;
}
void eatFOOD()
{
    SnakeNum++;
    switch(Snake[SnakeNum-2].Snake_fx)
    {
        case 1:
            Snake[SnakeNum-1].X=Snake[SnakeNum-2].X+Block;
            Snake[SnakeNum-1].Y=Snake[SnakeNum-2].Y;
            Snake[SnakeNum-1].Snake_fx=Snake[SnakeNum-2].Snake_fx;
            break;
        case 2:
            Snake[SnakeNum-1].X=Snake[SnakeNum-2].X-Block;
            Snake[SnakeNum-1].Y=Snake[SnakeNum-2].Y;
            Snake[SnakeNum-1].Snake_fx=Snake[SnakeNum-2].Snake_fx;
            break;
        case 3:
            Snake[SnakeNum-1].X=Snake[SnakeNum-2].X;
            Snake[SnakeNum-1].Y=Snake[SnakeNum-2].Y+Block;
            Snake[SnakeNum-1].Snake_fx=Snake[SnakeNum-2].Snake_fx;
            break;
        case 4:
            Snake[SnakeNum-1].X=Snake[SnakeNum-2].X;
            Snake[SnakeNum-1].Y=Snake[SnakeNum-2].Y-Block;
            Snake[SnakeNum-1].Snake_fx=Snake[SnakeNum-2].Snake_fx;
            break;
    }

    Score++;
    
    creFOOD();//吃完食物后再随机生成食物
    
}

bool isOver(HWND hwnd,int x,int y)
{
    if((isCONFINE(x,y)) || (isOWN(x,y)))
    {
        KillTimer(hwnd,0);
        MessageBox(hwnd,TEXT("游戏结束!!!"),"GameOver",MB_OK);
        return true;
    }

    return false;
}

void creFOOD()
{
    srand((unsigned)time(NULL));  
    Food.x=rand()%(WinW/20);
    Food.y=rand()%(WinH/20);
}

void setAppText(HWND hwnd,int score)
{
    TCHAR Buffer[20];
    wsprintf(Buffer,TEXT("Snake-[分数:%d]"),score);
    SetWindowText(hwnd,Buffer);
}    
搜索更多相关主题的帖子: 贪吃蛇 200分 
2014-12-26 09:00
HandsomeOX
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-9-26
收藏
得分:0 
编译环境:VC 6.0
2014-12-26 09:01
快速回复:C贪吃蛇源码,帮看看为什么分数上不了200分就玩不了了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020534 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved