概述
本人对游戏比较感兴趣,这次亲手做一款经典小游戏:贪吃蛇。
代码如下: (比较重点或者关键的点已经在代码中做好注释)
#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++贪吃蛇小游戏所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复