我是靠谱客的博主 单薄铅笔,最近开发中收集的这篇文章主要介绍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.等等等等。

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

 

最后

以上就是单薄铅笔为你收集整理的C++贪吃蛇小游戏的全部内容,希望文章能够帮你解决C++贪吃蛇小游戏所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部