C++实现贪吃蛇游戏的详细步骤及实战演示
16lz
2021-01-22
学习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 << " ";}elseprint_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/105561if (_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语言规定在一个源程序中main函数的位置是哪里?
- 主函数在程序中的位置在哪
- C语言中main函数的位置可以是任意的么
- C语言中main函数可以在什么位置
- c语言规定在一个源程序中main函数的位置是什么?
- c源程序中main函数的位置是什么?
- 利用深度学习识别滑动验证码缺口位置
- Linux下查看PHP配置文件php.ini的位置
- php中如何在数组指定位置插入数据单元