C++实现简单贪吃蛇小游戏攻略
介绍
本文将介绍如何使用C++语言实现简单的贪吃蛇小游戏,涉及到的知识点包括:C++基础语法、控制台输出、控制台输入、随机数生成、数组、结构体等。
实现过程
基本思路
贪吃蛇游戏的基本思路包括:
1. 画出游戏主界面。
2. 初始化贪吃蛇。
3. 食物随机生成。
4. 根据用户控制移动贪吃蛇。
5. 判断贪吃蛇是否碰到边界,或者身体。
6. 更新贪吃蛇的长度和位置。
7. 得分计算。
实现步骤
1. 引入所需的库文件
#include <iostream>
#include <Windows.h> //兼容Windows系统。
#include <time.h> //时间函数。
using namespace std;
2. 定义全局变量
const int MAP_WIDTH = 25;
const int MAP_HEIGHT = 25;
const int MAX_LENGTH = 100;
const int FOOD_SCORE = 10;
int map[MAP_HEIGHT][MAP_WIDTH];
int key = 0;
bool gameOver = false;
int score = 0;
3. 实现控制台输出函数
C++中控制台输出可以使用printf函数和cout语句,我们选用cout语句实现控制台输出。
定义一个函数,参数为需要输出的内容,使用cout语句打印输出。
void showInfo(string info){
cout << info << endl;
}
4. 实现控制台输入函数
定义一个函数,返回用户输入的值。
int getInput(){
return _getch();
}
5. 实现初始化地图函数
- 将map清空为0。
- 在map的边界上,将格子设置为1,表示地图的边界。
void initMap(){
//将map清空为0。
memset(map,0,sizeof(map));
//在map的边界上,将格子设置为1,表示地图的边界。
for(int i = 0 ; i < MAP_WIDTH ; i++){
map[0][i] = 1;
map[MAP_HEIGHT-1][i] = 1;
}
for(int i = 1 ; i < MAP_HEIGHT-1 ; i++){
map[i][0] = 1;
map[i][MAP_WIDTH-1] = 1;
}
}
6. 定义结构体
定义结构体存储贪吃蛇的各个节点的坐标信息。
//定义结构体存储贪吃蛇的各个节点的坐标信息。
struct Snake{
int x, y;
};
Snake snake[MAX_LENGTH];
7. 定义初始化贪吃蛇函数
初始化贪吃蛇有三节,分别在地图的中心。
void initSnake(){
int centerX = MAP_WIDTH/2;
int centerY = MAP_HEIGHT/2;
for(int i = 0 ; i < 3 ; i++){
snake[i].x = centerX-i;
snake[i].y = centerY;
}
}
8. 定义生成食物函数
在地图上随机生成一个食物。
void creatFood(){
//用当前时间的毫秒数作为随机数种子,保证每次程序运行都不同。
srand(int(time(0)));
int x = rand()% (MAP_WIDTH-2) + 1;
int y = rand()% (MAP_HEIGHT-2) + 1;
while(map[y][x] != 0){
x = rand()% (MAP_WIDTH-2) + 1;
y = rand()% (MAP_HEIGHT-2) + 1;
}
map[y][x] = FOOD_SCORE + 1;
}
9. 定义画出地图函数
遍历地图的每个格子,根据不同的值输出相应的字符。
void showMap(){
for(int i = 0 ; i < MAP_HEIGHT ; i++){
for(int j = 0 ; j < MAP_WIDTH ; j++){
if(map[i][j] == 1){
cout << "#";
}
else if(map[i][j] > 1){
cout << "*";
}
else{
cout << " ";
}
}
cout << endl;
}
}
10. 定义移动贪吃蛇函数
- 左移动,x坐标减1。
- 右移动,x坐标加1。
- 上移动,y坐标减1。
- 下移动,y坐标加1。
void moveSnake(int curX, int curY){
for(int i = score ; i > 0 ; i--){
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
snake[0].x = curX;
snake[0].y = curY;
}
11. 定义判断贪吃蛇是否获胜,更新长度和位置的函数
如果当前位置是食物,则更新贪吃蛇的长度和位置,同时计算得分。
void updateGame(){
int curX = snake[0].x;
int curY = snake[0].y;
if(map[curY][curX] > FOOD_SCORE){
score += FOOD_SCORE;
creatFood();
}
if(score == (MAP_WIDTH-2)*(MAP_HEIGHT-2)){
showInfo("You Win!");
gameOver = true;
}
moveSnake(curX, curY);
for(int i = 1 ; i < score ; i++){
if(snake[i].x == curX && snake[i].y == curY){
showInfo("You Lose!");
gameOver = true;
break;
}
}
}
12. 游戏循环
控制台游戏的核心是while循环,不断的读取用户的输入,更新游戏状态,画出游戏界面。
void gameLoop(){
while(!gameOver){
system("cls"); //清空屏幕。
//显示地图和得分。
showMap();
cout << "Score: " << score << endl;
//获得用户输入的值。
key = getInput();
int curX = snake[0].x;
int curY = snake[0].y;
//判断按键并移动贪吃蛇。
switch(key){
case 'w': //上移
moveSnake(curX, curY-1);
break;
case 's': //下移
moveSnake(curX, curY+1);
break;
case 'a': //左移
moveSnake(curX-1, curY);
break;
case 'd': //右移
moveSnake(curX+1, curY);
break;
case 'q': //退出游戏
gameOver = true;
break;
}
updateGame();
}
}
13. 游戏结束
清空屏幕,画出最终的得分。
void gameOverFunc(){
system("cls");
cout << "Game Over! Your score is: " << score << endl;
}
14. 启动游戏
定义一个启动游戏的函数,将所有函数调用整合起来。
void startGame(){
showInfo("Snake Game Started!");
initMap();
initSnake();
creatFood();
gameLoop();
gameOverFunc();
}
使用main函数启动游戏。
int main(){
startGame();
return 0;
}
示例说明
示例1:初始化地图
初始化一个10*10的地图,边界为1,空白为0。实现代码如下:
const int MAP_WIDTH = 10;
const int MAP_HEIGHT = 10;
int map[MAP_HEIGHT][MAP_WIDTH];
void initMap(){
//将map清空为0。
memset(map,0,sizeof(map));
//在map的边界上,将格子设置为1,表示地图的边界。
for(int i = 0 ; i < MAP_WIDTH ; i++){
map[0][i] = 1;
map[MAP_HEIGHT-1][i] = 1;
}
for(int i = 1 ; i < MAP_HEIGHT-1 ; i++){
map[i][0] = 1;
map[i][MAP_WIDTH-1] = 1;
}
}
示例2:控制台输出
使用cout语句实现控制台输出一个字符串。实现代码如下:
void showInfo(string info){
cout << info << endl;
}
调用方式:
showInfo("Snake Game Started!");
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现简单贪吃蛇小游戏 - Python技术站