返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言如何实现贪吃蛇小黑窗
  • 606
分享到

C语言如何实现贪吃蛇小黑窗

2023-06-22 07:06:25 606人浏览 八月长安
摘要

本篇内容主要讲解“C语言如何实现贪吃蛇小黑窗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现贪吃蛇小黑窗”吧!思路:利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态

本篇内容主要讲解“C语言如何实现贪吃蛇小黑窗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现贪吃蛇小黑窗”吧!

思路:

利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态效果。每次移动(清屏)的间隔时间控制了游戏难度,这个时间应不断缩减,直到游戏结束。

需要保存小蛇移动的方向,然后写一个函数通过小蛇的移动方向去处理二维数组中的数据,达到移动小蛇的目的。

小蛇的移动可分解为两个过程:头部像前方生长一格然后尾部消去一格。如果蛇头吃到食物,尾部无需消去,此时应立即随机生成一个新的食物。

游戏开始时小蛇应随机生成在地图某一位置,此时小蛇的默认移动方向也应该是随机的。

5每次移动前应接收玩家由键盘输入的移动方向,如果接收到后,判断合法后将其设为小蛇的默认移动方向,如果玩家未进行任何输入,小蛇应按照默认方向移动。

个人难点:

1.小蛇移动

该函数需要拿到蛇头当时所在的位置坐标和小蛇的移动方向。随后可由蛇头位置往移动方向往前生长一格,即将二维数组中目标移动位置的数据设置为小蛇的数据。消去蛇尾另写一个函数,调用前需先判断是否吃到食物,是否撞到墙壁或者是自身,然后决定是否削去尾部。消去蛇尾需获得蛇尾的位置,所以我们在该函数内加入递归搜索蛇尾的算法:进入函数后先判断此时的位置是否为蛇尾,若不是就将自身位置往后移动一格(将蛇身往后一格的坐标输入给DeleteTail函数,然后继续此过程),直到遇到蛇尾,然后将其消去(置零)。

具体代码实现如下:

int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t){    int ret = 1;//默认前进成功    //printf("trend=%d\n", trend);    switch (trend) {    case 1:*py -= 1; break;//向上    case 2:*px -= 1; break;//向左    case 3:*py += 1; break;//向下    case 4:*px += 1; break;//向右    }//找到即将前进的坐标    if (data[*py][*px] == 6) {        data[*py][*px] = trend;        CreatFood(data);        *t *= 0.9;    }//如果蛇头要前进的格子是食物,向前长一格,尾部不变;    else if (data[*py][*px] == 0) {        data[*py][*px] = trend;//向前长一格        DeleteTail(*px, *py, data);//消去最后的尾巴    }    else {        ret = 0;        printf("前进失败\n");    }//前进失败    return ret;} int DeleteTail(int x, int y, int data[ROW][COL]){    //PrintTest(data);    if (data[y][x] <= 4 && data[y][x] >= 1) {        switch (data[y][x]) {        case 1:            if (DeleteTail(x, y + 1, data) == 0) {                data[y][x] = 0;            }            break;        case 2:            if (DeleteTail(x + 1, y, data) == 0) {                data[y][x] = 0;            }            break;        case 3:            if (DeleteTail(x, y - 1, data) == 0) {                data[y][x] = 0;            }            break;        case 4:            if (DeleteTail(x - 1, y, data) == 0) {                data[y][x] = 0;            }            break;        }        return 1;    }    else {        return 0;    }}

2.输入

在实际代码实现的过程中,我发现scanf函数无法实现需求,理由是程序执行到scanf语句时,会停留在该位置,直到scanf函数扫描到输入后,程序才会继续进行。经学习查阅,决定使用kbhit函数扫描此时键盘缓冲区中是否有数据:如果有就读取第一个数据,并将后面的数据清空,避免后面使用该数据,若没有数据,缓冲区不做任何处理,程序也应当继续执行。

使用kbhit函数前应“#include<coNIO.h>”。清理缓冲区运用的是getch()循环。代码如下:

int Input() {    int trend = 0;    if (kbhit()) {        char trend_ = getch();        while (kbhit()) {            getch();        }//清空缓冲区        //printf("已接收到%c ", trend_);        switch (trend_) {        case 'w':trend = 1; break;        case 'a':trend = 2; break;        case 's':trend = 3; break;        case 'd':trend = 4; break;        default:printf("请输入w,a,s,d以控制前进方向!!\n");            break;        }    }    else {        printf("请输入w,a,s,d以控制前进方向!!\n");    }    return trend;}

完整源代码:

#pragma once#pragma warning(disable : 4996)#include<stdio.h>#include<time.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#define ROW 30#define COL 30#define TIME 300int Game();int Menu();int Input();int CreatHead(int* px, int* py, int data[ROW][COL]);void CreatFood(int data[ROW][COL]);int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t);int DeleteTail(int x, int y, int data[ROW][COL]);void PrintShow(int data[ROW][COL]);int GameOver(int score);void PrintTest(int data[ROW][COL]);
#include"main.h"int main(){    int ret = 1;    while (ret) {        int choose = Menu();        int score = 0;        switch (choose) {        case 1:            score = Game();            ret = GameOver(score);            break;        case 2:            system("cls");            printf("==========================================================\n");            printf("                      游戏说明                            \n");            printf("  1.输入‘w'‘a'‘s'‘d'以控制小蛇的移动。\n");            printf("  2.小蛇在固定时间内只移动一次,如一个时间段内输入多个方向\n则以第一次输入为准。\n");            printf("  3.不能撞到墙壁或者是自身。\n");            printf("  4.小蛇移动速度会在吃到食物后加快,直到游戏结束。\n");            printf("  输入“1”继续...........\n");            printf("==========================================================\n");            int ok = 0;            scanf("%d", &ok);            if (ok) {                system("cls");                break;            }        case 3:            ret = 0;            break;        }    }}
#include"main.h"int Game(){    int data[ROW][COL] = { 0 };    int time_ = TIME;    for (int i = 0; i < COL; i++) {        for (int j = 0; j < ROW; j++) {            if (i == 0 || i == COL - 1) {                data[i][j] = 5;//边界墙            }            if (j == 0 || j == ROW - 1) {                data[i][j] = 5;//边界墙            }        }    }//初始化数据存储数组    //PrintShow(data);    int x = 0, y = 0;    int trend = CreatHead(&x, &y, data);    //生成蛇头    CreatFood(data);//生成食物    int ret = 1;    while (ret) {        system("cls");        PrintShow(data);        Sleep(time_);        int trend_ = Input();        if (trend_ != 0) {            trend = trend_;        }        ret = MoveSnake(trend, &x, &y, data, &time_);    }    int score = 0;    for (int i = 0; i < ROW; i++) {        for (int j = 0; j < COL; j++) {            if (data[i][j] <= 4 && data[i][j] >= 1) {                score++;            }        }    }    return score;}int Menu(){    int choose = 0;    while (1) {        printf("==========================\n");        printf("===欢迎进入贪吃蛇游戏!===\n");        printf("===   1、经典模式      ===\n");        printf("===   2、游戏说明      ===\n");        printf("===   3、退出游戏      ===\n");        printf("=== 请输入您的选项...  ===\n");        printf("==========================\n");        scanf("%d", &choose);        if (choose == 1 || choose == 2 || choose == 3) {            break;        }    }    return choose;}int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t){    int ret = 1;//默认前进成功    //printf("trend=%d\n", trend);    switch (trend) {    case 1:*py -= 1; break;//向上    case 2:*px -= 1; break;//向左    case 3:*py += 1; break;//向下    case 4:*px += 1; break;//向右    }//找到即将前进的坐标    if (data[*py][*px] == 6) {        data[*py][*px] = trend;        CreatFood(data);        *t *= 0.9;    }//如果蛇头要前进的格子是食物,向前长一格,尾部不变;    else if (data[*py][*px] == 0) {        data[*py][*px] = trend;//向前长一格        DeleteTail(*px, *py, data);//消去最后的尾巴    }    else {        ret = 0;        printf("前进失败\n");    }//前进失败    return ret;}void CreatFood(int data[ROW][COL]){    srand(time(NULL));    while (1) {        int x = rand() % (COL - 2) + 1;        int y = rand() % (ROW - 2) + 1;        if (data[y][x] == 0) {            data[y][x] = 6;            break;        }    }} int DeleteTail(int x, int y, int data[ROW][COL]){    //PrintTest(data);    if (data[y][x] <= 4 && data[y][x] >= 1) {        switch (data[y][x]) {        case 1:            if (DeleteTail(x, y + 1, data) == 0) {                data[y][x] = 0;            }            break;        case 2:            if (DeleteTail(x + 1, y, data) == 0) {                data[y][x] = 0;            }            break;        case 3:            if (DeleteTail(x, y - 1, data) == 0) {                data[y][x] = 0;            }            break;        case 4:            if (DeleteTail(x - 1, y, data) == 0) {                data[y][x] = 0;            }            break;        }        return 1;    }    else {        return 0;    }}int Input() {    int trend = 0;    if (kbhit()) {        char trend_ = getch();        while (kbhit()) {            getch();        }//清空缓冲区        //printf("已接收到%c ", trend_);        switch (trend_) {        case 'w':trend = 1; break;        case 'a':trend = 2; break;        case 's':trend = 3; break;        case 'd':trend = 4; break;        default:printf("请输入w,a,s,d以控制前进方向!!\n");            break;        }    }    else {        printf("请输入w,a,s,d以控制前进方向!!\n");    }    return trend;} void PrintShow(int data[ROW][COL]){    for (int i = 0; i < ROW; i++) {        for (int j = 0; j < COL; j++) {            if (data[i][j] == 0) {                printf("  ");            }            if (data[i][j] == 5) {                printf("■");            }            if (data[i][j] >= 1 && data[i][j] <= 4) {                printf("□");            }            if (data[i][j] == 6) {                printf("●");            }        }        printf("\n");    }} int CreatHead(int* px, int* py, int data[ROW][COL]){    srand(time(NULL));    while (1) {        *px = rand() % (COL - 8) + 4;        *py = rand() % (ROW - 8) + 4;        if (data[*py][*px] == 0) {            break;        }    }//蛇头只能刷新在空格位置    //x,y始终为蛇头的坐标    int trend = rand() % 4 + 1;//1:上,2:左,3:下,4:右    data[*py][*px] = trend;    switch (trend) {    case 1:data[*py + 1][*px] = 1;        data[*py + 2][*px] = 1; break;    case 2:data[*py][*px + 1] = 2;        data[*py][*px + 2] = 2; break;    case 3:data[*py - 1][*px] = 3;        data[*py - 2][*px] = 3; break;    case 4:data[*py][*px - 1] = 4;        data[*py][*px - 2] = 4; break;    }    return trend;}void PrintTest(int data[ROW][COL]){    printf("\n");    for (int i = 0; i < ROW; i++) {        for (int j = 0; j < COL; j++) {            printf("%d ", data[i][j]);        }        printf("\n");    }} int GameOver(int score){    system("cls");    printf("==============================================\n");    printf("游戏结束,您的小蛇最终长到了%d米长...\n", score);    printf("输入1重新开始,输入其它退出游戏...\n");    int ret = 0;    scanf("%d", &ret);    if (ret == 1) {        return 1;    }    else {        return 0;    }}

到此,相信大家对“C语言如何实现贪吃蛇小黑窗”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C语言如何实现贪吃蛇小黑窗

本文链接: https://lsjlt.com/news/303482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言实现贪吃蛇小黑窗
    本文实例为大家分享了C语言实现贪吃蛇小黑窗的具体代码,供大家参考,具体内容如下 思路: 1.利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态效果。每次移动(清屏)的...
    99+
    2024-04-02
  • C语言如何实现贪吃蛇小黑窗
    本篇内容主要讲解“C语言如何实现贪吃蛇小黑窗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现贪吃蛇小黑窗”吧!思路:利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态...
    99+
    2023-06-22
  • C语言如何实现贪吃蛇
    本篇内容主要讲解“C语言如何实现贪吃蛇”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现贪吃蛇”吧!一、游戏说明1.1游戏按键说明按方向键上下左右,可以实现蛇移动方向的改变。短时间长按...
    99+
    2023-06-21
  • C语言如何实现贪吃蛇小游戏
    这篇文章给大家分享的是有关C语言如何实现贪吃蛇小游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现功能蛇最开始三节,向右移动。用户可以通过按上下左右来控制蛇的移动,食物随机产生,蛇吃到食物后蛇的身体会变长。蛇...
    99+
    2023-06-15
  • 用C语言实现贪吃蛇小游戏
    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 实现功能 蛇最开始三节,向右移动。用户可以通过按上下左右来控制蛇的移动,食物随机产生,蛇吃到食物后蛇的...
    99+
    2024-04-02
  • Linux下C语言如何实现贪吃蛇小游戏
    本篇内容介绍了“Linux下C语言如何实现贪吃蛇小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!此次贪吃蛇小游戏的目的是使得我在Linu...
    99+
    2023-06-14
  • Linux下C语言实现贪吃蛇小游戏
    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的 心得: 1.自己对linux中如何使用vi更加熟悉 如::wq yy ...
    99+
    2022-06-03
    Linux C语言 贪吃蛇
  • C语言链表实现贪吃蛇小游戏
    本文实例为大家分享了C语言链表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 项目名称: 贪吃蛇小游戏 运行环境: Linux 编程语言: C语言 主要语法: 链表,指针,函数 ...
    99+
    2024-04-02
  • 基于C语言实现贪吃蛇小游戏
    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1.目标要求: 1.上下左右控制蛇头转向2.若蛇头碰到食物,长度加一3.若蛇头碰到边框、碰到自身或蛇回...
    99+
    2024-04-02
  • 使用C语言实现贪吃蛇小游戏
    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 前言 控制台的欢乐就是这么简单; 提示:以下是本篇文章正文内容,下面案例可供参考 一、贪吃蛇实现的结构...
    99+
    2024-04-02
  • C语言实现贪吃蛇小游戏开发
    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 程序介绍 代码 #include<stdafx.h>            //vc自带...
    99+
    2022-11-13
    C语言 贪吃蛇
  • 如何用C语言做贪吃蛇小游戏
    这篇文章主要讲解了“如何用C语言做贪吃蛇小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C语言做贪吃蛇小游戏”吧!C语言作为计算机编程最初学的语言,作为高级语言的C语言,那么它又可...
    99+
    2023-06-16
  • C语言实现简单的贪吃蛇小游戏
    本文实例为大家分享了C语言实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 #温馨提示:以下设计在VS2019下完美运行,完整代码附在末尾,供大家学习参考 (1)游戏进入界面...
    99+
    2024-04-02
  • C语言Easyx实现贪吃蛇详解
    目录一、头文件包含二、创建蛇与食物的结构体三、游戏的初始化四、游戏的绘画事件五、蛇的移动事件六、输入方向******这个方面没什么好解释的大家看代码应该可以看懂。七、生成食物八、吃食...
    99+
    2024-04-02
  • C语言基于EasyX实现贪吃蛇
    本文实例为大家分享了C语言基于EasyX实现贪吃蛇的具体代码,供大家参考,具体内容如下 成品展示: 实现思路: 贪吃蛇的实现思路并不复杂,由于我们需要将数据展示在图形窗口上,因此就...
    99+
    2024-04-02
  • C语言如何实现双人贪吃蛇游戏
    这篇文章给大家分享的是有关C语言如何实现双人贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。  上源代码:&...
    99+
    2023-06-22
  • 如何使用C语言实现贪吃蛇游戏
    小编给大家分享一下如何使用C语言实现贪吃蛇游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、实现效果键位:使用wasd四个键位来控制方向,按q键退出(注意在终...
    99+
    2023-06-29
  • C语言制作贪吃蛇小游戏
    本文实例为大家分享了C语言制作贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 直接上代码 ​#include <stdio.h> #include <stdlib...
    99+
    2024-04-02
  • C#实现贪吃蛇小游戏
    本文实例为大家分享了C#实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 之前一直想写一个贪吃蛇小游戏,上个周末终于有时间做了一个,现在和大家分享。 界面 界面比较简单,一个按钮...
    99+
    2024-04-02
  • 用纯C语言实现贪吃蛇游戏
    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 在读大学生一枚,五一期间用四天时间写一个小游戏。 本贪吃蛇游戏代码共计531行,开发环境是VS,游戏分为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作