贪吃蛇游戏C++命令行版实例代码

 更新时间:2014年09月16日 11:21:28   投稿:shichen2014  
这篇文章主要介绍了贪吃蛇游戏C++命令行版实例代码,包含了常见的循环语句及相关游戏规则的判定方法,有助于更好的理解游戏设计原理,需要的朋友可以参考下

本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏。分享给大家供大家参考。具体实现方法如下:

众所周知,贪吃蛇游戏是经典的计算机游戏。

游戏描述如下:

1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格。
2. 贪吃蛇在规定的区域内活动,当:

①贪吃蛇触碰到墙壁时;

②贪吃蛇的蛇头触碰到蛇身或者蛇尾时;

③玩家的键盘输入不是方向键时;

命令行显示“Game Over!”并且退出游戏。

3. 贪吃蛇活动的区域内每次随机产生一颗“豆豆”,当贪吃蛇吃到“豆豆”后蛇身增长一格,自动前进时间缩 短100ms(默认是1000ms,且不能少于100ms)。贪吃蛇长度每为8的倍数Improve a Level。

C++代码如下:

#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

inline void display(char gsDomain[][22], int level, int moveSpeed)
{
system("cls"); //清屏
cout << endl << endl;
for (int i = 0; i < 22; i++)
{
cout << "\t";
for (int j = 0; j < 22; j++)
cout << gsDomain[i][j] << " ";
if (i == 0)
{
cout << "\tLevel:" << level;
}
else if (i == 3)
{
cout << "\t自动前进时间";
}
else if (i == 5)
{
cout << "\t间隔:" << moveSpeed << " ms";
}

cout << endl;
}
}

int main()
{
char gsDomain[22][22]; //贪吃蛇活动区域(包括墙壁)
//初始化贪吃蛇活动区域(不包括墙壁)
for (int i = 1; i <= 21; i++)
{
for (int j = 1; j <= 21; j++)
gsDomain[i][j] = ' ';
}
//初始化贪吃蛇活动区域的上下墙壁
for (int i = 0; i < 22; i++)
gsDomain[0][i] = gsDomain[21][i] = '-';
//初始化贪吃蛇活动区域的左右墙壁
for (int i = 1; i < 21; i++)
gsDomain[i][0] = gsDomain[i][21] = '|';
//初始化蛇身
for (int i = 1; i <= 3; i++)
gsDomain[1][i] = '*';
//初始化蛇头
gsDomain[1][4] = '#';

int snake[2][100]; //记录贪吃蛇每次出现的位置的坐标
for (int i = 0; i < 4; i++)
{
snake[0][i] = 1; //记录贪吃蛇所在位置的x坐标
snake[1][i] = i + 1; //记录贪吃蛇所在位置的y坐标
}
int head = 3, tail = 0, length = 4;

int beanX, beanY; //豆豆出现的位置
srand(time(0));
do
{
beanX = rand() % 20 + 1;
beanY = rand() % 20 + 1;
} while (gsDomain[beanX][beanY] != ' ');
gsDomain[beanX][beanY] = '*'; //豆豆

cout << "\n\n\t\t贪吃蛇游戏即将开始!\n";
long start;
int level = 1, moveSpeed = 1000;
for (int i = 3; i >= 0; i--)
{
start = clock();
while (clock() - start <= 1000){}
system("cls");
if (i)
{
cout << "\n\n\t\t进入游戏倒计时:" << i << endl;
}
else
display(gsDomain, level, moveSpeed);
}

char direction = 77; //贪吃蛇默认自动向右直线前进
while (true)
{
bool timeFlag = true;
int x, y;
start = clock();

//若时间超过自动前进时间或者键盘上有键按下则终止循环
while ((timeFlag = (clock() - start <= moveSpeed)) && !kbhit()){}

if (timeFlag)
{
//键盘上有键按下时读取键盘输入
getch();
direction = getch();
}

switch (direction)
{
//向上
case 72: x = snake[0][head] - 1, y = snake[1][head];
break;
//向下
case 80: x = snake[0][head] + 1, y = snake[1][head];
break;
//向左
case 75: x = snake[0][head], y = snake[1][head] - 1;
break;
//向右
case 77: x = snake[0][head], y = snake[1][head] + 1;
break;
default: cout << "\tGame Over!\n";
return 0;
}

if (x == 0 || x == 21 || y == 0 || y == 21)
{
//贪吃蛇触碰到墙壁
cout << "\tGame Over!\n";
return 0;
}

if (gsDomain[x][y] != ' ' && !(x == beanX && y == beanY))
{
//贪吃蛇的蛇头触碰到蛇身或者蛇尾
cout << "\tGame Over!\n";
return 0;
}

if (x == beanX && y == beanY)
{
//吃豆豆
length++; //长度加1
if (length >= 8)
{
//游戏升级处理
length -= 8;
level++;
if (moveSpeed > 100)
moveSpeed -= 100;
}
gsDomain[snake[0][head]][snake[1][head]] = '*';
gsDomain[x][y] = '#';
head = (head + 1) % 100;
snake[0][head] = x;
snake[1][head] = y;
do
{
beanX = rand() % 20 + 1;
beanY = rand() % 20 + 1;
} while (gsDomain[beanX][beanY] != ' ');
gsDomain[beanX][beanY] = '*';

display(gsDomain, level, moveSpeed); //屏幕上显示
}
else
{
//不吃豆豆
gsDomain[snake[0][tail]][snake[1][tail]] = ' '; //蛇尾前移一格
tail = (tail + 1) % 100;
gsDomain[snake[0][head]][snake[1][head]] = '*';
head = (head + 1) % 100;
snake[0][head] = x;
snake[1][head] = y;
gsDomain[x][y] = '#'; //蛇头前移一格
display(gsDomain, level, moveSpeed); //屏幕上显示
}
}

return 0;
}

希望本文所述实例对大家C程序设计的学习有所帮助。

相关文章

  • C++树之遍历二叉树实例详解

    C++树之遍历二叉树实例详解

    这篇文章主要给大家介绍了关于C++树之遍历二叉树的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • c++11 多线程编程——如何实现线程安全队列

    c++11 多线程编程——如何实现线程安全队列

    这篇文章主要介绍了c++ 如何实现线程安全队列,帮助大家更好的理解和学习c++的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • 浅谈C语言的字符串分割

    浅谈C语言的字符串分割

    下面小编就为大家带来一篇浅谈C语言的字符串分割。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C++控制权限关键字protected

    C++控制权限关键字protected

    这篇文章主要介绍了C++控制权限关键字protected,protected和private类似,而对于派生类来说,protected与public类似,下面来一起俩姐更多详细内容吧,需要的小伙伴可以参考一下
    2022-01-01
  • C++实现投骰子的随机游戏

    C++实现投骰子的随机游戏

    这篇文章主要为大家详细介绍了C++实现投骰子的随机游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C++中的动态分派在HotSpot VM中的应用小结

    C++中的动态分派在HotSpot VM中的应用小结

    多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定,这篇文章主要介绍了C++的动态分派在HotSpot VM中的重要应用,需要的朋友可以参考下
    2023-09-09
  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析

    以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结

    这篇文章主要介绍了算法之排序算法的算法思想和使用场景总结,本文讲解了插入排序、交换排序、选择排序等几大类排序算法的特点、思想和使用场景,需要的朋友可以参考下
    2014-08-08
  • C/C++中带空格字符串的输入讲解

    C/C++中带空格字符串的输入讲解

    这篇文章主要给大家介绍了关于如何解决C++中带空格字符串的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2021-09-09
  • C++递归与分治算法原理示例详解

    C++递归与分治算法原理示例详解

    这篇文章主要为大家介绍了C++递归与分治算法的策略原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11

最新评论