先奉上完整的项目源码:http://pan.baidu.com/s/1slxvMWl
用的是easy x 图形库,没有的话可以去官网下载最新 版本,用vs2015选择win32控制台应用程序->空项目就可以了。
开始界面有游戏界面都是 640x480大小。效果如下:
鼠标移动到英文上,字母的颜色会发生改变,单击就可以进入,同时有背景音乐播放。
代码:
void StartWindow() {
mciSendString(L"open ./风动草.mp3 alias bgm",0,0,0);
mciSendString(L"play bgm repeat", 0, 0, 0);
loadimage(&backImg, L"./image/1.jpg", 640, 480); //将图片加载到backImg
loadimage(&gbkImg, L"./image/bk.jpg", 640, 480);
loadimage(&foodImg,L"./image/apple.jpg",10,10);
loadimage(&about, L"./image/about.jpg", 640, 480);
loadimage(&lose, L"./image/lose.jpg", 640, 480);
loadimage(&food2, L"./image/food2.jpg", 10, 10);
putimage(0, 0, &backImg);
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
while (1) {
msg = GetMouseMsg();
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 205, L"Start");
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 305, L"About");
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 405, L"End");
}
else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(450, 205, L"Start");
outtextxy(450, 305, L"About");
outtextxy(450, 405, L"End");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) {
return;
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) {
exit(0);
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) {
AboutWindow();
StartWindow();
body();
}
break;
}
}
}
About是游戏说明,里面有关于游戏的介绍和操作说明,点击back就可以返回到开始界面。效果如下:
代码:
void AboutWindow() {
cleardevice();
putimage(0, 0, &about);
while (1) {
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
msg = GetMouseMsg();
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 425, L"Back");
}
else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(450, 425, L"Back");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) {
return;
}
break;
}
}
}
单击start进入游戏,效果如下:
代码:
typedef struct coor //蛇的坐标
{
int x;
int y;
}Coor;
typedef struct snake {
Coor sCoor[MAXSIZE]; //蛇每一节的坐标
int n; //蛇的当前节数
int ch; //蛇的方向
}SNAKE;
struct Food {
Coor foodc; //坐标
int flag; //状态 有没有被吃
int type; //两种类型 一个苹果,一个虫子
}food;
SNAKE snake;
IMAGE backImg;
IMAGE gbkImg;
IMAGE foodImg;
IMAGE about;
IMAGE lose;
IMAGE food2;
void GameInit() {
srand((unsigned int)time(NULL)); //随机数种子
putimage(0, 0, &gbkImg);
setlinecolor(RED);
setfillcolor(YELLOW);
fillrectangle(0, 0, 10, 10);
//初始化数据
snake.sCoor[0].x = 0;
snake.sCoor[0].y = 0;
snake.n = 1;
snake.ch = 77; //上72 下 80 左 75 右77
food.flag = 0;
food.type = 0;
}
void move() {
for (int i = snake.n - 1; i > 0; i--) {
snake.sCoor[i].x = snake.sCoor[i - 1].x;
snake.sCoor[i].y = snake.sCoor[i - 1].y;
}
switch(snake.ch) {
case 72:
snake.sCoor[0].y -= 10;
break;
case 80:
snake.sCoor[0].y += 10;
break;
case 75:
snake.sCoor[0].x -= 10;
break;
case 77:
snake.sCoor[0].x += 10;
break;
}
setfillcolor(YELLOW);
for (int i = snake.n - 1; i >= 0; i--) {
fillrectangle(snake.sCoor[i].x, snake.sCoor[i].y, snake.sCoor[i].x + 10, snake.sCoor[i].y + 10);
}
}
void changeDirection() {
int movech;//方向 有键盘输入
movech = getch();
switch (movech) {
case 72:
if(snake.ch!=80)
snake.ch = 72;
break;
case 80:
if (snake.ch != 72)
snake.ch = 80;
break;
case 75:
if (snake.ch != 77)
snake.ch = 75;
break;
case 77:
if (snake.ch != 75)
snake.ch = 77;
break;
}
}
void foodCoor() { //食物的坐标
food.foodc.x = rand() % 64 * 10;
food.foodc.y = rand() % 48 * 10;
food.flag = 1;
food.type = rand() % 10 < 1 ? 1 : 0;
}
void drawfood() {
if (food.type==1) {
putimage(food.foodc.x, food.foodc.y, &food2);
}
else {
putimage(food.foodc.x, food.foodc.y, &foodImg);
}
}
void eatfood() {
if (snake.sCoor[0].x == food.foodc.x && snake.sCoor[0].y == food.foodc.y) {
if (food.type == 1) {
snake.n += 2;
}
else {
snake.n++;
}
food.flag = 0;
}
}
void killsnake() {
//撞墙
if (snake.sCoor[0].x < 0 || snake.sCoor[0].x>640 || snake.sCoor[0].y < 0 || snake.sCoor[0].y>480) {
gameLose();
}
else{ //撞自己
for (int i = snake.n - 1; i > 0; i--) {
if (snake.sCoor[i].x == snake.sCoor[0].x && snake.sCoor[i].y == snake.sCoor[0].y) {
gameLose();
}
}
}
}
void body() {
GameInit();
while (1) {
while (!kbhit()) {
putimage(0, 0, &gbkImg);
move();
if (food.flag == 0) {
foodCoor();
}
drawfood();
eatfood();
killsnake();
Sleep(100);
cleardevice();
}
changeDirection();
}
}
void main() {
initgraph(WINDOW_WIDTH,WINDOW_HEIGHT); //初始化窗口
StartWindow();
body();
getchar();
closegraph();
}
失败界面如下:
代码:
void gameLose() {
cleardevice();
putimage(0, 0, &lose);
while (1) {
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
msg = GetMouseMsg();
if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(420, 305, L"Back");
}
else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(200, 305, L"again");
}else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(420, 305, L"Back");
outtextxy(200, 305, L"again");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) {
cleardevice();
StartWindow();
body();
}else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) {
body();
}
break;
}
}
}
完整的代码:
#include<iostream>
#include<graphics.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#include<mmsystem.h> //多媒体设备接口 音视频
#pragma comment(lib,"winmm.lib")
#define WINDOW_WIDTH 640 //窗口宽度
#define WINDOW_HEIGHT 480 //窗口高度
#define MAXSIZE 1000 //蛇的最大节数
using namespace std;
typedef struct coor //蛇的坐标
{
int x;
int y;
}Coor;
typedef struct snake {
Coor sCoor[MAXSIZE]; //蛇每一节的坐标
int n; //蛇的当前节数
int ch; //蛇的方向
}SNAKE;
struct Food {
Coor foodc; //坐标
int flag; //状态 有没有被吃
int type; //两种类型 一个苹果,一个虫子
}food;
SNAKE snake;
IMAGE backImg;
IMAGE gbkImg;
IMAGE foodImg;
IMAGE about;
IMAGE lose;
IMAGE food2;
void StartWindow(); //开始界面
void GameInit(); //游戏初始化
void move(); //蛇移动
void changeDirection(); //改变方向
void foodCoor(); //食物的坐标
void drawfood(); //画食物
void eatfood(); //吃食物
void AboutWindow(); //说明界面
void gameLose(); //失败界面
void killsnake(); //判断蛇死亡
void body(); //主体函数
void main() {
initgraph(WINDOW_WIDTH,WINDOW_HEIGHT); //初始化窗口
StartWindow();
body();
getchar();
closegraph();
}
void StartWindow() {
mciSendString(L"open ./风动草.mp3 alias bgm",0,0,0);
mciSendString(L"play bgm repeat", 0, 0, 0);
loadimage(&backImg, L"./image/1.jpg", 640, 480); //将图片加载到backImg
loadimage(&gbkImg, L"./image/bk.jpg", 640, 480);
loadimage(&foodImg,L"./image/apple.jpg",10,10);
loadimage(&about, L"./image/about.jpg", 640, 480);
loadimage(&lose, L"./image/lose.jpg", 640, 480);
loadimage(&food2, L"./image/food2.jpg", 10, 10);
putimage(0, 0, &backImg);
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
while (1) {
msg = GetMouseMsg();
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 205, L"Start");
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 305, L"About");
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 405, L"End");
}
else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(450, 205, L"Start");
outtextxy(450, 305, L"About");
outtextxy(450, 405, L"End");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) {
return;
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) {
exit(0);
}
else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) {
AboutWindow();
StartWindow();
body();
}
break;
}
}
}
void GameInit() {
srand((unsigned int)time(NULL)); //随机数种子
putimage(0, 0, &gbkImg);
setlinecolor(RED);
setfillcolor(YELLOW);
fillrectangle(0, 0, 10, 10);
//初始化数据
snake.sCoor[0].x = 0;
snake.sCoor[0].y = 0;
snake.n = 1;
snake.ch = 77; //上72 下 80 左 75 右77
food.flag = 0;
food.type = 0;
}
void move() {
for (int i = snake.n - 1; i > 0; i--) {
snake.sCoor[i].x = snake.sCoor[i - 1].x;
snake.sCoor[i].y = snake.sCoor[i - 1].y;
}
switch(snake.ch) {
case 72:
snake.sCoor[0].y -= 10;
break;
case 80:
snake.sCoor[0].y += 10;
break;
case 75:
snake.sCoor[0].x -= 10;
break;
case 77:
snake.sCoor[0].x += 10;
break;
}
setfillcolor(YELLOW);
for (int i = snake.n - 1; i >= 0; i--) {
fillrectangle(snake.sCoor[i].x, snake.sCoor[i].y, snake.sCoor[i].x + 10, snake.sCoor[i].y + 10);
}
}
void changeDirection() {
int movech;//方向 有键盘输入
movech = getch();
switch (movech) {
case 72:
if(snake.ch!=80)
snake.ch = 72;
break;
case 80:
if (snake.ch != 72)
snake.ch = 80;
break;
case 75:
if (snake.ch != 77)
snake.ch = 75;
break;
case 77:
if (snake.ch != 75)
snake.ch = 77;
break;
}
}
void foodCoor() { //食物的坐标
food.foodc.x = rand() % 64 * 10;
food.foodc.y = rand() % 48 * 10;
food.flag = 1;
food.type = rand() % 10 < 1 ? 1 : 0;
}
void drawfood() {
if (food.type==1) {
putimage(food.foodc.x, food.foodc.y, &food2);
}
else {
putimage(food.foodc.x, food.foodc.y, &foodImg);
}
}
void eatfood() {
if (snake.sCoor[0].x == food.foodc.x && snake.sCoor[0].y == food.foodc.y) {
if (food.type == 1) {
snake.n += 2;
}
else {
snake.n++;
}
food.flag = 0;
}
}
void killsnake() {
//撞墙
if (snake.sCoor[0].x < 0 || snake.sCoor[0].x>640 || snake.sCoor[0].y < 0 || snake.sCoor[0].y>480) {
gameLose();
}
else{ //撞自己
for (int i = snake.n - 1; i > 0; i--) {
if (snake.sCoor[i].x == snake.sCoor[0].x && snake.sCoor[i].y == snake.sCoor[0].y) {
gameLose();
}
}
}
}
void AboutWindow() {
cleardevice();
putimage(0, 0, &about);
while (1) {
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
msg = GetMouseMsg();
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(450, 425, L"Back");
}
else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(450, 425, L"Back");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) {
return;
}
break;
}
}
}
void gameLose() {
cleardevice();
putimage(0, 0, &lose);
while (1) {
MOUSEMSG msg = { 0 };
setbkmode(TRANSPARENT); //设置背景风格 透明
settextstyle(40, 18, L"Ravie");//设置字体风格
msg = GetMouseMsg();
if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(420, 305, L"Back");
}
else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) {
settextcolor(RGB(255, 0, 0));//设置字体颜色
outtextxy(200, 305, L"again");
}else {
settextcolor(RGB(137, 57, 196));//设置字体颜色
outtextxy(420, 305, L"Back");
outtextxy(200, 305, L"again");
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) {
cleardevice();
StartWindow();
body();
}else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) {
body();
}
break;
}
}
}
void body() {
GameInit();
while (1) {
while (!kbhit()) {
putimage(0, 0, &gbkImg);
move();
if (food.flag == 0) {
foodCoor();
}
drawfood();
eatfood();
killsnake();
Sleep(100);
cleardevice();
}
changeDirection();
}
}