小编给大家分享一下C++如何实现贪吃蛇游戏,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<conio.h>
#include<windows.h>
using namespace std;
/*光标定位*/
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
void locate(int x, int y)
{
coord.X = y;
coord.Y = x;
SetConsoleCursorPosition(hout,coord);
};
/*光标隐藏*/
void hide()
{
CONSOLE_CURSOR_INFO cursor_info = {1,0}; //bVisible=0;隐藏光标
SetConsoleCursorInfo(hout, &cursor_info);//获取光标状态
}
/*生成随机数*/
double random(double start, double end)
{
return start + (end - start)*rand()/(RAND_MAX+1.0);//生成一个数,大于等于start,小于end;
}
/*定义地图的长和宽*/
int m, n;
/*定义蛇 的长度,坐标,方向,食物的位置*/
struct node
{
int x, y;
}snake[1000];//蛇的坐标
int snake_length, dir;//蛇的长度,方向
node food;
int direct[4][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} };//食物的位置
/*输出围墙:一个矩形框*/
void print_wall()
{
//输出第一行 “----------”
cout << " ";
for (int i = 1; i <= n; i++)
{
cout << "-";
}
cout << endl;
//输出第一列“|”,中间输入空格,最后一列输出“|”
for (int j = 0; j <= m-1; j++)
{
cout << "|";
for (int i = 1; i <= n; i++)
cout << " ";
cout << "|" << endl;
}
cout << " ";
//输出最后一行“----------”
for (int i = 1; i <= n; i++)
cout << "-";
}
/*首次输出蛇,其中snake[0]代表头部*/
//蛇的外型:“@*****”
void print_snake()
{
locate(snake[0].x,snake[0].y);
cout << "@";
for (int i = 1; i < snake_length - 1; i++)
{
locate(snake[i].x, snake[i].y);
cout << "*";
}
}
/*判断是否撞墙或者头部是否碰到身体的任意一个部位,碰到则游戏失败*/
bool is_correct()
{
if (snake[0].x == 0 || snake[0].y == 0 || snake[0].x == m + 1 || snake[0].y == n + 1) return false;//头部碰到边缘
for (int i = 1; i <= snake_length - 1; i++)
if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)return false;//头部碰到身体的任意一个部位
return true;
}
/*随机生成食物的位置*/
bool print_food()
{
srand((unsigned)time(0));//随机种子
bool e;
while (1)
{
e = true;
int i = (int)random(0,m)+1;
int j = (int)random(0,n)+1;
food.x = i; food.y = j;//食物的位置随机
for (int k = 0; k <= snake_length - 1; k++) //食物不能出现在蛇的身体的任意位置处
{
if (snake[k].x == food.x && snake[k].y == food.y)
{
e= false;
break;
}
}
if (e)break;
}
//在食物的位置处标记,食物符号为“$”;
locate(food.x,food.y);
cout << "$";
return true;
}
/*蛇的前进*/
bool go_ahead()
{
node tmp;
bool e = false;
tmp = snake[snake_length-1];//蛇尾
for (int i = snake_length - 1; i >= 1;i--)
{
snake[i] = snake[i - 1];//后移一位
}
snake[0].x += direct[dir][0];
snake[0].y += direct[dir][1];
locate(snake[1].x, snake[1].y);//定位到头部的后一位
cout << "*";
/*吃到食物*/
if (snake[0].x == food.x&&snake[0].y == food.y)
{
snake_length++;
e = true;
snake[snake_length - 1] = tmp;
}
/*输出此时蛇状态*/
if (!e)
{
locate(tmp.x, tmp.y);
cout << " ";
}
else
print_food();
locate(snake[0].x, snake[0].y);
cout << "@";
/*** 如果自撞 ***/
if (!is_correct())
{
system("cls");
cout << "You lose!" << endl << "Length: " << snake_length << endl;
return false;
}
return true;
}
int main()
{
//游戏提示:
cout << "--------------------贪吃蛇---------------------" << endl;
cout << "请先输入两个数,表示地图大小.要求长宽均不小于10." << endl;
cout << "请注意窗口大小,以免发生错位.建议将窗口调为最大." << endl;
cout << "再选择难度.请在1-10中输入1个数,1最简单,10则最难" << endl;
cout << "然后进入游戏画面,以方向键控制方向.祝你游戏愉快!" << endl;
cout << "-----------------------------------------------" << endl;
cin >> m >> n;
if (m < 10 || n < 10 || m>25 || n>40)
{
cout << "ERROR" << endl;
system("pause");
return 0;
}
//输入难度系数:1-10;
int hard;
cin >> hard;
if (hard <= 0 || hard > 100)
{
cout << "ERROR" << endl;
system("pause");
return 0;
}
//数据初始化:蛇的位置,长度,方向
snake_length = 5;//长度
clock_t a, b;
char ch;
double hard_len;
for (int i = 0; i <= 4; i++)//位置
{
snake[i].x = 1;
snake[i].y = 5 - i;
}
dir = 3;//方向
//输出原始地图、食物和蛇
system("cls");
hide();
print_wall();
print_food();
print_snake();
//在(0,m+2)出显示长度:
locate(m + 2, 0);
cout << "Now Length:";
//开始游戏
while (1)
{ /*难度随长度的增加而提高*/
hard_len = (double)snake_length / (double)(m*n);
/*调节时间,单位是ms*/
a = clock();
while (1)
{
b = clock();
if (b - a >= (int)(400 - 30 * hard)*(1 - sqrt(hard_len)))break;
}
//接收键盘输入的方向
//https://blog.csdn.net/wenweimin/article/details/105561
if (_kbhit())
{
ch = _getch();
if (ch == -32)
{
ch = _getch();
switch (ch)
{
case 72:if (dir == 2 || dir == 3)dir = 0; break;
case 80:if (dir == 2 || dir == 3)dir = 1; break;
case 75:if (dir == 0 || dir == 1)dir = 2; break;
case 77:if (dir == 0 || dir == 1)dir = 3; break;
}
}
}
//前进
if (!go_ahead())break;
//输出此时的长度
locate(m + 2, 12);
cout << snake_length;
}
system("pause");
return 0;
}
看完了这篇文章,相信你对C++如何实现贪吃蛇游戏有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。