概述
学习C++过程中做的一个小程序,比较简单,只实现了贪吃蛇小游戏最基本的功能。上传代码作为学习的记录,同时也为其他同学提供作为一个小小的参考。实现环境为:Microsoft visual C++6.0集成开发环境 。
#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;
}
登录后复制
相关推荐:
H5的canvas实现贪吃蛇小游戏
js贪吃蛇游戏实现思路和源码_javascript技巧
Java游戏项目:拼图游戏的开发视频教程
以上就是C++实现贪吃蛇游戏的详细步骤及实战演示的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是独特帆布鞋为你收集整理的C++实现贪吃蛇游戏的详细步骤及实战演示的全部内容,希望文章能够帮你解决C++实现贪吃蛇游戏的详细步骤及实战演示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复