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");
}
**与君共勉!**