C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

article/2025/10/26 8:42:17

贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!

贪吃蛇小程序,主要采用C语言描述,采用数组进行数据存储的图形化操作界面,会涉及一点点C++ 知识(特别少的一点点),但是有C语言基础就够用了,编译器:VS2019,会涉及部分库函数的安装及使用,不过也很简单啦!

效果展示:

看到了这个效果之后,那我们就动手来实现吧!

希望大家都能轻松实现这个项目!另外涉及到的#include <graphics.h>需要额外安装图形库插件easyX哦~

代码如下:

#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include "snake.h"int score = 0;
int gamespeed = 100;                //蛇运行速度static void Init(void);             /*图形驱动*/
static void Close(void);            /*图形结束*/
static void Game_interface(void);   /*游戏界面*/
static void GameOver(void);         /*结束游戏*/
static void GamePlay(void);         /*游戏过程*/
static void PrScore(void);          /*输出成绩*//*主函数*/
int main(void)
{Init();                 Game_interface();                 GamePlay();              Close();                 return 0;
}/*图形驱动*/
static void Init(void)
{int gd=9,gm=2;initgraph(&gd,&gm," ");cleardevice();
}/* 开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 */
static void Game_interface(void)
{int i;setcolor(LIGHTCYAN);                           /*setbkcolor(LIGHTGREEN);*/setlinestyle(PS_SOLID,0,1);                    /*设置线型*/for(i=50;i<=600;i+=10)                          /*画边框*/{rectangle(i,40,i+10,49);                   /*上边框*/rectangle(i,451,i+10,460);                 /*下边框*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10);                   /*左边框*/rectangle(601,i,610,i+10);                 /*右边框*/}
}/* 游戏主函数 */
static void GamePlay(void)
{int i;srand(time(NULL));                             /*随机数发生器*/food.yes = 1;                                  /*1表示需要出现新食物,0表示已经存在食物*/snake.life = 0;                                /*活着*/snake.direction = 1;                           /*方向往右*/snake.x[0] = 100;snake.y[0] = 100;                              snake.x[1] = 110;snake.y[1] = 100;snake.node = 2;                                /*节数*/PrScore();                                     /*输出得分*/while(1)                                       /*可以重复玩游戏,压ESC键结束*/{while( !kbhit() )                          /*在没有按键的情况下,蛇自己移动*/{if(food.yes == 1)                      /*需要出现新食物*/{food.x = rand()%400 + 60;food.y = rand()%350 + 60;while(food.x%10 != 0)              /*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/food.x++;while(food.y%10 != 0)food.y++;food.yes = 0;                      /*画面上有食物了*/}if(food.yes == 0)                      /*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x + 10,food.y - 10);}for(i=snake.node-1;i>0;i--)          /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1: snake.x[0] += 10;break;case 2: snake.x[0] -= 10;break;case 3: snake.y[0] -= 10;break;case 4: snake.y[0] += 10;break;}/* 从蛇的第四节开始判断是否撞到自己 */for(i=3;i<snake.node;i++){if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0])){GameOver();                  /*显示失败*/snake.life = 1;break;}}if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455))     /*蛇是否撞到墙壁*/{GameOver();                                            /*本次游戏结束*/snake.life = 1;                                        /*蛇死*/}if(snake.life == 1)                                        /*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if((snake.x[0] == food.x) && (snake.y[0] == food.y))       /*吃到食物以后*/{setcolor(BLACK);                                       /*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node] = -20;snake.y[snake.node] = -20;/* 新的一节先放在看不见的位置,下次循环就取前一节的位置 */snake.node++;                      /*蛇的身体长一节*/food.yes = 1;                      /*画面上需要出现新的食物*/score += 10;PrScore();                         /*输出新得分*/}setcolor(RED);                         /*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);Sleep(gamespeed);setcolor(BLACK);                        /*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);}        /*endwhile(!kbhit)*/if(snake.life == 1)                        /*如果蛇死就跳出循环*/break;key=getch();                          /*接收按键*/if (key == ESC) break;                  /*按ESC键退出*/switch(key){                                 case UP:if(snake.direction != 4)           /*判断是否往相反的方向移动*/snake.direction = 3;break;case RIGHT:if(snake.direction != 2)snake.direction = 1;break;case LEFT:if(snake.direction != 1)snake.direction = 2;break;case DOWN:if(snake.direction != 3)snake.direction = 4;break;}}/*endwhile(1)*/
}/*游戏结束*/
static void GameOver(void)
{cleardevice();PrScore();setcolor(RED);setfont(56,0,"黑体");outtextxy(200,200,"GAME OVER");getch();
}/*输出成绩*/
static void PrScore(void)
{char str[10];setfillstyle(YELLOW);bar(50,15,220,35);setcolor(BROWN);setfont(16,0,"宋体");sprintf(str,"score:%d",score);outtextxy(55,16,str);
}static void Close(void)
{closegraph();
}
​​
#ifndef SNAKE_H
#define SNAKE_H#define LEFT 'a'
#define RIGHT 'd'
#define DOWN 's'
#define UP 'w'
#define ESC 27#define N 200               /*蛇的最大长度*/char key;                   /*控制按键*/struct Food
{int x;                   /*食物的横坐标*/int y;                   /*食物的纵坐标*/int yes;                 /*判断是否要出现食物的变量*/
}food;                        /*食物的结构体*/struct Snake
{int x[N];int y[N];int node;                /*蛇的节数*/int direction;           /*蛇移动方向*/int life;                /* 蛇的生命,0活着,1死亡*/
}snake;#endif​

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

 

 整理分享(学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)


http://chatgpt.dhexx.cn/article/jL6hZjMp.shtml

相关文章

C语言 贪吃蛇

基于C语言编写的贪吃蛇 编写环境&#xff1a;VS2019x86 这是一个基于C语言链表开发的贪吃蛇游戏 其实贪吃蛇游戏要解决的主要问题就是 1、这个游戏的基本组成元素和数据结构 2、如何初始化贪吃蛇并正常行走 3、如何判断事件发生 代码中运用到了键盘虚拟键判断、终端窗口大小的…

游戏贪吃蛇(c语言)

游戏贪吃蛇&#xff08;c语言&#xff09; 一、项目背景二、设计目的三、项目功能需求1、初始化游戏2、控制蛇的运行轨迹3、控制蛇的长度4、控制食物生成5、计算分数6、结束条件 四、系统的功能结构图五、总体设计1、初始化模块2、游戏控制模块3、运行控制模块4、食物生成模块 …

C语言实现贪吃蛇(详细版)

一、需要掌握的知识&#xff1a; C语言基础语法&#xff08;结构体、指针、链表&#xff09;、<windows.h>库、<stdlib.h>库、<time.h>库中的一些函数&#xff08;不需要额外学习&#xff0c;本文后面会讲贪吃蛇需要用到的相关函数&#xff09; 由于作者水平…

贪吃蛇(C语言实现)

文章目录 游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面颜色设置初始化蛇随机生成食物打印蛇与覆盖蛇移动蛇游戏主体逻辑函数执行按键判断得分与结束从文件读取最高分更新最高分到文件主函数 游戏说明 游戏界面当中没有打印相关的按键说明…

SDRAM控制器(初始化)

SDRAM控制器&#xff08;初始化&#xff09; 文章目录 SDRAM控制器&#xff08;初始化&#xff09;初始化模块时序逻辑图代码仿真结果 初始化模块 SDRAM 在上电之后&#xff0c;执行正常操作之前需要被初始化&#xff0c;实际上就是对上文提到的SDRAM 内部逻辑控制单元进行初始…

SDRAM 控制器设计基本完结

项目可以拓展的地方&#xff1a; 1、接口为AXI 2、接口为AXI与AXI DMA 交互 2、优化读写时序&#xff0c;使得SDRAM输出效率最大&#xff1b; 总结&#xff1a; 项目不足&#xff1a;没有进行效率的优化&#xff0c;无地址映射&#xff0c;无外接交互接口&#xff0c;功能单一…

SDRAM读写控制

SDRAM读写控制器&#xff0c;这里分为三个部分&#xff0c;分别是SDRAM的基本操作实现&#xff0c;SDRAM控制器&#xff0c;封装成FIFO,以方便使用。 一、SDRAM的基本操作&#xff1a;初始化模块、自动刷新模块、写操作模块、读操作模块、SDRAM仲裁模块&#xff0c;顶层模块。 …

SDRAM 控制器(二)——初始化模块

1、初始化模块 SDRAM 的初始化是芯片上电后必须进行的一项操作&#xff0c;只有进行了初始化操作的 SDRAM 芯片才可被正常使用。SDRAM 的初始化是一套预先定义好的流程&#xff0c;除此之外的其 他操作会导致 SDRAM 出现不可预知的后果。 初始化时序图&#xff1a; CK&#xf…

SDRAM详细介绍

概念介绍&#xff1a; SDRAM&#xff1a;Synchronous Dynamic Random Access Memory&#xff0c;同步动态随机存储器。同步是指其时钟频率和CPU前端总线的系统时钟相同&#xff0c;并且内部命令的发送与数据的传输都以它为基准&#xff1b;动态是指存储阵列需要不断的刷新来保证…

sdram简易控制器设计

耗时一周&#xff0c;终于完成sdram简易控制器的所有代码设计&#xff0c;其中感谢开源骚客 – 邓堪文老师在b站发布的相关视频学习教材&#xff1b;其中仿真模块及所使用到的sdram仿真文件来源于开源骚客&#xff1b; 因为时间较为紧迫&#xff0c;其中就不做代码的一些注释&…

基于FPGA的SDRAM控制器设计(一)

基于FPGA的SDRAM控制器设计&#xff08;一&#xff09; 1. SDRAM控制器整体框架2.UART_RX模块3.UART_TX模块4. RX与TX模块的整合5.需要注意的问题6.代码7.参考资料 1. SDRAM控制器整体框架 图1.1整体框架 PC端通过串口模块UART_RX发送读写命令以及数据到Cmd_encode模块&#xf…

基于FPGA的SDRAM控制器设计(1)

基于FPGA的SDRAM初始化配置 SDRAM简述SDRAM的引脚及作用SDRAM初始化时序控制SDRAM上电时序代码SDRAM测试模块的代码仿真测试结果参考文献总结 SDRAM简述 SDRAM&#xff08; Synchronous Dynamic Random Access Memory&#xff09;&#xff0c;同步动态随机存储器。同步是指 Me…

FPGA进阶(3):SDRAM读写控制器的设计与验证

文章目录 第50讲&#xff1a;SDRAM读写控制器的设计与验证理论部分设计与实现1. sdram_ctrlsdram_initsdram_a_refsdram_writesdram_readsdram_arbitsdram_ctrl 2. sdram_topfifo_ctrlsdram_top 3. uart_sdramuart_rxuart_txfifo_readuart_sdram 第50讲&#xff1a;SDRAM读写控…

SDRAM

简介、优缺点、历史 1、译为“同步动态随机存取内存”&#xff0c;区别于异步DRAM。SRAM是异步静态存储器。 2、同步(Synchronous)&#xff1a;与通常的异步 DRAM 不同&#xff0c; SDRAM 存在一个同步接口&#xff0c;其工作时钟的时钟频率与对应控制器(CPU/FPGA上的读写控制…

关于SDRAM存储器

一、对SDRAM的初步认识 1.1 什么是SDRAM SDRAM&#xff08;Synchronous Dynamic Random Access Memory&#xff09;&#xff0c;同步动态随机存取存储器。 同步&#xff1a;工作频率与对应控制器的系统时钟频率相同&#xff0c;且内存内部的命令以及数据的传输都以此为基准 …

内存控制器与SDRAM

内存接口概念&#xff1a; 通常ARM芯片内置的内存很少&#xff0c;要运行Linux&#xff0c;需要扩展内存。ARM9扩展内存使用SDRAM内存&#xff0c;ARM11使用 DDR SDRAM。S3C2440通常外接32位64MBytes的SDRAM&#xff0c;采用两片16位32M的SDRAM芯片&#xff0c;SDRAM芯片通过地…

SDRAM驱动篇之简易SDRAM控制器的verilog代码实现

在Kevin写的上一篇博文《SDRAM理论篇之基础知识及操作时序》中&#xff0c;已经把SDRAM工作的基本原理和SDRAM初始化、读、写及自动刷新操作的时序讲清楚了&#xff0c;在这一片博文中&#xff0c;Kevin来根据在上一篇博文中分析的思路来把写一个简单的SDRAM控制器。 我们在上一…

FPGA之SDRAM控制器设计(一)

MT48LC128M4A2 – 32 Meg x 4 x 4 banks是512M SRAM&#xff0c;总体概述如下图 分别从上电初始化&#xff0c;刷新&#xff0c;写&#xff0c;读四个部分进行设计&#xff0c;此外还包含主控状态机&#xff0c;一个顶层。 1&#xff1a;上电初始化 整体架构&#xff1a;从控…

内存控制器与SDRAM【赞】

原文链接&#xff1a;https://blog.csdn.net/qq_31216691/article/details/87115697 内存接口概念&#xff1a; 通常ARM芯片内置的内存很少&#xff0c;要运行Linux&#xff0c;需要扩展内存。ARM9扩展内存使用SDRAM内存&#xff0c;ARM11使用 DDR SDRAM。S3C2440通常外接32位6…

SDRAM 介绍

目录 1、名词解释 2、SDRAM 内部结构 3、SDRAM 外部信号描述 4、SDRAM 命令 4.1、COMMAND INHIBIT 4.2、NO OERATION 4.3、ACTIVE 4.4、LOAD MODE REGISTER (LMR) 4.5、READ 4.6、WRITE 4.7、PRECHARGE 4.8、BURST TERMINATE 4.9、REFRESH 4.9.1、AUTO REFRESH …