/*

*程序名称:贪吃蛇v2.1

*程序描述:一个简易的贪吃蛇小游戏

*版本信息:v2.1

*v1.1版本更新:1:加入菜单选择项

*v1.2版本更新:1:修复菜单选择bug

*v1.3班本更新:1:加入难度选择项

*             2:增加键盘采集频率,大大增加操作灵敏度

*             3:优化屏幕刷新频率,平衡刺眼的情况

*v2.0版本更新:1:使用新的数据存储结构

*             2:使用全新的蛇的形状,更加美观

*             3:解决了1.X版本地图长宽不等距的问题

*v2.1版本更新:1:修复蛇行进过程中快速切换方向至死亡的bug

*             2:屏幕刷新改为蛇每前进一次刷新一次,闪屏更柔和

*             3:更新退出后版本信息的输出

*/

#include

#include

#include

#include

#include

#include

int i;

#define N 25

#define M 22

//结构体名的宏定义

#define STRU_B struct board

//结构体元素part的值定义

#define bBORDER "◆"

#define sHEAD "■"

#define sBODY "◆"

#define sTAIL "◇"

#define bNONE "  "

#define bFOOD "☆"

//结构体元素drection的值定义

#define UP 24

#define DOWN 25

#define RIGHT 26

#define LEFT 27

struct board{

char drection;

char part[4];

};

void print_first(void);

int degree_difficulty(void);

void start(int diff);

void initialise_board(STRU_B(*p)[N]);

void creat_sanke(STRU_B(*p)[N]);

void show_board(STRU_B(*p)[N]);

int move_snake(STRU_B(*p)[N], char drection);

void delete_tail(STRU_B(*p)[N]);

void lose(STRU_B(*p)[N]);

void add_food(STRU_B(*p)[N]);

void print_last();

int main(void)

{

print_first();

do

{

start(degree_difficulty());

printf("1:再来一局\n2:退出\n请选择:");

fflush(stdin);

scanf("%d", &i);

} while (i == 1);

print_last();

return 0;

}

void print_first(void)

{

printf("*************欢迎来到贪吃蛇*************\n\n");

printf("使用键盘上、下、左、右键控制方向\n\n\n");

}

int degree_difficulty(void)

{

int diff;

do

{

printf("\n请选择难度:(1——3):");

scanf("%d", &diff);

switch (diff)

{

case 1:diff = 10; break;

case 2:diff = 6; break;

case 3:diff = 2; break;

default:

break;

}

if (2 <= diff && diff <= 10)

return diff;

printf("\n请输入正确的编号选择难度:(1——3):");

} while (1);

}

void start(int diff)

{

STRU_B board[M][N];

char drection = RIGHT;

int isn_lose = 1, i, dc;

initialise_board(board);

creat_sanke(board);

while (isn_lose)

{

dc = 0;

system("CLS");

show_board(board);

for (i = 0; i < diff; i++)

{

if (GetKeyState(VK_UP) < 0 && drection != DOWN && dc == 0) drection = UP, dc++;

if (GetKeyState(VK_DOWN) < 0 && drection != UP && dc == 0) drection = DOWN, dc++;

if (GetKeyState(VK_LEFT) < 0 && drection != RIGHT && dc == 0) drection = LEFT, dc++;

if (GetKeyState(VK_RIGHT) < 0 && drection != LEFT && dc == 0) drection = RIGHT, dc++;

Sleep(10);

}

isn_lose = move_snake(board, drection);

}

system("CLS");

show_board(board);

}

void initialise_board(STRU_B(*p)[N])

{

int i, j;

for (j = 0; j < N; j++)

strcpy(p[0][j].part , bBORDER);

for (i = 1; i < M - 1; i++)

for (j = 0; j < N; j++)

if (j == 0 || j == (N - 1))

strcpy(p[i][j].part , bBORDER);

else

strcpy(p[i][j].part , bNONE);

for (j = 0; j < N; j++)

strcpy(p[M - 1][j].part , bBORDER);

}

void creat_sanke(STRU_B(*p)[N])

{

p[M / 2][N / 2].drection = RIGHT;

strcpy(p[M / 2][N / 2].part , sHEAD);

p[M / 2][N / 2 - 1].drection = RIGHT;

strcpy(p[M / 2][N / 2 - 1].part , sBODY);

p[M / 2][N / 2 - 2].drection = RIGHT;

strcpy(p[M / 2][N / 2 - 2].part , sTAIL);

add_food(p);

}

void show_board(STRU_B(*p)[N])

{

int i, j;

for (i = 0; i < M; i++)

{

for (j = 0; j < N; j++)

printf("%s", p[i][j].part);

printf("\n");

}

}

int move_snake(STRU_B(*p)[N], char drection)

{

int i, j, NH = 0;

for (i = 0; i < M; i++)

for (j = 0; j < N; j++)

{

if (strcmp(p[i][j].part, bNONE) == 0 || strcmp(p[i][j].part, sBODY) == 0);

else if (strcmp(p[i][j].part , sHEAD) == 0 && NH == 0)

{

p[i][j].drection = drection;

switch (drection)

{

case UP:if (strcmp(p[i - 1][j].part , bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i - 1][j].part , bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i - 1][j] = p[i][j];

break;

case DOWN:if (strcmp(p[i + 1][j].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i + 1][j].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i + 1][j] = p[i][j];

break;

case LEFT:if (strcmp(p[i][j - 1].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i][j - 1].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i][j - 1] = p[i][j];

break;

case RIGHT:if (strcmp(p[i][j + 1].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i][j + 1].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i][j + 1] = p[i][j];

break;

}

strcpy(p[i][j].part, sBODY);

NH++;

}

}

return 1;

}

void delete_tail(STRU_B(*p)[N])

{

int i, j, NT = 0;

for (i = 0; i < M; i++)

for (j = 0; j < N; j++)

if (strcmp(p[i][j].part, sTAIL) == 0 && NT == 0)

{

switch (p[i][j].drection)

{

case UP:strcpy(p[i - 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case DOWN:strcpy(p[i + 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case LEFT:strcpy(p[i][j - 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case RIGHT:strcpy(p[i][j + 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

}

NT++;

}

}

void lose(STRU_B(*p)[N])

{

strcpy(p[M / 2][N / 3].part, "Yo");

strcpy(p[M / 2][N / 3 + 1].part, "u ");

strcpy(p[M / 2][N / 3 + 2].part, "lo");

strcpy(p[M / 2][N / 3 + 3].part, "se");

strcpy(p[M / 2][N / 3 + 4].part, "! ");

}

void add_food(STRU_B(*p)[N])

{

int x, y;

srand(time(0));

x = (rand() % N - 2) + 1;

y = (rand() % M - 2) + 1;

while (strcmp(p[y][x].part, bNONE) != 0)

{

x = (rand() % N - 2) + 1;

y = (rand() % M - 2) + 1;

}

strcpy(p[y][x].part, bFOOD);

}

void print_last()

{

system("CLS");

printf("\n\n\n********************************************************\n");

printf("*                                                      *\n");

printf("*                      贪吃蛇v2.1                      *\n");

printf("*                                                      *\n");

printf("********************************************************\n");

Sleep(1000);

}

c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码相关推荐

  1. python爬虫捕鱼网站_一个简易的爬虫工具,使用Python语言编写,用于zhihu全自动捕鱼...

    简介 这是什么 这是一个简易的爬虫工具,使用Python语言编写,用于zhihu全自动捕鱼,理论上,你可以爬取你感兴趣的任何问题,而不仅仅是小姐姐. 如何使用 编程使用 请确保你的Python版本是3 ...

  2. 【贪吃蛇小游戏】宝塔面板快速搭建贪吃蛇小游戏Web网站 - 无需云服务器

    文章目录 前言 视频教程 1. 环境安装 2. 安装cpolar内网穿透 3. 内网穿透 4. 固定http地址 5. 配置二级子域名 6. 创建一个测试页面 转载自远程内网穿透的文章:Linux使用 ...

  3. JavaGUI简易版贪吃蛇小游戏

    做这个小游戏,主要是学习一下游戏制作的基本逻辑,加深对面向对象的理解. 游戏引擎: /*** 大牛程序员写的游戏的公共类 * 使用Game.init()方法初始化游戏* 使用Game.gameOver ...

  4. Java经典小游戏——贪吃蛇简单实现(附源码)

    文章目录 一.使用知识 二.使用工具 三.开发过程 3.1素材准备 3.2 开发过程 3.2.1 创建项目 3.2.2 页面设计 3.23 画蛇 3.24创建蛇的食物 3.2.5增加蛇的存活状态 3. ...

  5. C语言C++图形库---贪吃蛇大作战【附源码】

    这一节中,我们来做一款经典小游戏,贪吃蛇.先看看最终效果图 在开始之前,我们把窗体创建好. 创建一个800 * 600的窗体.这一次我们使用默认的原点和坐标轴:原点在窗体左上角,X轴正方向向右,Y轴正 ...

  6. c语言小游戏 精简_【原创】用非常简单的c语言自编的一个小游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 修改过后: #include #include void js(int); int qian = 1000; int x = 0; int main() ...

  7. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  8. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...

  9. python贪吃蛇小游戏_python开发贪吃蛇小游戏

    3.概要设计 3.1 程序功能模块 由设计应解决的问题可知,本次的设计是使用用方向键来实现一个简易的贪吃蛇小游戏的程序,具体的功能模块如图3-1所示. 图3-1 程序功能模块 Fig.3-1 prog ...

最新文章

  1. 【模拟退火】解决【TSP】问题
  2. 如何改善虚幻引擎中的游戏线程CPU性能表现
  3. H.264 中很有用的一些概念
  4. Sliverlight MD5
  5. 【Liunx】Linux 系统目录结构
  6. div 重新加载_JS之 加载模糊文本动画
  7. Android Studio 0.1 gradle home的问题
  8. linux系统如何重置密码
  9. USB转双串口产品设计-RS485串口
  10. 为AutoCAD提供可用字体-CAD字体库大全提供下载
  11. android usb 读写权限,Android默认给予USB读写权限,去掉受权对话框
  12. 苹果内购那些事儿(二)
  13. 微信oa服务器,微信oa系统是什么?微信如何与oa系统进行结合?
  14. 突破次元壁垒,让身边的玩偶手办在屏幕上动起来!
  15. ISME:长江流域Comammox Nitrospira的群落、生物地理学和生态驱动者
  16. spss分析 sus量表高低分组
  17. 惠普1005w打印机使用说明书_首款能充粉的打印机来了 惠普1005w一体机评测
  18. 微信小程序vantweapp-Dialog弹出框提交表单,并还原确定按钮样式
  19. 阿里云相关-云服务器ECS
  20. xlc编译mysql库_[Xlcteam](Web)Xlcteam客户留言板

热门文章

  1. 使用AWS Elastic Beanstalk轻松进行Spring Boot部署
  2. 如何在内存序列化中使用Java深克隆对象
  3. Spring Bean范围
  4. 更好的默认NullPointerException消息是否会传入Java?
  5. q7goodies事例_Java 8 Friday Goodies:Lambda和SQL
  6. 休息一下,或者:如何使用Java 12制作出色的拼图游戏
  7. 使用HazelCast进行休眠缓存:JPA缓存基础知识
  8. usb端点轮询_使用Spring Integration轮询http端点
  9. 使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...
  10. Neo4j:特定关系与一般关系+属性