文章目录

  • 前引
  • 头文件注释部分
  • 头文件部分
  • 主函数部分
  • 实现效果

前引


这个贪吃蛇是在我学完C语言的基本部分 在跟着哈工大的c语言程序设计Mooc课程完了之后做的 因为学完C语言很迷茫 不晓得应该学什么 学校里面的题库感觉刷起来又没有实际我能看到的东西 我认为在阶段性的学习过程中应该找到自己能够看得到的成果 才能刺激自己继续往前进 继续学习 不然很枯燥的学习谁都坚持不下去

这也是在看了视频教程后 自己一步步敲出来的 其实还是建议大家在看懂 了代码后自己实现 因为不要怕自己忘不忘 这又不是理论知识 敲出来的代码就是自己的 一步步的提升 加油qwq

另外 此代码保证可以运行
在这篇博客发布后一年 我需要用这个交大作业时用的还是这个博客的代码
编译无错 依然能够流畅无阻的运行
主要问题部分集中于头文件部分
详情多看一下头文件注释部分


头文件注释部分


这里是head.h头文件 因为可以使主文件看起来更整洁更清晰
因为我用的是code:blocks 头文件的创建是在File->New->Class中 然后点击创建就ok了 记得如果想看一下这个代码的实现效果 自己也创建头文件名字是head哦 不然头文件名字匹配不了hhhh 或者大家自己把代码一起copy到主程序里面也可以qwq 还有记得要把cpp给取消掉qwq

头文件创建截图


头文件部分


#ifndef HEAD_H
#define HEAD_H
#define SnakeMaxLength 20
typedef int bool;
#define true 1
#define false -1//背景布置
//这里解释一下 一个特殊字符实线格子在横列是占两格
//所以空白格子在圈中要以两倍的间隔空格隔开char MyBackGround[22][80]={  "■■■■■■■■■■■■■■■■■■■■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\t\t\t欢乐时光就要开始了\n","■                                    ■\n","■                                    ■\t\t\tW A S D控制操作\n","■                                    ■\n","■                                    ■\t\t\t碰到墙壁死亡\n","■                                    ■\n","■                                    ■\t\t\t祝好运\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■■■■■■■■■■■■■■■■■■■■\n"};
//这里使用了枚举 为什么这里go_ease = -2 因为这里特殊字符在横向占两格
//数列只占一个格子enum Direction{go_east = -2,go_west = 2,go_north = -1,go_south = 1};
int ArrSnake[SnakeMaxLength][3]={{0,0,0}};//判断蛇默认开始方向
int SnakeDirection = go_east;//判断食物是否还存在
bool OptionFoodAlive = false;
int x,y;
#endif

这里是主函数main.h的实现
里面有音乐播放功能 但只能用WAV文件格式
wav格式的音乐文件甩到你的exe文件旁边
因为用的是相对路径 然后歌名改成1.wav就ok了如果不想改音乐文件的话就把程序中的MyMusic那里1.wav改成你的音乐名字即可


主函数部分


#include <stdio.h>
#include <stdlib.h>
#include <string.h>//使用strncpy函数
#include <conio.h>//_getch()要用
#include <windows.h>//这个是有些函数要用
#include "head.h"//包含头文件
#include <time.h>//随机值懂得奥
#define true 1
#define false -1
typedef int bool;
int scores = 0;//首页
void FirstPage();
//播放音乐
void MyMusic();
//按回车键进入游戏
void EnterGame();
//停止音乐
void StopMusic();
//清空页面
void CleanScreen();
//背景基础函数
void BackGround();
//蛇爹的初始位置
void SetSnakePos();
//画蛇的位置
bool GiveSnake();
//给蛇的位置赋值
void MoveSnake();
//删除蛇
void DeleteSnake();
//控制蛇
void ControlSnake();
//判断蛇是否死亡
bool IsSnakeAlive();
//制造食物
void ProduceFood();
//蛇变长
void LengthenSnake();//首页
void FirstPage()
{printf("\n\n\n\n\n\n");printf("\t\t\t\t\t  《欢迎来到贪吃蛇的世界》\n\n\n");printf("\t\t\t\t\t 《W A S D 控制蛇前进后退》\n\n\n");printf("\t\t\t\t\t 《按下ENTER键开始新游戏》\n\n\n\n");printf("\t\t\t\t\t  《再次感谢游玩此游戏》\n");
}//播放音乐
//这里可以删除功能 不想添加因为删掉就ok了
void MyMusic()
{PlaySound("1.wav",NULL,SND_FILENAME | SND_ASYNC );
}//按回车键进入游戏
void EnterGame()
{while('\r'!=_getch());
}//停止音乐
void StopMusic()
{PlaySound(NULL, 0, 0);
}//清空页面
void CleanScreen()
{system("cls");
}//背景基础函数
//布置背景嗷 头文件里面的背景
void BackGround()
{int i;for(i=0; i<20; i++){printf("%s",MyBackGround[i]);}
}//蛇爹的初始位置
void SetSnakePos()
{//其实这里的x , y我在后面加备注的时候我觉得会错意了//这里的x 我想表示的是他的行数//这里的y 我想表示的是他的列数 就是第几列//如果大家想改程序可以改成//x是rows y是lines即可 我懒我就懒得改了 大家懂的就ok了int x=-1;int y=-1;srand(time(NULL));y = rand()%16+1;//给蛇的位置赋值 默认蛇初始有三个格子x = rand()%16+1;ArrSnake[0][0] = x;ArrSnake[0][1] = y*2;//为什么乘以二呢 因为特殊格子在横向是占两格ArrSnake[0][2] = go_east;ArrSnake[1][0] = x;ArrSnake[1][1] = y*2 + 2;//加二是因为一个字符两个格子ArrSnake[1][2] = go_east;ArrSnake[2][0] = x;ArrSnake[2][1] = y*2 + 4;ArrSnake[2][2] = go_east;
}//画蛇的位置
bool GiveSnake()
{int i;for(i=0; ArrSnake[i][0] != 0;i++){//为什么使用strncpy呢 因为更安全hhhh 可以限制格子数strncpy(&MyBackGround[ArrSnake[i][0]][ArrSnake[i][1]],"■",2);if(i && ArrSnake[0][0] == ArrSnake[i][0] &&  ArrSnake[0][1] == ArrSnake[i][1])   return false;}return true;
}//删除蛇
//为什么要删除蛇呢 因为这个蛇的移动就是一个 赋值 删除 赋值 删除的过程
//删除掉原来的蛇 然后再把现在的蛇表示出来 不然的话
//原来的蛇和现在的蛇就一直重复 导致原来的蛇一直在屏幕上
void DeleteSnake()
{int i;for(i=0; ArrSnake[i][0] != 0;i++){strncpy(&MyBackGround[ArrSnake[i][0]][ArrSnake[i][1]],"  ",2);}
}//蛇的坐标赋值
void MoveSnake()
{int i=SnakeMaxLength-1;ArrSnake[0][2]=SnakeDirection;for(;i>=1;i--){//过滤坐标为0if(0 == ArrSnake[i][0]){continue;}//将上一个物块的值赋值给下一个物块(除蛇头)ArrSnake[i][0]=ArrSnake[i-1][0];ArrSnake[i][1]=ArrSnake[i-1][1];ArrSnake[i][2]=ArrSnake[i-1][2];}//处理蛇头if( go_east == ArrSnake[0][2] || go_west == ArrSnake[0][2]){ArrSnake[0][1]+=ArrSnake[0][2];}else{ArrSnake[0][0]+=ArrSnake[0][2];}
}//控制蛇的方向
//这里是控制蛇的方向
//具体为什么用这个函数 大家可以自急查询一下
//这个Asyn的意思就是 异步的意思 表示你在操作的时候同时读入你键盘的值
//如果是同步的话 大家可以想象一下 需要你敲下回车 蛇才移动 不是嘛hhhh
void ControlSnake()
{if(GetAsyncKeyState('W')){if(SnakeDirection != go_south)SnakeDirection=go_north;}else if(GetAsyncKeyState('S')){if(SnakeDirection != go_north)SnakeDirection=go_south;}else if(GetAsyncKeyState('A')){if(SnakeDirection != go_west)SnakeDirection=go_east;}else if(GetAsyncKeyState('D')){if(SnakeDirection != go_east)SnakeDirection=go_west;}
}//判断蛇是否死亡
bool IsSnakeAlive()
{if(0 == strncmp(&MyBackGround[ArrSnake[0][0]][ArrSnake[0][1]],"■",2)){return false;}else{return true;}
}//制造食物
void ProduceFood()
{//蛇的坐标int i;srand(time(NULL));//蛇的坐标给予if(true == OptionFoodAlive){return;}while(1){bool tempbool = true;x=rand()%18 + 1;y=rand()%18 + 1;for(i=0 ; i<ArrSnake[i][0] ; i++){if(x == ArrSnake[i][0] && 2*y == ArrSnake[i][1]){tempbool = false;break;}}if(true == tempbool){break;}}strncpy(&MyBackGround[x][y*2],"★",2);OptionFoodAlive = true;
}//这里就是加长蛇的长度了
void LengthenSnake()
{int i=0;if(x == ArrSnake[0][0] && 2*y == ArrSnake[0][1]){OptionFoodAlive = false;scores += 10;for(; ;i++){if(ArrSnake[i][0] == 0){if(ArrSnake[i][2] == go_north || ArrSnake[i][2] == go_south){ArrSnake[i][0]=ArrSnake[i-1][0]-ArrSnake[i-1][2];ArrSnake[i][1]=ArrSnake[i-1][1];ArrSnake[i][2]=ArrSnake[i-1][2];}else{ArrSnake[i][0]=ArrSnake[i-1][0];ArrSnake[i][1]=ArrSnake[i][1]-ArrSnake[i][2];ArrSnake[i][2]=ArrSnake[i][2];}break;}}}
}//这里就是主函数具体怎么实现的了
//这个贪吃蛇还包含了重启功能
//这个注释还是挺详细的了 希望能对大家有所帮助 大家一起加油
int main()
{FirstPage();//首页显示MyMusic();//音乐播放EnterGame();//按回车键进入游戏StopMusic();//停止音乐CleanScreen();//清空屏幕(为正式游戏做铺垫)SetSnakePos();//设置蛇的初始坐标while(1){int flag = 0;ProduceFood();//制造食物DeleteSnake();//删除蛇ControlSnake();//控制蛇的移动MoveSnake();//蛇移动图案if(false == IsSnakeAlive()) flag = 1;LengthenSnake();if(false == GiveSnake())    flag = 1;//给予蛇在背景中图案BackGround();//布置背景Sleep(300);system("cls");if(flag){printf("Ur scores = %d\n",scores);printf("Thanks for playing this game!\n");break;}system("pause");}return 0;
}

实现效果


一年后 重新复制本篇博客到
新的文件 codeblocks 本地运行 运行编译正确 运行流畅


c语言贪吃蛇(简易版本含完整代码)相关推荐

  1. 【机器视觉案例】(12) 自制AI视觉小游戏--贪吃蛇,附python完整代码

    各位同学好,今天和大家分享一下如何使用 mediapipe+opencv 自制贪吃蛇小游戏.先放张图看效果. 规则:食指指尖控制蛇头,指尖每接触到黄色方块,计数加一,蛇身变长,方块随机切换位置.如果指 ...

  2. C语言-学生成绩管理系统 【含完整 代码】

    目录 1.系统功能分析 1.1系统信息要求 1.2功能分析 1.3奖学金评选标准 2.系统设计 3.运行效果图 4.测试数据: 5.文件说明: 6.源代码 1.系统功能分析 1.1系统信息要求 1)学 ...

  3. c语言贪吃蛇小游戏的简易实现

    命令行界面通过打印字符实现了贪吃蛇游戏的基本功能 代码仅130行 实现原理为,采用链式单调数列在矩阵地图中储存为蛇的坐标信息. //贪吃蛇的实现原理在于,将蛇在矩阵中的点表示为正数,并且由蛇尾到蛇头是 ...

  4. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  5. 贪吃蛇简易版(C++)

    导航 下一篇:贪吃蛇升级版(C++) 目录 一. 贪吃蛇简易版的实现 1. 贪吃蛇如何存储? 2. 贪吃蛇如何移动? 3. 食物如何生成? 4. 如何判断游戏结束? 二. 贪吃蛇简易版的优化 1. 添 ...

  6. 完整版C语言贪吃蛇代码

    C语言贪吃蛇完整代码 #include <stdio.h> #include <stdlib.h> #include <Windows.h>//windows编程头 ...

  7. 贪吃蛇统计分数的c语言代码,C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!...

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  8. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  9. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  10. c语言五子棋代码_基于控制台的C语言贪吃蛇

    相信对很多人来说,学完C语言以后,都会找一些小程序来练练手.例如贪吃蛇.五子棋.俄罗斯方块等等. 今天给大家分享一个基于控制台的C语言贪吃蛇小程序. 基础知识要求:C语言基础. 知识点补充 这里写一些 ...

最新文章

  1. CentOS5.8 RHCS配置
  2. PyTorch教程(十二):链式法则
  3. es6 dsl与sql对比
  4. 2012年7月份第4周51Aspx源码发布详情
  5. ajaxGet 获取封装
  6. 【BZOJ1003】【codevs1655】物流运输,最短路+DP
  7. 企业服务器上病房床号修改,关于医院病房安放陪护床(共享陪护床)申请报告...
  8. python获取网站window全局对象或方法的返回值
  9. 记录:网络通信协议中的TCP/IP与UDP
  10. 拥抱.NET Core,如何开发一个跨平台类库 (1)
  11. MFC中给对话框重绘边框
  12. OpenSSL学习(二十二):基础-指令sess_id
  13. NYOJ 156 Hangover
  14. 350.两个数组的交集II
  15. 华三计算机网络笔试题,软考网络工程师试题
  16. 使用测温软件EVEREST和鲁大师的一些总结
  17. 【windows8开发】开发平台与开发框架
  18. Ubuntu 16.04下安装Caffe解决 undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
  19. 如何配置高性能的计算机,笔记本电脑如何设置电源计划为高性能
  20. git提示CRLF will be replaced by LF问题及解决

热门文章

  1. zul页面报org.xml.sax.SAXParseException
  2. STM32F103C8T6单片机简介
  3. vfpodbc.dll下载, 各版本下载,包含所有版本
  4. 暴风影音2009开机启动关闭方法
  5. 国际国家代号mysql_最全的各国 语言(文化)代码与国家地区对照表(国际通用标准形式)...
  6. YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介
  7. 2022电大国家开放大学网上形考任务-中华文化概说非免费(非答案)
  8. Java实现Excel导入和导出,看这一篇就够了(珍藏版)
  9. Git教程(快速上手,超详细)
  10. 论文阅读 || 图像分类系列 —— DenseNet(很详细)