C++小游戏之贪吃蛇

先奉上完整的项目源码: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();
	}
}





  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++小游戏贪吃蛇源代码》是一个经典的计算机科学项目,用于初学者熟悉面向对象编程和游戏编程的基本概念。这里简单介绍一下基本框架: 1. 定义主要类:首先创建`Snake`, `Food`和`Board`等类。`Snake`类通常包含位置、长度、移动方向等属性,以及更新位置的方法;`Food`代表食物随机生成的位置;`Board`则表示游戏区域,记录边界和蛇和食物的位置。 ```cpp class Snake { public: // 构造函数,初始化蛇的初始状态 Snake(); void move(); // 其他方法... private: int x, y; // 蛇的位置 int length; // 蛇的长度 // 点向量表示蛇的身体 }; ``` 2. 更新机制:`move()`方法根据用户输入或游戏规则(如默认向右移动)改变蛇的位置,并处理边界检查和碰撞检测(例如,蛇头碰到墙或自己的身体)。 3. 游戏循环:游戏的主要循环中会不断地绘制当前游戏状态(蛇和食物),获取用户的输入,然后调用蛇的移动方法。 ```cpp void gameLoop() { while (true) { drawBoard(); // 绘制游戏画面 handleInput(); // 处理用户输入 snake.move(); // 移动蛇 if (checkCollision()) { // 检查碰撞并结束游戏 break; } } } ``` 4. 食物生成和消耗:每次蛇吃掉食物后,增加长度并在地图上生成新的食物。当蛇吃掉食物时,它的位置应更新为新食物的位置。 完整源代码通常包括各种辅助函数,如键盘事件处理、画图函数、碰撞检测等。由于篇幅原因,这里无法展示整个源代码,但以上就是大致的设计结构。如果你对具体某个部分感兴趣,或者想学习更多细节,你可以查阅在线教程、书籍或GitHub上的开源项目作为参考。如果你想要深入研究,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值