搜索
首页后端开发C#.Net教程c++贪吃蛇代码是什么

c++贪吃蛇代码是什么

Aug 22, 2020 am 09:42 AM
c++贪吃蛇

c++贪吃蛇代码是【snake_position position[(N-2)*(N-2)+1],void snake_position::initialize(int &j),{x = 1;y = j;}char s[N][N]】。

c++贪吃蛇代码是什么

【相关学习推荐:C视频教程

分析思路

下面就来讲讲贪吃蛇的整个设计思路:

一、

           贪吃蛇的特点是随机产生食物后,然后通过上下左右地方向键来控制贪吃蛇的移动,

当碰到食物时,便把它吃掉,从而身体长度增加一个,这里便采用“#”作为蛇头,”*”作为蛇身和食物。

           因此我便想到,产生的食物,是如何达到随机的目的呢?通过查阅资料得知,在time.h头文件中,定义了通过rand()函数来产生随机数。下面是相关知识:

概述

rand()函数是产生随机数的一个随机函数。C语言里还有srand()函数等。

详述

(1)使用该函数首先应在开头包含头文件stdlib.h

#include8e359799bdf1a571032ba13cc96acda9(C++建议使用#includee1ef53ce3da5b8481bfc355af26c17a5,下同)

(2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX是stdlib.h 中定义的一个整数,它与系统有关。

(3)rand()函数没有输入参数,直接通过表达式rand()来引用;例如可以用下面的语句来打印两个随机数:

printf("Random numbers are: %i %i\n",rand(),rand());

(4)因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机,有时候也叫伪随机数。

(5)为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。函数srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。

由于一开始没有使用srand()函数,多次运行后发现,每次打开运行后产生的食物位置都是一致的,并没有真正达到随机的目的。因此使用srand()函数,又通过time()函数来每次调用一个系统时间来作为srand()的种子。由于每次调用的系统时间并不相同,所以每次的种子也就不相同,从而使得rand()函数达到了随机数的目的。下面是time()函数相关知识:

time() 函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。

主要用来获取当前的系统时间,返回的结果是一个time_t类型,其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后调用localtime函数将time_t所表示的UTC时间转换为本地时间(我们是+8区,比UTC多8个小时)并转成struct tm类型,该类型的各数据成员分别表示年月日时分秒。需要包含头文件faa9dcf97695d0b6f494e040242d8d0c

C标准库函数

time_t time(time_t *t);

如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。

这样便通过rand()函数产生了随机数,对其进行取模,便得到一定范围内的随机数了。

二、

然后便是吃食的问题了,当蛇头遇到一个食物时(食物在贪吃蛇前进的方向上),便将该食物变为蛇头,然后将原先的蛇头变为蛇身,从而达到了吃食的目的。

那如果没有碰到食物呢?就按照原来的方向或者键盘按下的方向继续前进就是了。

 

三、

         下面就是实现的问题了,如何将每个动态都展现出来呢?就是说贪吃蛇是一下一下往前移动的,这个又是如何实现的呢?

         这里我使用了clock()函数,下面是相关知识:

clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock(void) ;

简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。

         因此,通过定义

int start = clock();while(clock()-start<=gamespeed);

这样一个方式来达到了延时的目的,延时的时间则根据gamespeed的值来确定,当gamespeed值越小时,延时时间越短。经过延时后,再执行下一步代码,从而实现了贪吃蛇自动前进的功能和控制其前进的速度啦。

         然而,仅仅有这些还是不行的,还需要解决输出问题。

         通过查阅资料得知,system(“cls”);具有清屏的功能,清除当前屏幕上的内容,进行下一步的输出,因此我便使用了每动一下都要进行清屏,然后将贪吃蛇棋盘整个画面进行输出。

 

 

四、

         为了增加游戏的娱乐性,我又从中加入了等级选择功能,通过输入数字来选择等级,等级越高,贪吃蛇移动速度越快,而且得分越高。得分规则:score += grade*20;

         考虑到游戏的功能性,在游戏结束后输出得分情况,并提示是否继续游戏,而不是直接退出游戏,这样用户就不必每次游戏失败后重新打开程序进行游戏,而是通过选择的方式决定继续游戏或者退出游戏。

         而且加入暂停功能,当玩家玩累了,需要暂停的时候,按下空格(space)键实现暂停,

但由于我的原因,无法解决需要按两下空格才能继续游戏的bug,就暂定为按两下空格键继续游戏吧。

#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#define  N 22
using namespace std;
 
    int gameover;
 
    int x1, y1; // 随机出米
 
    int x,y;
 
    long start;
 
//=======================================
//类的实现与应用initialize
//=======================================
 
//下面定义贪吃蛇的坐标类
class snake_position
{
public:
 
    int x,y;      //x表示行,y表示列
 
    snake_position(){};
 
    void initialize(int &);//坐标初始化
 
 
};
 
snake_position position[(N-2)*(N-2)+1]; //定义贪吃蛇坐标类数组,有(N-2)*(N-2)个坐标
 
void snake_position::initialize(int &j)
{
        x = 1;
 
        y = j;
}
 
 
//下面定义贪吃蛇的棋盘图
 
class snake_map
{
 
private:
 
    char s[N][N];//定义贪吃蛇棋盘,包括墙壁。
 
    int grade, length;
 
    int gamespeed; //前进时间间隔
 
    char direction; // 初始情况下,向右运动
 
    int head,tail;
 
    int score;
 
    bool gameauto;
 
public:
 
    snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){}
 
    void initialize();   //初始化函数
 
    void show_game();
 
    int updata_game();
 
    void setpoint();
 
    void getgrade();
 
    void display();
 
 
};
 
//定义初始化函数,将贪吃蛇的棋盘图进行初始化
 
void snake_map::initialize()
{
    int i,j;
 
    for(i=1;i<=3;i++)
 
        s[1][i] = &#39;*&#39;;
 
    s[1][4] = &#39;#&#39;;
 
    for(i=1;i<=N-2;i++)
 
        for(j=1;j<=N-2;j++)
 
            s[i][j]=&#39; &#39;; // 初始化贪吃蛇棋盘中间空白部分
 
    for(i=0;i<=N-1;i++)
 
        s[0][i] = s[N-1][i] = &#39;-&#39;; //初始化贪吃蛇棋盘上下墙壁
 
    for(i=1;i<=N-2;i++)
 
        s[i][0] = s[i][N-1] = &#39;|&#39;; //初始化贪吃蛇棋盘左右墙壁
}
 
 
//============================================
//输出贪吃蛇棋盘信息
 
void snake_map::show_game()
 
{
 
    system("cls"); // 清屏
 
    int i,j;
 
    cout << endl;
 
    for(i=0;i<N;i++)
    {
 
        cout << &#39;\t&#39;;
 
        for(j=0;j<N;j++)
 
            cout<<s[i][j]<<&#39; &#39;; // 输出贪吃蛇棋盘
 
        if(i==2) cout << "\t等级:" << grade;
 
        if(i==6) cout << "\t速度:" << gamespeed;
 
        if(i==10) cout << "\t得分:" << score << "分" ;
 
        if(i==14) cout << "\t暂停:按一下空格键" ;
 
        if(i==18) cout << "\t继续:按两下空格键" ;
 
        cout<<endl;
    }
}
 
//输入选择等级
void snake_map::getgrade()
{
    cin>>grade;
 
    while( grade>7 || grade<1 )
    {
        cout << "请输入数字1-7选择等级,输入其他数字无效" << endl;
 
        cin >> grade;
    }
    switch(grade)
    {
        case 1: gamespeed = 1000;gameauto = 0;break;
 
        case 2: gamespeed = 800;gameauto = 0;break;
 
        case 3: gamespeed = 600;gameauto = 0;break;
 
        case 4: gamespeed = 400;gameauto = 0;break;
 
        case 5: gamespeed = 200;gameauto = 0;break;
 
        case 6: gamespeed = 100;gameauto = 0;break;
 
        case 7: grade = 1;gamespeed = 1000;gameauto = 1;break;
 
    }
 
}
 
//输出等级,得分情况以及称号
 
void snake_map::display()
{
 
    cout << "\n\t\t\t\t等级:" << grade;
 
    cout << "\n\n\n\t\t\t\t速度:" << gamespeed;
 
    cout << "\n\n\n\t\t\t\t得分:" << score << "分" ;
 
}
 
//随机产生米
void snake_map::setpoint()
{
    srand(time(0));
 
    do
    {
 
        x1 = rand() % (N-2) + 1;
 
        y1 = rand() % (N-2) + 1;
 
    }while(s[x1][y1]!=&#39; &#39;);
 
    s[x1][y1]=&#39;*&#39;;
}
 
char key;
 
int snake_map::updata_game()
{
    gameover = 1;
 
    key = direction;
 
    start = clock();
 
    while((gameover=(clock()-start<=gamespeed))&&!kbhit());
 
    //如果有键按下或时间超过自动前进时间间隔则终止循环
 
 
 
        if(gameover)
        {
 
            getch();
 
            key = getch();
        }
 
        if(key == &#39; &#39;)
 
        {
            while(getch()!=&#39; &#39;){};//这里实现的是按空格键暂停,按空格键继续的功能,但不知为何原因,需要按两下空格才能继续。这是个bug。
        }
 
        else
 
            direction = key;
 
        switch(direction)
        {
            case 72: x= position[head].x-1; y= position[head].y;break; // 向上
 
            case 80: x= position[head].x+1; y= position[head].y;break; // 向下
 
            case 75: x= position[head].x; y= position[head].y-1;break; // 向左
 
            case 77: x= position[head].x; y= position[head].y+1; // 向右
 
        }
 
        if(!(direction==72||direction==80||direction==75 ||direction==77))   // 按键非方向键
 
            gameover = 0;
 
        else if(x==0 || x==N-1 ||y==0 || y==N-1)   // 碰到墙壁
 
            gameover = 0;
 
        else if(s[x][y]!=&#39; &#39;&&!(x==x1&&y==y1))    // 蛇头碰到蛇身
 
            gameover = 0;
 
        else if(x==x1 && y==y1)
 
        { // 吃米,长度加1
 
            length ++;
 
            if(length>=8 && gameauto)
 
            {
 
                length -= 8;
 
                grade ++;
 
                if(gamespeed>=200)
 
                    gamespeed -= 200; // 改变贪吃蛇前进速度
 
                else
 
                    gamespeed = 100;
 
            }
 
            s[x][y]= &#39;#&#39;;  //更新蛇头
 
            s[position[head].x][position[head].y] = &#39;*&#39;; //吃米后将原先蛇头变为蛇身
 
            head = (head+1) % ( (N-2)*(N-2) );   //取蛇头坐标
 
            position[head].x = x;
 
            position[head].y = y;
 
            show_game();
 
            gameover = 1;
 
            score += grade*20;  //加分
 
            setpoint();   //产生米
 
        }
 
        else
        { // 不吃米
 
            s[position[tail].x][position[tail].y]=&#39; &#39;;//将蛇尾置空
 
            tail= (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐标
 
            s[position[head].x][position[head].y]=&#39;*&#39;;  //将蛇头更为蛇身
 
            head= (head+1) % ( (N-2) * (N-2) );
 
            position[head].x = x;
 
            position[head].y = y;
 
            s[position[head].x][position[head].y]=&#39;#&#39;; //更新蛇头
 
            gameover = 1;
 
        }
    return gameover;
 
}
//====================================
//主函数部分
//====================================
int main()
{
    char ctn = &#39;y&#39;;
 
    int nodead;
 
    cout<<"\n\n\n\n\n\t\t\t 欢迎进入贪吃蛇游戏!"<<endl;//欢迎界面;
 
    cout<<"\n\n\n\t\t\t 按任意键马上开始。。。"<<endl;//准备开始;;
 
    getch();
 
    while( ctn==&#39;y&#39; )
    {
        system("cls"); // 清屏
 
        snake_map snake;
 
        snake.initialize();
 
        cout << "\n\n请输入数字选择游戏等级:" << endl;
 
        cout << "\n\n\n\t\t\t1.等级一:速度 1000 \n\n\t\t\t2.等级二:速度 800 \n\n\t\t\t3.等级三:速度 600 ";
 
        cout << "\n\n\t\t\t4.等级四:速度 400 \n\n\t\t\t5.等级五:速度 200 \n\n\t\t\t6.等级六:速度 100 \n\n\t\t\t7.自动升级模式" << endl;
 
        snake.getgrade();//获取等级
 
        for(int i=1;i<=4;i++)
        {
            position[i].initialize(i);//初始化坐标
        }
 
        snake.setpoint();  // 产生第一个米
 
        do
        {
            snake.show_game();
 
            nodead = snake.updata_game();
 
        }while(nodead);
 
        system("cls"); //清屏
 
 
 
        cout << "\n\n\n\t\t\t\tGameover!\n\n"<<endl;
 
        snake.display();//输出等级/得分情况
 
        cout << "\n\n\n\t\t    是否选择继续游戏?输入 y 继续,n 退出" << endl;
 
        cin >> ctn;
 
    }
 
    return 0;
}

以上是c++贪吃蛇代码是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C#作为.NET语言:生态系统的基础C#作为.NET语言:生态系统的基础May 02, 2025 am 12:01 AM

C#是微软在2000年发布的编程语言,旨在结合C 的强大功能和Java的简洁性。1.C#是一种类型安全、面向对象的编程语言,支持封装、继承和多态。2.C#的编译过程将代码转化为中间语言(IL),然后在.NET运行时环境(CLR)中即时编译成机器码执行。3.C#的基本用法包括变量声明、控制流和函数定义,而高级用法涵盖异步编程、LINQ和委托等。4.常见错误包括类型不匹配和空引用异常,可通过调试器、异常处理和日志记录来调试。5.性能优化建议包括使用LINQ、异步编程和提高代码可读性。

c#vs. .net:澄清关键差异和相似之处c#vs. .net:澄清关键差异和相似之处May 01, 2025 am 12:12 AM

C#是一种编程语言,而.NET是一个软件框架。1.C#由微软开发,适用于多平台开发。2..NET提供类库和运行时环境,支持多语言。两者协同工作,构建现代应用。

超越炒作:评估C#.NET的当前作用超越炒作:评估C#.NET的当前作用Apr 30, 2025 am 12:06 AM

C#.NET是一个强大的开发平台,结合了C#语言和.NET框架的优势。1)它广泛应用于企业应用、Web开发、游戏开发和移动应用开发。2)C#代码编译成中间语言后由.NET运行时环境执行,支持垃圾回收、类型安全和LINQ查询。3)使用示例包括基本控制台输出和高级LINQ查询。4)常见错误如空引用和类型转换错误可以通过调试器和日志记录解决。5)性能优化建议包括异步编程和优化LINQ查询。6)尽管面临竞争,C#.NET通过不断创新保持其重要地位。

C#.NET的未来:趋势和机遇C#.NET的未来:趋势和机遇Apr 29, 2025 am 12:02 AM

C#.NET的未来趋势主要集中在云计算、微服务、AI和机器学习集成以及跨平台开发三个方面。1)云计算和微服务:C#.NET通过Azure平台优化云环境表现,支持构建高效微服务架构。2)AI和机器学习集成:借助ML.NET库,C#开发者可在应用中嵌入机器学习模型,推动智能化应用发展。3)跨平台开发:通过.NETCore和.NET5 ,C#应用可在Windows、Linux和macOS上运行,扩展部署范围。

C#.NET开发今天:趋势和最佳实践C#.NET开发今天:趋势和最佳实践Apr 28, 2025 am 12:25 AM

C#.NET开发的最新动态和最佳实践包括:1.异步编程提高应用响应性,使用async和await关键字简化非阻塞代码;2.LINQ提供强大查询功能,通过延迟执行和表达式树高效操作数据;3.性能优化建议包括使用异步编程、优化LINQ查询、合理管理内存、提升代码可读性和维护性、以及编写单元测试。

C#.NET:使用.NET生态系统构建应用程序C#.NET:使用.NET生态系统构建应用程序Apr 27, 2025 am 12:12 AM

如何利用.NET构建应用?使用.NET构建应用可以通过以下步骤实现:1)了解.NET基础知识,包括C#语言和跨平台开发支持;2)学习核心概念,如.NET生态系统的组件和工作原理;3)掌握基本和高级用法,从简单控制台应用到复杂的WebAPI和数据库操作;4)熟悉常见错误与调试技巧,如配置和数据库连接问题;5)应用性能优化与最佳实践,如异步编程和缓存。

C#作为多功能.NET语言:应用程序和示例C#作为多功能.NET语言:应用程序和示例Apr 26, 2025 am 12:26 AM

C#在企业级应用、游戏开发、移动应用和Web开发中均有广泛应用。1)在企业级应用中,C#常用于ASP.NETCore开发WebAPI。2)在游戏开发中,C#与Unity引擎结合,实现角色控制等功能。3)C#支持多态性和异步编程,提高代码灵活性和应用性能。

C#.NET用于网络,桌面和移动开发C#.NET用于网络,桌面和移动开发Apr 25, 2025 am 12:01 AM

C#和.NET适用于Web、桌面和移动开发。1)在Web开发中,ASP.NETCore支持跨平台开发。2)桌面开发使用WPF和WinForms,适用于不同需求。3)移动开发通过Xamarin实现跨平台应用。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器