windows下c/c++编程实现 贪吃蛇简易版

本文详细介绍了一个基于C++的经典贪吃蛇游戏实现方案。利用标准库和Windows API完成游戏界面绘制、蛇的移动控制及得分计算等功能。适用于初学者理解和实践面向过程的游戏开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单地实现场景、蛇的移动、食物、得分以及游戏开始、结束。


实现

头文件 stdlib.h iostream windows.h time.h conio.h vector
先定义一个位置函数,主要通过位置函数来对蛇、食物进行操作。
定义一个场景初始化函数,对场景进行描绘。
蛇的长度是会变的,所以必须使用动态空间为蛇进行定义。
其次是食物,食物是随机的,所以通过rand()、srand()获取随机位置。
最后是获取位移操作,本案例通过操作蛇的头的位置来对整条蛇进行控制。通过获取输入(w,s,a,d)来为其位置进行+、-。从而实现蛇的移动控制。
废话不多说,直接看代码吧。

代码实现

#include<iostream>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
#include <vector>
using std::vector;
using std::cin;
using std::cout;
using std::endl;
using std::string;
void gotoxy(int x,int y)//位置函数
{
    COORD pos;
    pos.X=2*x;
    pos.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
    int i,j;//初始化围墙
    int wall[N+2][N+2]={{0}};
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
            wall[i][j]=1;
    }
    //wall[1][1]=0;
    color(11);
    for(i=0;i<N+2;i++)
    {
        for(j=0;j<N+2;j++)
        {
            if(wall[i][j])
                cout<<"  ";
            else cout<<"□" ;
        }
        cout<<endl;
    }
    gotoxy(N+3,1);//显示信息
    color(24);
    cout<<"按 W S A D 移动方向"<<endl;
    gotoxy(N+3,2);
    color(20);
    cout<<"按任意键暂停"<<endl;
    gotoxy(N+3,3);
    color(20);
    cout<<"得分:"<<endl;
    apple[0]=rand()%N+1;//苹果
    apple[1]=rand()%N+1;
    gotoxy(apple[0],apple[1]);
    color(12);
    cout<<"Θ"<<endl;
}
int main()
{
    int i,j;
    int** snake=NULL;
    int apple[2];
    int score=0;
    int tail[2];
    int len=3;
    char ch='p';
    srand((unsigned)time(NULL));
    init(apple);
    snake=(int**)realloc(snake,sizeof(int*)*len);
    for(i=0;i<len;i++)
        snake[i]=(int*)malloc(sizeof(int)*2);
    for(i=0;i<len;i++)
    {
        snake[i][0]=N/2;
        snake[i][1]=N/2+i;
        gotoxy(snake[i][0],snake[i][1]);
        color(14);
        cout<<"◆"<<endl;
    }
    while(1)//进入消息循环
    {
        tail[0]=snake[len-1][0];
        tail[1]=snake[len-1][1];
        gotoxy(tail[0],tail[1]);
        color(11);
        cout<<"  "<<endl;
        for(i=len-1;i>0;i--)
        {
            snake[i][0]=snake[i-1][0];
            snake[i][1]=snake[i-1][1];
            gotoxy(snake[i][0],snake[i][1]);
            color(14);
            cout<<"◆"<<endl;
        }
        if(kbhit())
        {
            gotoxy(0,N+2);
            ch=getche();
        }
        switch(ch)
        {
            case 'w':snake[0][1]--;break;
            case 's':snake[0][1]++;break;
            case 'a':snake[0][0]--;break;
            case 'd':snake[0][0]++;break;
            default: break;
        }
        gotoxy(snake[0][0],snake[0][1]);
        color(14);
        cout<<"◆"<<endl;
        Sleep(abs(200-0.5*score));
        if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
        {
            score++;
            len++;
            snake=(int**)realloc(snake,sizeof(int*)*len);
            snake[len-1]=(int*)malloc(sizeof(int)*2);
            apple[0]=rand()%N+1;
            apple[1]=rand()%N+1;
            gotoxy(apple[0],apple[1]);
            color(12);
            cout<<"Θ"<<endl;
            gotoxy(N+5,3);
            color(20);
            cout<<score<<endl;
        }
        if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
        {
            gotoxy(N/2,N/2);
            color(30);
            cout<<"失败!!!"<<endl;
            for(i=0;i<len;i++)
            free(snake[i]);
            while(!kbhit())//按任意键继续
                Sleep(0.1);
            for(i=0;i<len;i++)
            {
                gotoxy(snake[i][0],snake[i][1]);
                color(11);
                cout<<"  "<<endl;
            }
            for(i=0;i<len;i++)
            {
                snake[i][0]=N/2;
                snake[i][1]=N/2+i;
                gotoxy(snake[i][0],snake[i][1]);
                color(14);
                cout<<"◆"<<endl;
            }
            gotoxy(N/2,N/2);
            color(11);
            cout<<"          "<<endl;
            continue;

//          Sleep(INFINITE);
            exit(0);
        }
    }
    return 0;
}

... 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值