C++贪吃蛇小游戏

本人对游戏比较感兴趣,这次亲手做一款经典小游戏:贪吃蛇。

代码如下:  (比较重点或者关键的点已经在代码中做好注释)

#include<graphics.h>        //窗口头文件
#include<conio.h>           //获取键盘按键相关操作
#include<iostream>
#include<stdlib.h>          //设置种子所需要的头文件

#define Snake_Max 500       //蛇的最大长度
#define Width     700       //窗口长度
#define Height    600       //窗口高
using namespace std;


struct Snake {
	int size;
	int dir;
	int speed;
	POINT coor[Snake_Max];          //POINT保存的是点的坐标(一个结点有x、y坐标)、创建500个结点
}snake;

struct Food {                       //食物结构体
	int x;
	int y;
	int r;
	bool flag;
	DWORD color;                    //DWORD 表示 unsigned long
}food;

enum DIR {
	UP,DOWN,LEFT,RIGHT,                  //上下左右
};

//游戏数据初始化
void GameInit() {
	srand(time(NULL)); 
	initgraph(Width, Height);                           //创建窗口
	snake.size = 5;
	snake.dir = RIGHT;
	snake.speed = 2;
	for ( int i = snake .size-1; i >= 0; i--) {
		snake.coor[i].x = 100-10*i;
		snake.coor[i].y = 100;
	}
	food.x = rand() % Width;                               //食物初始化
	food.y = rand() % Height;
	srand(time(NULL));
	food.color = RGB(rand()%255, rand()%255, rand()%255);
	food.flag = true;
	food.r =8;
}

//游戏绘制
void GameDraw() {
	BeginBatchDraw();                              //双缓冲绘图 (批量绘图)
	setbkcolor(RGB(215, 186, 48));                  //设置背景颜色 
	cleardevice();                                 //“生成背景颜色”
	setfillcolor(BLUE);                            //设置蛇的颜色
	for (int i = 0; i < snake.size; i++) {
		solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
	}
	setfillcolor(food.color);                      //食物的颜色随机生成
	if (food.flag) {                                
		solidcircle(food.x, food.y, food.r);
	}
	EndBatchDraw();
}

//移动蛇               蛇的坐标发生改变
void SnakeMove() {
	for (int i = snake.size - 1; i > 0; i--) {
		snake.coor[i] = snake.coor[i - 1];
	}
	switch (snake.dir) {
	case UP:
		snake.coor[0].y -= snake.speed; 
		if (snake.coor[0].y == 0) snake.coor[0].y += Height;
		break;
	case DOWN:
		snake.coor[0].y+= snake.speed;
		if (snake.coor[0].y == Height) snake.coor[0].y -= Height;
		break;
	case LEFT:
		snake.coor[0].x-= snake.speed;
		if (snake.coor[0].x == 0) snake.coor[0].x += Width;
		break;
	case RIGHT:
		snake.coor[0].x+= snake.speed;
		if (snake.coor[0].x == Width) snake.coor[0].x -= Width;
		break;
	}
}

//通过按键改变蛇的移动方向    
void keyControl() {
	if (_kbhit()) {                     //判断有没有按键,有就返回真值1
		switch (_getch())
		{
		case 72:
		case 'w':
		case 'W':
			if(snake.dir != DOWN)snake.dir = UP; break;
		case 80:
		case 's':
		case 'S':
			if (snake.dir != UP)snake.dir = DOWN; break;
		case 75:
		case 'a':
		case 'A':
			if (snake.dir != RIGHT)snake.dir = LEFT; break;
		case 77:
		case 'd':
		case 'D':
			if (snake.dir != LEFT)snake.dir = RIGHT; break;
		case ' ':
			while (1) {
				if (_getch() == ' ') return;
			}
		default:
			break;
		}
	}
}

//吃食物
void EatFood() {
	if (snake.coor[0].x >= food.x-food.r && snake.coor[0].x <= food.x + food.r
		&& snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r
		&&food.flag) {
		food.flag = 0; snake.size++;
	}
	if (!food.flag) {
		food.x = rand() % Width;                               //食物初始化
		food.y = rand() % Height;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
		food.flag = true;
		food.r = 8;
	}
}

int main() {
	GameInit();
	while (1) {                       //保留窗口
		GameDraw();
		SnakeMove();
		keyControl();                 //控制蛇头方向
		Sleep(10);                    //延迟20毫秒
		EatFood();
		//Stop();
	};                                  
	return 0;
}

效果图如下所示:

自认为的不足之处:

  1.游戏总体而言做的比较单调,包括背景、边界、食物大小和颜色、蛇的形态等等,这些都可以进行改进。

  2.地图太大。所设计的穿越边界也不符合游戏规则,减小了游戏难度。

  3.没有添加音效。改进的话可以从添加背景音乐、吃食物之后有奖励音效入手。

  4.蛇是永生的,就算是撞到自己也安然无恙。

  5.等等等等。

制作本游戏仅仅是个人爱好,不喜勿喷啦~~~发现不足的地方也可以一起交流~

 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值