C语言实现简易贪吃蛇游戏的示例代码

目录
  • 前言
  • 一、构造小蛇
  • 二、小蛇的移动
  • 三、控制小蛇移动
  • 四、判断游戏失败
  • 五、吃食物增加长度
  • 六、完整代码

前言

实现一个经典的小游戏——贪吃蛇,如图所示。读者可以先自己尝试,主要难点是小蛇数据如何存储、如何实现转弯的效果、吃到食物后如何增加长度。

一、构造小蛇

第一节在画面中显示一条静止的小蛇,如图所示。对于二维数组canvas[High][Width]的对应元素,

值为0输出空格

值为一1输出边框#

值为1输出蛇头@

值为大于1的正数输出蛇身*

在 startup()函数中初始化蛇头,在画布的中间位置(canvas[High/2][Width/2]= 1;),蛇头向左依次生成4个蛇身(for (i=1;i<=4;i++) canvas[High/2][Width/2-i]=i+1;),元素值分别为2、3、4、5。

二、小蛇的移动

效果实现

实现小蛇的移动是贪吃蛇游戏的难点。图列出了小蛇分别向右、向上运动后对应二维数组元素值的变化,从中我们可以得出实现思路。

方法步骤

假设小蛇元素为54321,其中1为蛇头、5432为蛇身、最大值5为蛇尾。首先将所有大于0的元素加1,得到65432;将最大值6变为0,即去除原来的蛇尾;再根据对应的移动方向将2对应方向的元素由0变成1;如此即实现了小蛇的移动。

本游戏的第二步为定义变量int moveDirection表示小蛇的移动方向,值为1、2、3、4分别表示小蛇向上、下、左、右方向移动,小蛇的移动在moveSnakeByDirection()函数中实现。

三、控制小蛇移动

第三步的实现比较简单,在updateWithInput()函数中按a、s、d、w 键改变moveDirection的值,然后调用moveSnakeByDirection()实现小蛇向不同方向的移动

四、判断游戏失败

第四步判断游戏失败,当小蛇和边框或自身发生碰撞时游戏失败

五、吃食物增加长度

效果实现

第五步实现吃食物增加长度的功能,当二维数组canvas[High][Width]的元素值为一2时输出食物数值'F',当蛇头碰到食物时长度加1.

方法步骤

其实现思路和小蛇的移动类似,只需保持原蛇尾,不将最大值变为0即可。

六、完整代码

下面是完整代码,运行之后需要手动调节英文输入w,s,a,d,以实现上下左右移动

#include<stdio.h>
#include<stdlib.h> //使用rand(),返回一个范围在0~ RAND_MAX之间的伪随机数
#include<conio.h> //控制台输入输出,使用getch()
#include<windows.h>//使用system("pause")实现暂停。
                   //Sleep(200),延迟200毫秒
#define High 20//游戏画面尺寸
#define Width 100

// 全局变量
int moveDirection;// 小蛇移动位置,上下左右分别用1,2,3,4表示
int food_x,food_y; // 食物的位置
int canvas[High][Width] ={0}; // 二维数组存储游戏画布中对应的元素
                // 0为空格  ,-1为边框#,-2为食物 F,1为蛇头@,大于1的正数为蛇身*

//光标移动到(x,y)位置
void gotoxy(int x,int y)
{
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE) ;
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}
//隐藏光标
void HideCursor()
{
    CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
    curInfo.dwSize = 1; //如果没赋值的话,光标隐藏无效
    curInfo.bVisible = FALSE; //将光标设置为不可见
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
    SetConsoleCursorInfo(handle, &curInfo); //设置光标信息
}

//一、数据初始化 ,构造小蛇
void startup()
{
    int i,j;
    // 初始化边框
    for(i=0;i<High;i++)
    {
        canvas[i][0]=-1;
        canvas[i][Width-1]=-1;
    }
    for(j=0;j<Width;j++)
    {
        canvas[0][j]=-1;
        canvas[High-1][j]=-1;
    }
    // 初始化蛇头位置
    canvas[High/2][Width/2]=1;

    // 初始化蛇身,画布中元素值分别为2,3,4,5....
    for(i=1;i<4;i++)
          canvas[High/2][Width/2-i]=i+1;

    // 初始小蛇向右移动
    moveDirection=4;
     food_x=rand()%(High-5)+2;
    food_y=rand()%(Width-5)+2;
    canvas[food_x][food_y]=-2;
}

// 二、移动小蛇
// 第一步扫描数组canvas所有元素,找到正数元素都+1
// 第二步找到最大元素(即蛇尾巴),把其变为0
// 找到=2的元素(即蛇头),再根据输出的上下左右方向,把对应的另一个像素值设为1(新蛇头)
void moveSnakeByDirection()// 移动小蛇
{
    // 第一步扫描数组canvas所有元素,找到正数元素都+1
    int i,j;
    for(i=1;i<High-1;i++)// i=1
        for(j=1;j<Width-1;j++)//j=1
            if(canvas[i][j]>0)
            canvas[i][j]++;

    // 第二步找到最大元素(即蛇尾巴),把其变为0
    int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
    int max=0;    

    for(i=1;i<High-1;i++)//i=1

        for(j=1;j<Width-1;j++)//j=1

            if(canvas[i][j]>0)
            {
                if(max<canvas[i][j])
                {
                    max=canvas[i][j];
                    oldTail_i=i;
                    oldTail_j=j;
                }
                if(canvas[i][j]==2)
                {
                    oldHead_i=i;
                    oldHead_j=j;
                }
            }
    // 找到=2的元素(即蛇头),再根据输出的上下左右方向,把对应的另一个像素值设为1(新蛇头)
    int newHead_i,newHead_j;
    if(moveDirection==1)    //上
    {
        newHead_i=oldHead_i-1;
        newHead_j=oldHead_j;
    }
    if(moveDirection==2)    //下
    {
        newHead_i=oldHead_i+1;
        newHead_j=oldHead_j;
    }
    if(moveDirection==3)    //左
    {
        newHead_i=oldHead_i;
        newHead_j=oldHead_j-1;
    }
    if(moveDirection==4)    //右
    {
        newHead_i=oldHead_i;
        newHead_j=oldHead_j+1;
    }
    // 新蛇头如果吃到食物(-2为食物F)
    if(canvas[newHead_i][newHead_j]==-2)
    {
        canvas[food_x][food_y]=0;
        //产生一个新的食物
        food_x=rand()%(High-5)+2;
        food_y=rand()%(Width-5)+2;
        canvas[food_x][food_y]=-2;// 原来的旧蛇尾留着,长度自动+1
    }
    // 否则,原来的旧蛇尾减掉,保持长度不变
    else
        canvas[oldTail_i][oldTail_j]=0;
        // 是否小蛇和自身撞,或者和边框撞,游戏失败
    if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1)
    {
        printf("game over!\n");
        Sleep(2000);
        system("pause");
        exit(0);
    }
    else
       canvas[newHead_i][newHead_j]=1;
}

//显示画面
void show()
{
    gotoxy(0,0); // 光标移动到原点位置,以下重画清屏
    int i,j;
    for(i=0;i<High;i++)
    {
        for(j=0;j<Width;j++)
        {
            if(canvas[i][j]==0)
               printf(" ");//    输出空格
            else if(canvas[i][j]==-1)
               printf("#");//    输出边框#
            else if(canvas[i][j]==1)
               printf("@");//    输出蛇头@
            else if(canvas[i][j]>1)
               printf("*");//    输出蛇身*
            else if(canvas[i][j]==-2)
               printf("F");//    输出食物F
        }
        printf("\n");
    }
    Sleep(90);
}

// 与用户输入无关的更新
void updateWithoutInput()
{
    moveSnakeByDirection();
}

// 与用户输入有关的更新,控制小蛇移动
void updateWithInput()
{
    char input;
    if(kbhit())
    {
        input=getch(); // 判断是否有输入
        if(input=='a')
        {
            moveDirection=3; // 位置左移
            moveSnakeByDirection();
        }
         else if(input=='d')
        {
            moveDirection=4;// 位置右移
            moveSnakeByDirection();
        }
        else if(input=='w')
        {
            moveDirection=1;// 位置上移
            moveSnakeByDirection();
        }
         else if(input=='s')
        {
            moveDirection=2; // 位置下移
            moveSnakeByDirection();
        }
    }
}

int main()
{
    startup(); // 数据初始化
    while(1)   // 游戏循环执行
    {
        show();// 显示画面
        HideCursor(); //隐藏光标
        updateWithoutInput();// 与用户输入无关的更新
        updateWithInput();   //与用户输入有关的更新
    }
    return 0;
}

到此这篇关于C语言实现简易贪吃蛇游戏的示例代码的文章就介绍到这了,更多相关C语言贪吃蛇游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实现贪吃蛇超详细教程

    目录 一.游戏说明 1.1游戏按键说明 1.2计分系统 二.游戏运行 2.1游戏效果展示 2.2一个报错的纠正 2.3 游戏代码 三.游戏框架构建 3.1游戏界面的大小 3.2蛇头和蛇身 3.2.1蛇头 3.2.2蛇身 3.3标记游戏区 3.3.1存储游戏区的各个位置是什么 3.3.2 用宏来使某些数字具有特殊意义 3.4菜单栏的设置  四.隐藏光标的设置 4.1 光标信息的结构体成员 4.2隐藏光标的实现 4.3GetStdHandle函数 4.4 SetConsoleCursorInfo函数

  • 用C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 实现功能 蛇最开始三节,向右移动.用户可以通过按上下左右来控制蛇的移动,食物随机产生,蛇吃到食物后蛇的身体会变长.蛇撞墙或者撞到自己身体后,游戏结束. 怎么实现 要实现一个贪吃蛇小游戏,首先要想清楚游戏里有什么,怎样实现功能. 很明显游戏中只有两样东西,蛇和食物. 所以要建立蛇和食物信息,然后将蛇和食物进行初始化,在将蛇和食物画出来. 实现的功能有: 1. 蛇的移动  2. 按键控制蛇的移动  3. 食物的产生  4

  • C语言实现双人贪吃蛇游戏实例代码

    贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜.   上源代码: ​ #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <time.h> #include<stdbool.h> #include <conio.h> #define SNAKESIZE 100 #define MAPWIDTH 118 #define MA

  • 基于C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1.目标要求: 1.上下左右控制蛇头转向2.若蛇头碰到食物,长度加一3.若蛇头碰到边框.碰到自身或蛇回头,游戏结束 2.C语言代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #define interface_x 19//画布行数 #define interface_y

  • C语言实现简单的贪吃蛇游戏的示例代码

    目录 运行效果 代码 一个简单的贪吃蛇游戏本来代码就不多,在保证可读性的情况下,很容易就控制在100以内了. 运行效果 代码 #include <Windows.h> #include <stdio.h> #include <conio.h> #include <time.h> #define PANIC(err) (fprintf(stderr,"PANIC Line %d : %s",__LINE__,err),exit(-1),1)

  • Python实现智能贪吃蛇游戏的示例代码

    目录 前言 基本环境配置 实现效果 实现代码 前言 我想大家都玩过诺基亚上面的贪吃蛇吧,本文将带你一步步用python语言实现一个snake小游戏. 基本环境配置 版本:Python3 系统:Windows 相关模块:pygame pip install pygame安装即可 实现效果 实现代码 import random, pygame, sys from pygame.locals import * import time ''' ''' FPS = 1 ##WINDOWWIDTH = 64

  • Java实现贪吃蛇游戏的示例代码

    目录 项目演示 项目实战 1. 游戏的主启动类 2. 游戏的面板 3. 数据中心 4. 绘制静态面板 5. 绘制静态小蛇 6. 绘制动态小蛇 7. 设置游戏状态 8. 让蛇动起来 9. 绘制食物布局 10. 游戏失败判定 11. 积分获取系统 12. 游戏优化 项目演示 项目演示地址 项目实战 1. 游戏的主启动类 作为贪吃蛇游戏的主启动类,构建了顶级窗口,可以容纳各种面板, package Snake; import javax.swing.*; /** * 游戏的主启动类 */ public

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

  • C语言循环链表实现贪吃蛇游戏

    本文实例为大家分享了C语言表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 总体思想 利用循环链表将一条蛇的坐标进行存储,然后利用gotoxy()函数(可以将光标定位到指定的位置),此时根据蛇的坐标进行输出"@",输出多几个既可以产生一条蛇.通过遍历循环链表进行蛇的移动,对循环链表的插入元素,产生蛇变长的效果.下面为各功能实现的函数 1.贪吃蛇地图函数map() 2.蛇的移动move(),up(),left()等函数 3.产生食物food()和吃到食物eat_food() 4.蛇吃

  • C语言开发实现贪吃蛇游戏

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.最好用VS运行 2.用到的函数有:_kbhit _getch EasyX图形库内一系列函数 3.蛇身与食物用矩形画的 代码如下: #include<stdio.h> #include<graphics.h> //easyx头文件 #include<conio.h> #include<time.h> /********************设置各种属性*************

  • java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; public class Node { private int x; private int y; public Node(int x, int y) { this.x = x; this.y = y; } public Node(){ } public int getX() { return x; }

  • Matlab实现简易纪念碑谷游戏的示例代码

    按上下左右键(↑↓←→)移动物块 按AD键转动视角 游戏效果:如图所示原本无法通过的路径经过视角调整即可通过 完整代码 function maze4 global maze; global GUI; global role; GUI.fig=figure('units','pixels',... 'position',[350 100 500 500],... 'Numbertitle','off',... 'name','maze',... 'Color',[0 0 0],... 'resiz

  • C语言实现猜数字小游戏的示例代码

    目录 一.猜数字小游戏的要求 二.猜数字小游戏实现的过程 2.1项目创建 2.2头文件内容 2.3源文件内容 三.猜数字小游戏调试结果如下 四.基于猜数字小游戏的总结 五.完整代码 一.猜数字小游戏的要求 猜数字小游戏是我们小时候喜欢我们一个经典小游戏,在本文中,猜数字小游戏主要的功能如下所示 1.登入猜数字小游戏系统,显示小时欢迎界面. 2.用户猜的数字有系统随机在1-20之间生成. 3.用户可以有5次机会猜这个随机生成的数字. 4.若用户猜大了,则系统会显示猜大了,并提示还有多少猜数字的机会

随机推荐