点击蓝字

关注我们

该程序已经在VS2019上验证过了,可以直接运行。
程序目录
程序里就只有一个test.cpp文件,也就是说大家可以先创建工程,然后直

运行效果

C语言学习资源汇总【最新版】

源码

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<conio.h>
constexpr auto maphigh = 28, mapwide = 84;
struct virus
{
int x;
int y;
}virus;
unsigned short snakesize = 50, speed = 300, len = 4;
struct snake
{
int x[50];
int y[50];
int len;//蛇的长度
int speed;//蛇的速度
}snake;
int key = 'w';//初始化方向
void gotoxy(int x, int y);
void drawmap();
void keydown();
void creatvirus();
int snakestatus();
void startgame();
int menuselect();
void goodbye();
void introduce();
void edition();
int setup();
void respect();
int setup1();
int modifydiffculty();
void diffculty();
int customize();
void customize1();
int main()
{
for (;;){system("cls");//清屏
switch (menuselect()){
case 1://开始游戏startgame();
break;
case 2://介绍introduce();
break;
case 3://版本edition();
break;
case 4://设置setup1();
break;
case 5:goodbye();
return 0;
default:
break;}}
}
void drawmap()//1.画地图
{
//⊙:病毒    █:蛇身(占用两个字符)srand((unsigned int)time(NULL));//随机病毒出现的位置
int i, k;
for (i = 0; i <= maphigh; i++){gotoxy(0, i);
printf("█");//打印左边框gotoxy(mapwide, i);
printf("█");//打印右边框}
for (i = 0; i <= mapwide; i += 2)//+=2因为 █占两个字节{gotoxy(i, 0);
printf("█");//打印下边框gotoxy(i, maphigh);
printf("█");//打印上边框}
//画蛇snake.len = len;snake.speed = speed;
//初始化蛇的位置snake.x[0] = mapwide / 2;snake.y[0] = maphigh / 2;//[0]为蛇头的位置
//画蛇头gotoxy(snake.x[0], snake.y[0]);
printf("█");
//画蛇身
for (k = 1; k < snake.len; k++){snake.x[k] = snake.x[k - 1] + 2;snake.y[k] = snake.y[k - 1];gotoxy(snake.x[k], snake.y[k]);
printf("█");}
while (1){virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
if (virus.x % 2 == 0)
break;}gotoxy(virus.x, virus.y);
printf("⊙");gotoxy(mapwide + 4, maphigh);
printf("⊙:%d", snakesize - snake.len);
}
void creatvirus()//2.产生病毒
{
if (snake.x[0] == virus.x && snake.y[0] == virus.y){
//printf("\a");//声音snake.len++;srand((unsigned)time(NULL));
while (1){
int flag = 1;virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
//产生的病毒不能在蛇的身上
for (int k = 0; k < snake.len; k++){
if (snake.x[k] == virus.x && snake.y[k] == virus.y){flag = 0;//virus不合适的标志
break;}}
if (flag == 1 && virus.x % 2 == 0)//病毒位置合法且x坐标为偶数{//x左右是以两个字节为单位运动的,若virus的x坐标为奇数,就不存在snake.x[k] == virus.x
break;}}}gotoxy(virus.x, virus.y);
printf("⊙");gotoxy(mapwide + 8, 0);//将光标移走
printf("W");gotoxy(mapwide + 6, 1);
printf("A S D \t进行控制");gotoxy(mapwide + 4, maphigh);
printf("⊙:%d", snakesize - snake.len);
}
void keydown()//3.按键
{
int i, temp;
if (_kbhit()) //kbhit函数检查当前是否有键盘输入,若有则返回一个非0值,否则返回0{fflush(stdin);// 清空输入缓冲区,通常是为了确保不影响后面的数据读取temp = _getch();//getch:从控制台读取一个字符,但不显示在屏幕上
if ((temp == 'a' || temp == 'A') && (key != 'D' && key != 'd'))//解决了按反方向键蛇自杀的问题{key = temp;}
if ((temp == 'w' || temp == 'W') && (key != 's' && key != 'S')){key = temp;}
if ((temp == 's' || temp == 'S') && (key != 'W' && key != 'w')){key = temp;}
if ((temp == 'D' || temp == 'd') && (key != 'a' && key != 'A')){key = temp;}}
//擦除最后一节gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf("  ");
for (i = snake.len - 1; i > 0; i--){snake.x[i] = snake.x[i - 1];//以前1的位置现在变成了2,0变成了1snake.y[i] = snake.y[i - 1];}
switch (key)//最后一节已经擦出,前移后0,1位置重合,左上角坐标为0,0{
case'w':
case'W':snake.y[0]--;
break;
case's':
case'S':snake.y[0]++;
break;
case'a':
case'A':snake.x[0] -= 2;
break;
case'd':
case'D':snake.x[0] += 2;
break;}gotoxy(snake.x[0], snake.y[0]);
printf("█");gotoxy(mapwide + 2, 0);//将光标移走
}
int snakestatus()//4.蛇的状态
{
if ((snake.x[0] == 0 || snake.x[0] == mapwide) || (snake.y[0] == 0 || snake.y[0] == maphigh))
return 0;
for (int k = 1; k < snake.len; k++){
if (snake.x[0] == snake.x[k] && snake.y[0] == snake.y[k])
return 0;}
return 1;
}
void gotoxy(int x, int y)
{//1.找到控制台这个窗口HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
/*HANDLE为句柄  ↑得到(输出窗口的)句柄。Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。*/
//2.设置光标COORD coord;
/*COORD 为Windows.h中自带函数原型大体为struct _coord{short x;short y;}coord;*/coord.X = x;coord.Y = y;
//4.同步到控制台SetConsoleCursorPositionSetConsoleCursorPosition(handle, coord);//定位到handle这个窗口,把光标打在coord坐标
}
void startgame()
{system("cls");drawmap();
while (1){creatvirus();keydown();Sleep(snake.speed);//void sleep(int seconds)自带函数参数 seconds 为要暂停的毫秒数。
if (!snakestatus())//判断死亡时snakestaus为0,{gotoxy(mapwide / 2, maphigh / 2);
printf("Game Over");getchar();getchar();
break;}
if (snake.len == snakesize){gotoxy(mapwide / 3, maphigh / 2);
printf("恭喜您消灭了全部病毒,胜利(^-^)V");getchar();respect();
break;}}
}
int menuselect()
{
char number;
int a;
printf("\n\n\t\t\t\t\t\t1.开始游戏\n");
printf("\n\t\t\t\t\t\t2.游戏介绍\n");
printf("\n\t\t\t\t\t\t3.游戏版本\n");
printf("\n\t\t\t\t\t\t4.设置\n");
printf("\n\t\t\t\t\t\t5.退出游戏\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){number = getchar();a = (int)number - 48;
if (number <= '5' && number >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void goodbye()
{system("cls");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色gotoxy(0, 12);
printf("\t\t\t\t\t\t谢谢使用!再见!\n");getchar();getchar();
}
void respect()
{system("cls");gotoxy(0, 4);
printf("\t\t*在此向全国的医护人员表示敬意*\n\n");Sleep(1000);
printf("\t\t*感谢他们的默默付出*\n\n");Sleep(1000);
printf("\t\t*感谢他们对抗击疫情做出的贡献*\n\n");Sleep(1000);
printf("\t\t*此致*\n\n");
printf("\t\t*                      敬礼 *\n\n");Sleep(2000);getchar();
}
void introduce()
{system("cls");gotoxy(0, 4);
printf("\t\t\t\t        游戏规则           \n\n");
printf("\t\t\t\t2020年新冠病毒肆虐,威胁着人类\n\n");
printf("\t\t\t\t玩家将控制蛇消灭随机出现的病毒⊙\n\n");
printf("\t\t\t\t消灭所有病毒即可获得胜利。\n\n");
printf("\n\n\n\n\n");
printf("\t\t\t\t\tEnter返回主菜单");getchar();getchar();
}
void edition()
{system("cls");gotoxy(0, 4);
printf("\t\t\t\t*********************************************\n\n");
printf("\t\t\t\t*               欢         迎               *\n\n");
printf("\t\t\t\t*                版本号:1.2               *\n\n");
printf("\t\t\t\t*        更新:1.修复了反方向自杀的问题     *\n\n");
printf("\t\t\t\t*              2.修复了蛇吃墙的问题         *\n\n");
printf("\t\t\t\t*              3.新增了菜单与设置功能       *\n\n");
printf("\t\t\t\t*              4.修改了部分整形变量节省空间 *\n\n");
printf("\t\t\t\t*********************************************\n\n");
printf("\t\t\t\t\tEnter返回主菜单");getchar();getchar();
}
int setup()
{
//system("color 6f"); //第一个为背景色,第二个为字体颜色
/*0 = 黑色       8 = 灰色1 = 蓝色       9 = 淡蓝色2 = 绿色       A = 淡绿色3 = 湖蓝色     B = 淡浅绿色4 = 红色       C = 淡红色5 = 紫色       D = 淡紫色6 = 黄色       E = 淡黄色7 = 白色       F = 亮白色*/
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.修改难度\n");
printf("\n\t\t\t\t\t\t2.自义定设置\n");
printf("\n\t\t\t\t\t\t3.颜色设置\n");
printf("\n\t\t\t\t\t\t4.音效设置\n");
printf("\n\t\t\t\t\t\t5.返回\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '5' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
int setup1()
{
switch (setup()){
case 1:diffculty();
break;
case 2:customize1();
break;
default:
break;}
return 0;
}
int modifydiffculty()
{
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.简单\n");
printf("\n\t\t\t\t\t\t2.普通\n");
printf("\n\t\t\t\t\t\t3.困难\n");
printf("\n\t\t\t\t\t\t4.修罗地狱\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '4' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void diffculty()
{
switch (modifydiffculty()){
case 1:len = 4;speed = 500;snakesize = 10;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 2:len = 4;speed = 300;snakesize = 25;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 3:len = 4;speed = 70;snakesize = 50;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
case 4:len = 4;speed = 25;snakesize = 70;system("cls");gotoxy(8, 8);
printf("\t\t\t\t\t\t 修改成功!\n");
printf("\t\t\t\t\t\t \n");system("pause");
break;
default:
break;}
}
int customize()
{
char s;
int a;system("cls");
printf("\n\n\t\t\t\t\t\t1.自定义速度\n");
printf("\n\t\t\t\t\t\t2.自定义初始长度\n");
printf("\n\t\t\t\t\t\t请选择(数字)");
while (1){s = getchar();a = (int)s - 48;
if (s <= '2' && s >= '1')
return a;
printf("\n\t\t\t\t\t\t\t      ");}
}
void customize1()
{
int s;
switch (customize()){
case 1://自定义速度system("cls");gotoxy(8, 8);
printf("\t\t\t\t请输入速度(1-999)");scanf_s("%d", &s);speed = (1000 - s);
break;
case 2:system("cls");gotoxy(8, 8);
printf("\t\t\t\t请输入初始长度:");scanf_s("%d", &s);len = s;
break;
default:
break;}
}

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

戳“阅读原文”我们一起进步

C语言贪吃蛇小游戏 | 源码相关推荐

  1. 学生学python编程---实现贪吃蛇小游戏+源码

    学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...

  2. 【180928】美女贪吃蛇小游戏源码

    本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...

  3. 贪吃蛇小游戏源码分享

    创建2个文件夹,一个是放源码还有一个文件夹是发图片的. 然后创建三个实体类. package com.Bubbles.snake; import javax.swing.*; import java. ...

  4. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  5. 贪吃蛇小游戏源码再回顾

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. 带看板娘玩法指导的贪吃蛇小游戏源码

    介绍: 左下角带看板娘插件,给玩家实时提示和介绍游戏玩法. 上下左右控制方向,数字0暂停,E加速,Q 减速,回车自动/手动切换. 网盘下载地址: http://kekewl.org/bJSm3CqBo ...

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

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

  8. 再来一次的C语言贪吃蛇小游戏(三)

    8.游戏的不同界面 为了便于实现主要功能,之前我们所有的状态控制都是放在游戏中,但实际上我们应该把这些状态控制抽离出来,通过菜单来控制,以便在不同游戏界面间切换. 菜单界面 游戏界面 排行榜 游戏结束 ...

  9. 再来一次的C语言贪吃蛇小游戏(二)

    5.游戏地图 贪吃蛇的游戏地图由一个个方格组成,每一格方格可以表示地面,墙,食物,蛇的身体等等,蛇只能在地面上行动,吃到食物则生长一节蛇身,撞到墙就GG. 我们可以同样可以使用枚举来表示地图上的不同物 ...

  10. linux贪吃蛇c语言代码,C语言贪吃蛇讲解及源码

    { set_cursor_position(0, i); printf("■"); set_cursor_position(N+2, i); printf("■" ...

最新文章

  1. Python之基础知识
  2. flutter git 拉不起来_「干货」Flutter开发环境配置备忘录
  3. matlab将求解sin隐式解,Matlab隐式符号方程求解和赋值
  4. 【身边的经济学】节约打印用纸
  5. python 下载图片的集中方法
  6. C\C++网络编程总结
  7. Android 控件布局常用属性
  8. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化
  9. 量化信噪比 非均匀量化_键摄基础1:为什么要正确曝光/ADC精度和量化噪声
  10. 计算机的视觉应用研究,计算机视觉技术应用研究.doc
  11. ESP32 开发笔记(十一)使用 ESP32 做为 WebServer
  12. 开发者从应用程序商店难以赚到真金白银
  13. 微信小程序 JavaScript(JS)字符串转gbk(无需下载,无需积分)
  14. atmega128 单片机 密码锁 PROTEUS 仿真
  15. 引入阿里icon库的方法(font-class 引用)
  16. 关于python里面xlwt操作excel文件的时候去掉页眉页脚
  17. Wamp安装教程(Windows Apache Mysql PHP集成安装环境)
  18. 已知函数fx=sin(wx+φ)_考点13 y=sin(wx+φ)的图像与性质(解析版)
  19. 微信小程序的运营策略六大技巧
  20. 学计算机能用到的礼物,考上大学送什么礼物好,盘点10款有趣的

热门文章

  1. 【手写】数据库关系代数练习题
  2. Spring boot 开发 GA/T1400 协议之注册、保活、注销、校时功能
  3. FlightGear命令行参数
  4. Android学习视频Mars-Android开发视频教程(全集)
  5. 【C++程序设计实践】实验十一
  6. [转] 暴风影音被挂马 已有28000网民遭侵袭
  7. (转载)关注——软件界首例 暴风影音宣布召回1.2亿播放器软件
  8. the road to TCPIP(1)--TCPIP详解--数据链路层
  9. 【NeatUpload】大附件上传配置文件
  10. 天翼云虚拟IP地址及其在高可用集群中的应用