贪吃蛇C语言实现

/*
  
 /*
  头尾平移的方法实现
  By black4yl
  原理:
  在大小为100的数组中,利用head,rear标记的头,尾坐标值,定位当前头和尾巴。
  在行走时,擦去尾巴,按方向标记新头,擦去旧头, 实现蛇行走。
  当吃到食物时,只变化头,不变化

*/
#include"windows.h"
#include"conio.h"
#include"iostream"
#include<time.h>
using namespace std;

#define up      72
#define down    80
#define left    75
#define right   77

void GotoXY(int x,int y)
{
    COORD c;
    c.X=x-1; c.Y=y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

void Display(char img[][22],int score,int speed)   //0为空 1为身子 2为头 3为食物
{
    system("cls");
    int i,j;
    GotoXY(1,1);
    for(i=0;i<24;i++)  cout<<"□";
    cout<<endl;
    for(i=0;i<22;i++)
    {
        cout<<"□";
        for(j=0;j<22;j++)
        {
                if(img[i][j]==0)
                    cout<<"  ";
                if(img[i][j]==1)
                    cout<<"○";
                if(img[i][j]==2)
                    cout<<"○";
                if(img[i][j]==3)
                    cout<<"○";
        }
        
        cout<<"□"<<endl;
    }
    for(i=0;i<24;i++)  cout<<"□";
        GotoXY(50,10); printf("Score:  %d 分",score);
        GotoXY(50,11); printf("speed=  %d ms",speed);
}
void Welcome()
{
    long time=clock();

    GotoXY(3,8);
    cout<<"欢迎进入贪吃蛇游戏"<<endl;
    while(clock()-time<2000);
    system("cls");
    GotoXY(3,8);
    time=clock();
    cout<<"操作方法: 按 上 下 左 右 键控制蛇,以便吃到更多的食物,不要饿死哦~ "<<endl;
    GotoXY(6,13);
    int i=4;
    do
    {
        time=clock();
        while(clock()-time<1000);    
        GotoXY(6,13);
        cout<<"游戏将在--"<<i<<"--秒"<<"后开始";
    }while(i--);
    system("cls");
}
int main()
{
    int x, y;
    int fx,fy;  //食物
    srand(time(0));
    fx=rand()%20+1;
    fy=rand()%20+1;
    int len=0;
    int i,j;
    int tcspos[2][150];
    char img[22][22]={0};
    char arr=77;
    long time;//时间
    int timeover;
    int speed=500,score=0;
    int head,rear;
    head=3;
    rear=0;
    for(i=0; i<4; i++){        //初始化蛇身
        tcspos[0][i] = 1;
        tcspos[1][i] = i + 1;
    }
     img[fy][fx]=3;      
    Welcome();
    Display(img,score,speed);
    while(1)
    {    
        timeover=1;
        time=clock();
        while((timeover=clock()-time<=speed)&&!kbhit());
        if(timeover)  //timeover 非0,说明是按键中断循环
        {
            getch();
            arr=getch();
        }
        switch(arr)
        {                //完成操作
            case up: y=tcspos[1][head]-1; x=tcspos[0][head]; break;                            //上
            case down: y=tcspos[1][head]+1; x=tcspos[0][head];  break;                        //下
            case left: y=tcspos[1][head]; x=tcspos[0][head]-1;  break;                        //左
            case right: y=tcspos[1][head]; x=tcspos[0][head]+1; break;                        //右
        }
        if(img[y][x]!=0&&!((x==fx)&&(y==fy)))  //冲突
        {    
             break; //结束
        }
        if(x<0||x>21||y<0||y>21)
        {
                break; //结束
        }
        if((x==fx)&&(y==fy))  //吃到
        {    
            len++;
            score+=2;   //每吃一个加2分
            if(len>9)  //蛇长大于10,
            {
                len%=9;  //重新计算
                speed-=20;  //每次速度增加20ms
                score+=10;  //没完成一个10,则多加10分
            }

        img[tcspos[1][head]][tcspos[0][head]]=2; //标记行走后的头
        head=(head+1)%150; //head 移到第二位;
        tcspos[0][head]=x;  //设置蛇头坐标
        tcspos[1][head]=y;
        do                        //生产食物
        {
            fx=rand()%21+1;
            fy=rand()%21+1;
        }while(img[fy][fx]!=0);
        img[fy][fx]=3;
        Display(img,score,speed);
        }
        else   //没吃到
        {    
            img[tcspos[1][head]][tcspos[0][head]]=1; //头变为身子
            head=(head+1)%150;            //头前移
            img[tcspos[1][rear]][tcspos[0][rear]]=0; //消去尾巴
            rear=(rear+1)%150;          //尾巴前移
            tcspos[1][head]=y;
            tcspos[0][head]=x;
            img[tcspos[1][head]][tcspos[0][head]]=2;  //标记新头
            Display(img,score,speed);
        }

    }  //while()
            system("cls");
            GotoXY(20,12);
            cout<<"score:"<<score<<endl;
            GotoXY(20,13);
            cout<<"---Game Over---"<<endl;
            GotoXY(20,14);
            cout<<"请输入您的姓名:";
            getchar();
}
时间: 2024-10-12 23:56:56

贪吃蛇C语言实现的相关文章

贪吃蛇C语言代码

贪吃蛇C语言代码 贪吃蛇C语言代码 手动贪吃蛇 智能贪吃蛇 1.手动贪吃蛇 /*蛇越长跑得越快*/ /*作者:SGAFPZ*/ #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <math.h> //#include <unistd.h> #include <conio.h> #include <string.h> #include &

贪吃蛇 c语言实现

//程序在运行时还有一些错误没有找出,在左右碰壁时会过一个才结束游戏 #include<stdio.h>#include<string.h>#include<stdlib.h> char Map[8][16];//游戏地图int H=8,L=16;//地图的高和长 void MapInitial();//地图的初始化 void CreteFood();//随机产生食物 void getDirection();//读取方向 void Smove();//蛇的移动 void

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇这些天一直有人问我,c语言好学吗?我是个新手,该如何学习? 其实,这类问题困扰着很多新手.在如何学习之前,我们想简单的了解一下什么是C语言: C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望

俄罗斯方块和贪吃蛇游戏软件:C语言应用初始感受

C语言课程设以一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统. 首先安装c-free,然后是将代码贴进去运行 界面虽然有点简单,但这确实使用C语言做出来的游戏. 分析一下程序,感觉没有太复杂的,就是上学期学习的简单语句的组合,但是用的非常好.首先看看用到了几种语句: 1.首先是在屏幕上显示的语句printf, 2.另外一个就是多条件判断switch--case 应用方法 switch(tetris->

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

C语言小游戏开发之贪吃蛇

寒假期间一时兴起,想着用C语言能开发出贪吃蛇小游戏应该是一件不错的事!但C语言学习过程中从来都是字符界面的编程,如何能有"图形化"的效果呢?于是小编就在度娘, 谷歌等网站搜索了一番,发现了一些有用的Win32 API函数,于是小编的心一下子激动了起来,有了这些API函数也许能够实现哟!开始吧! 编程之前小编的构思是这样的,贪吃蛇小游戏应该实现的有: 1.贪吃蛇在不进行控制的条件下应该能够自主前进. 2.玩家可以通过WASD键来控制贪吃蛇的前进方向. 3.运行过程中若贪吃蛇撞击到墙壁或自

C语言实现贪吃蛇之全靠数组篇

贪吃蛇游戏的设计思路很简单,相信有过一些编程经验的同学都不至于束手无策,可在我刚刚接触编程时,这个小小的贪吃蛇游戏可是让我费了不少脑筋,如今学习编程已经快一年了,前几天又看了一遍K&R,打算写几个贪吃蛇程序巩固一下知识.我打算写若干篇贪吃蛇的博客,从简单粗糙的开始,不断改良,希望能给初学C语言的同学一点借鉴. 话不多说,我们现在就开始吧,首先我们整理一下思路.首先我们要明确,既然贪吃蛇游戏理论上可以无限继续下去,那么游戏主体一定就是一个循环.蛇的移动就在这个循环中完成.如果是初学编程的话,可能会

C语言之贪吃蛇(curses库函数)

上大学学习编程的初始目的就是冲着游戏来的~不过在刚学习C语言的时候,完全无法利用所学知识弄出一个可玩的游戏╮(╯_╰)╭,学了1年后仍然对最简单的贪吃蛇没有思路(当然不是说没有打代码的思路,而是没有办法弄出动态的东西,而且当时往算法那走了~),直到如今大二,利用寒假的一点时间入门Linux的时候,发现了curses库函数!当我看明白它的作用时,拍案而起,TM这玩意不就是我梦寐以求的可实现界面的东东么!当我学了一点点就觉悟到,用一个move()和printw()函数就完全可以把贪吃蛇这种级别的写出