C++贪吃蛇小游戏 C++实现简单贪吃蛇小游戏
纯粹. 人气:0想了解C++实现简单贪吃蛇小游戏的相关内容吗,纯粹.在本文为您仔细讲解C++贪吃蛇小游戏的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C++,贪吃蛇,下面大家一起来学习吧。
1 贪吃蛇游戏原理
1.1 构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置。
1.2 移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,去掉蛇的最后一节,确定蛇的方向
1.3 移动判断:每次移动时,判断蛇头是否触碰食物,如果碰到了食物,只进行前移蛇身和增加蛇头的操作,不进行擦除蛇尾的操作
2游戏设计
2.1 游戏首页
2.2 开始游戏
2.3 退出游戏
3.游戏实现
3.1 游戏首页
void fist_show() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); cout << " 贪吃蛇游戏 " << endl; cout << " " << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); cout << "*————————————*" << endl; cout << "* *" << endl; cout << "* *" << endl; cout << "* 1,游戏说明 *" << endl; cout << "* 2,开始游戏 *" << endl; cout << "* 3,结束游戏 *" << endl; cout << "* *" << endl; cout << "* *" << endl; cout << "*————————————*" << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); system("pause"); system("cls"); }
游戏说明介绍
void game_instruction() { color(5); cout << "*********游戏说明如下:***********" << endl; color(3); cout << "* *" << endl; cout << "* 使用↑.↓.←.→控制蛇的移动 *" << endl; cout << "* 不能咬到自己 *" << endl; cout << "* 不能撞到墙 *" << endl; cout << "* 按到空格键暂停游戏 *" << endl; color(5); cout << "**********************************" << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); system("pause"); system("cls"); }
3.2 游戏开始
// 食物的坐标 struct food{ int x; int y; }food1; //蛇的相关属性 struct snake { int speed;//蛇移动的速度 int len;//蛇的当前长度 int x[snake_length];//组成蛇身的每一个*中x的坐标 int y[snake_length];//组成蛇身的每一个*中y的坐标 }snake1;
将光标移动到控制台的(x,y)坐标点处
//将光标移动到控制台的(x,y)坐标点处 void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }
绘制地图
void creat_map() { //打印上下边框 for (int i = 0; i <= wide; i += 1) { //将光标移动依次到(i,0)处打印上边框 gotoxy(i, 0); cout<<"*"; gotoxy(i, hight); cout << "*"; } //打印左右边框 for (int i = 1; i < hight; i++) { //将光标移动依次到(0,i)处打印左边框 gotoxy(0, i); cout << "*"; gotoxy(wide, i); cout << "*"; } }
初始化蛇身和食物
void init() { //随机生成初始食物 food1.x = rand() % (wide - 2) + 2; food1.y = rand() % (hight - 2) + 1; gotoxy(food1.x, food1.y); cout<<"★"; //初始化蛇的属性 snake1.len = 4; snake1.speed = 200; //在屏幕中间生成蛇头 snake1.x[0] = wide / 2 + 2;//x坐标为偶数 snake1.y[0] = hight / 2; //打印蛇头 gotoxy(snake1.x[0], snake1.y[0]); cout<<"■"; //生成初试的蛇身 for (int i = 1; i < snake1.len; i++) { //蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+2 snake1.x[i] = snake1.x[i - 1] + 2; snake1.y[i] = snake1.y[i - 1]; gotoxy(snake1.x[i], snake1.y[i]); printf("■"); } }
让蛇移动
void snake_move() { int pre_key = key; key = _getch(); *changeFlag为0表明此时没有吃到食物,因此每走一步就要擦除掉蛇尾,以此营造一个移动的效果 *为1表明吃到了食物,就不需要擦除蛇尾,以此营造一个蛇身增长的效果 */ if (changeFlag == 0) { gotoxy(snake1.x[snake1.len - 1], snake1.y[snake1.len - 1]); cout<<" ";//在蛇尾处输出空格即擦去蛇尾 } //将蛇的每一节依次向前移动一节(蛇头除外) for (int i = snake1.len - 1; i > 0; i--) { snake1.x[i] = snake1.x[i - 1]; snake1.y[i] = snake1.y[i - 1]; } //蛇当前移动的方向不能和前一次的方向相反,比如蛇往左走的时候不能直接按右键往右走 //如果当前移动方向和前一次方向相反的话,把当前移动的方向改为前一次的方向 if (pre_key == 4 && key == 5) { key = 4; } if (pre_key == 5 && key == 4) { key = 5; } if (pre_key == 6 && key == 7) { key = 6; } if (pre_key == 7 && key == 6) { key = 7; } //判断蛇头应该往哪个方向移动 switch (key) { case 4: snake1.x[0] -= 2;//往左 break; case 5: snake1.x[0] += 2;//往右 break; case 6: snake1.y[0]--;//往上 break; case 7: snake1.y[0]++;//往下 break; } //打印出蛇头 gotoxy(snake1.x[0], snake1.y[0]); printf("■"); gotoxy(wide - 2, 0); //由于目前没有吃到食物,changFlag值为0 changeFlag = 0; return; }
创造食物
void createFood() { if (snake1.x[0] == food1.x && snake1.y[0] == food1.y)//蛇头碰到食物 { //蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物 while (1) { int flag = 1; food1.x = rand() % (wide - 4) + 2; food1.y = rand() % (hight - 2) + 1; //随机生成的食物不能在蛇的身体上 for (int i = 0; i < snake1.len; i++) { if (snake1.x[i] == food1.x && snake1.y[i] == food1.y) { flag = 0; break; } } } //绘制食物 gotoxy(food1.x, food1.y); printf("★"); snake1.len++;//吃到食物,蛇身长度加1 sorce += 10;//每个食物得10分 snake1.speed -= 5;//随着吃的食物越来越多,速度会越来越快 changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果 } return; }
判断蛇的规则
//判断蛇运动是否符合规则 bool snakeStatus() { //蛇头碰到上下边界,游戏结束 if (snake1.y[0] == 0 || snake1.y[0] == hight) return false; //蛇头碰到左右边界,游戏结束 if (snake1.x[0] == 0 || snake1.x[0] == wide) return false; //蛇头碰到蛇身,游戏结束 for (int i = 1; i < snake1.len; i++) { if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0]) return false; } return true; }
加载全部内容