贪吃蛇小游戏

2 篇文章 0 订阅

VS2012 + Easy X 做的一个贪吃蛇小游戏

一个简单的小游戏, 只要实现逻辑。

Game.h

#pragma once

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#pragma comment(lib, "winmm.lib")

#define WINDOWS_WIDTH 640
#define WINDOWS_HEIGHT 480
#define SNAKE_MAXNUM 100
#define  SNAKE_SIZE 10

//分数
wchar_t szScore[MAXBYTE] = {0};
int Score = 0;
//等级
wchar_t szLever[MAXBYTE] = {0};
int Lever = 1;
//速度
wchar_t szSped[MAXBYTE] = {0};
int speed = 0;

int coumt = 0;  //计数器

typedef enum Ch
{
    up = 72,
    down = 80,
    left = 75,
    right = 77
}Ch;    //  蛇的方向

typedef struct Coor
{
    int x;
    int y;
}COOR;      //坐标

//实物结构体
typedef struct Food
{
    Coor fCor;  //实物坐标
    int isEat;  //是否被吃
}FOOD;

//自定义结构体类型表示蛇  节数 方向 坐标
typedef struct Snake
{
    COOR sCor[SNAKE_MAXNUM];//蛇的坐标 包含100节
    int n;  //当前的节数
    Ch ch;  //蛇的方向

}SNAKE;

//游戏函数
void PlayGame();

//定义蛇
SNAKE snake;

//定义实物
FOOD food;

//游戏函数
//初始化
void GameInit();    

//移动
void SnakeMove();   

//蛇的绘制
void SnakeDraw();

//控制
void SnakeChange();

//绘制食物
void FoodDraw();

//获取食物的坐标
void FoodCoor();

//吃食物事件
void FoodEat();

//碰撞检测  判断蛇头与碰撞物的坐标是否重叠
void SnakeBreak();

//分数
void Achievement(int score);

Game.cpp

#include "game.h"


int main()
{

    PlayGame();

    getch();
    closegraph();
    return 0;
}

void PlayGame()
{
    GameInit();
    Achievement(Score);
    SetWindowText(GetHWnd(), _T("贪吃蛇 By:陈晓武 Time:2017-03-20"));
    while (1)
    {
        while (!_kbhit())
        {
            setfillcolor(BLACK);
            solidrectangle(0,0,WINDOWS_WIDTH, WINDOWS_HEIGHT);
            if (food.isEat == 0)
            {
                FoodCoor();
            }
            FoodDraw();
            SnakeMove();
            FoodEat();
            SnakeBreak();
            Sleep(100 - speed*5);
        }
        SnakeChange();
    }
}

//初始化
void GameInit()
{


    initgraph(WINDOWS_WIDTH+200, WINDOWS_HEIGHT);
    rectangle(0,0,WINDOWS_WIDTH+1, WINDOWS_HEIGHT);

    //文本显示框
    setfillcolor(CYAN);
    fillrectangle(641,1,839,479);

    srand((unsigned)time(NULL));

//  setbkcolor(CYAN);
//  cleardevice();

    mciSendString(L"open 甩葱歌.mp3 alias backmusic", 0,0,0);
    mciSendString(L"play backmusic repeat", 0,0,0);

    //初始化蛇
    rectangle(0,0,SNAKE_SIZE, SNAKE_SIZE);

    snake.ch = down;
    snake.n = 2;
    snake.sCor[0].x = WINDOWS_WIDTH/2;
    snake.sCor[0].y = WINDOWS_HEIGHT/2 -10;
    snake.sCor[1].x = 0;
    snake.sCor[1].y = 0;

    food.isEat = 0;     //食物不存在了才能出现下一个食物
}

//移动
void SnakeMove()
{
    //不断交换相邻蛇节的坐标
    for (int i = snake.n-1; i>0; i--)
    {
        snake.sCor[i].x = snake.sCor[i-1].x;
        snake.sCor[i].y = snake.sCor[i-1].y;
    }


    switch (snake.ch)
    {
    case up:
        snake.sCor[0].y -= SNAKE_SIZE;
        break;
    case down:
        snake.sCor[0].y += SNAKE_SIZE;
        break;
    case left:
        snake.sCor[0].x -= SNAKE_SIZE;
        break;
    case right:
        snake.sCor[0].x += SNAKE_SIZE;
        break;
    default:
        break;
    }

    SnakeDraw();
}

//蛇的绘制
void SnakeDraw()
{
    for (int i =0; i < snake.n; i++)
    {
        rectangle(snake.sCor[i].x,snake.sCor[i].y, snake.sCor[i].x+SNAKE_SIZE, 
            snake.sCor[i].y+SNAKE_SIZE );
    }
}

//控制Snake
void SnakeChange()
{
    char more;

    more = getch();//接受键盘输入 不显示回文 直接完成 ; getchar()显示回文 enter键完成

    switch (more)
    {
    case up:
        if (snake.ch != down)
        {
            snake.ch = up;
        }

        break;
    case down:
        if (snake.ch != up)
        {
            snake.ch = down;
        }
        break;
    case left:
        if (snake.ch != right)
        {
            snake.ch = left;
        }
        break;
    case right:
        if (snake.ch != left)
        {
            snake.ch = right;
        }
        break;
    default:
        break;
    }
}

//绘制食物
void FoodDraw()
{
    roundrect(food.fCor.x,food.fCor.y,food.fCor.x+SNAKE_SIZE,food.fCor.y+SNAKE_SIZE,10,10);
}

//获取食物的坐标
void FoodCoor()
{
    food.fCor.x = rand()%(WINDOWS_WIDTH/SNAKE_SIZE)*10;
    food.fCor.y = rand()%(WINDOWS_HEIGHT/SNAKE_SIZE)*10;

    food.isEat = 1;
}

//吃食物事件
void FoodEat()
{
    if (snake.sCor[0].x == food.fCor.x && snake.sCor[0].y == food.fCor.y )
    {
        coumt ++;

        Score += Lever;

        Achievement(Score);
        snake.n++;
        food.isEat =0;
    }
}

//碰撞检测  判断蛇头与碰撞物的坐标是否重叠
void SnakeBreak()
{
    //撞墙
    if (snake.sCor[0].x < 0 || snake.sCor[0].x > 630||
        snake.sCor[0].y < 0 || snake.sCor[0].y > 470)
    {
        HWND hWnd = GetHWnd();
        if(MessageBox(hWnd, _T("GameOver! Do You Want To Try It Again?"),
            _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
        {
            Score = 0;
            Lever = 0;
            coumt=0;
            speed = 0;
            PlayGame();
        }
        else
        {
            exit(0);
        }
    }

    //撞自己
    for (int i = snake.n-1; i > 0; i--)
    {
        if (snake.sCor[0].x == snake.sCor[i].x && snake.sCor[0].y == snake.sCor[i].y)
        {
            HWND hWnd = GetHWnd();
            if(MessageBox(hWnd, _T("GameOver! Do You Want To Try It Again?"),
                _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
            {
                Score = 0;
                Lever = 0;
                coumt=0;
                speed = 0;
                PlayGame();
            }
            else
            {
                exit(0);
            }
        }
    }

}

void Achievement(int Score)
{


    setbkcolor(CYAN);
    settextstyle(20,0,L"黑体");

    swprintf_s(szScore, L"当前得分: %d", Score);
    outtextxy(WINDOWS_WIDTH+50, 100,szScore);

    if (coumt >= 10 -Lever)
    {
        Lever++;
        coumt = 0;
        speed+=2;
    }

    swprintf_s(szLever, L"当前等级: %d", Lever);
    outtextxy(WINDOWS_WIDTH+50, 60,szLever);

    swprintf_s(szSped, L"当前速度: %d", 10+speed*5);
    outtextxy(WINDOWS_WIDTH+50, 140,szSped);

    settextstyle(20,0, L"仿宋");
    //版本
    outtextxy(WINDOWS_WIDTH + 55, WINDOWS_HEIGHT-30, L"版本:V1.0");

}


**与君共勉!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值