C++中练习贪吃蛇
Posted 爱吃香蕉的猴子0000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中练习贪吃蛇相关的知识,希望对你有一定的参考价值。
Hello, 大家好,我是爱吃香蕉的猴子, 练习一下贪吃蛇的例子
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
#include"Snake.h"
/*
*code的思路
1、定义蛇的结构体
2、初始化蛇和食物
3、场景
蛇和墙的碰撞
蛇和自身碰撞
蛇和食物碰撞
重新随机食物
蛇身体增长
分数增长
方向键控制
4、游戏结束
*/
//初始化食物
//rand() 产生随机数
void InitFood()
{
food[0] = rand() % WIDE;//随机产生食物的宽
food[1] = rand() % HIGH;//随机产生食物的高
}
//初始化蛇
void InitSnake()
{
snake.size = 3;//初始的长度头部+尾巴
snake.body[0].X = WIDE / 2;//头部的坐标
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDE / 2 -1;//尾巴的坐标
snake.body[1].Y = HIGH / 2;
}
void ShowUI()
{
COORD coord;//C++改变光标位置的函数
//更新末尾空格
coord.X = lx;
coord.Y = ly;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
//显示蛇的位置
for (int i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i == 0)
putchar('@');//头
else
putchar('*');//尾巴
}
//显示食物位置
coord.X = food[0];
coord.Y = food[1];
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
//键盘控制
void PlayGame()
{
char key = 'D';
while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)
{
//显示界面
ShowUI();
//方向控制
while (_kbhit())
{
key = _getch();
}
switch (key)
{
case 'D':case 'd': dx = 1; dy = 0; break;
case 'A':case 'a': dx = -1; dy = 0; break;
case 'W':case 'w': dx = 0; dy = -1; break;
case 'S':case 's': dx = 0; dy = 1; break;
}
//是否和自身碰撞
for (int i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
{
return;
}
}
//蛇和食物的碰撞
//蛇的坐标和食物的坐标相等
if (snake.body[0].X == food[0] && snake.body[0].Y == food[1])
{
//随机新食物
InitFood();
//蛇身体增长
snake.size++;
//分数增长
score += 10;
//关卡 速度 障碍物
}
//蛇更新坐标
lx = snake.body[snake.size - 1].X;
ly = snake.body[snake.size - 1].Y;
for (int i = snake.size - 1; i > 0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
//更新蛇头
snake.body[0].X += dx;
snake.body[0].Y += dy;
Sleep(100);
//system("cls");
}
}
void InitWall()
{
for (int i = 0; i <= HIGH; i++)
{
for (int j = 0; j <= WIDE; j++)
{
if (i == HIGH)
putchar('=');
else if (j == WIDE)
putchar('=');
else
putchar(' ');
}
putchar('\\n');
}
}
int main()
{
srand((size_t)time(NULL));
//去掉控制台光标
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
InitWall();
InitFood();
InitSnake();
//ShowUI();
PlayGame();
//getchar();
return EXIT_SUCCESS;
}
.h
#pragma once
#define WIDE 60
#define HIGH 20
struct BODY
{
int X;
int Y;
};
struct SNAKE
{
int size;
struct BODY body[WIDE*HIGH];
}snake;
int food[2] = {0};//food[0]为X坐标 food[1]为Y坐标
int score = 0;
//偏移坐标
int dx = 0;
int dy = 0;
//记录蛇末尾坐标
int lx = 0;
int ly = 0;
void InitFood();
void InitSnake();
void ShowUI();
void PlayGame();
void InitWall();
Code的搬运工V1.0
以上是关于C++中练习贪吃蛇的主要内容,如果未能解决你的问题,请参考以下文章