贪吃蛇大作战游戏——C语言
是你想要的贪吃蛇吗?
快来看看吧~
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>//宏定义
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4typedef struct snake //链表,存放蛇身坐标
{int x;int y;struct snake *next; //蛇身的下一个节点
}snake;
snake *head = NULL;
snake *food = NULL;int score;
int add = 1;
int direction = RIGHT;
int sleepTime = 300;
int endStatus = 0;int setColor(int c);
int gotoXY(int x, int y);
int printSnake(void);
int welcomeGame(void);
int aboutGame(void);
int printMap(void);
int showScoreTips(void);
int readFile(void);
int initSnake(void);
int randFood(void);
int moveSnake(void);
int moveKeyControl(void);
int speedUp(void);
int isHitWall(void);
int isBiteSelf(void);
int failGameUi(void);
int endGame(void);
int writeFile(int score);
int snakeDestroy(void);int setColor(int c)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);return 0;
} int gotoXY(int x, int y)
{COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);return 0;
} int printSnake(void)
{//清屏system("cls");gotoXY(35, 1);setColor(6);printf("/^\\/^\\"); //蛇眼睛gotoXY(34, 2);printf("|__| O|"); //蛇眼睛gotoXY(33, 2);setColor(2);printf("_");gotoXY(25, 3);setColor(12);printf("\\/"); //蛇信gotoXY(31, 3);setColor(2);printf("/");gotoXY(37, 3);setColor(6);printf(" \\_/"); //蛇眼睛gotoXY(41, 3);setColor(10);printf(" \\");gotoXY(26, 4);setColor(12);printf("\\____"); //舌头gotoXY(32, 4);printf("_________/");gotoXY(31, 4);setColor(2);printf("|");gotoXY(43, 4);setColor(10);printf("\\");gotoXY(32, 5);setColor(2);printf("\\_______"); //蛇嘴gotoXY(44, 5);setColor(10);printf("\\");gotoXY(39, 6);printf("| | \\"); //下面都是画蛇身gotoXY(38, 7);printf("/ / \\");gotoXY(37, 8);printf("/ / \\ \\");gotoXY(35, 9);printf("/ / \\ \\");gotoXY(34, 10);printf("/ / \\ \\");gotoXY(33, 11);printf("/ / _----_ \\ \\");gotoXY(32, 12);printf("/ / _-~ ~-_ | |");gotoXY(31, 13);printf("( ( _-~ _--_ ~-_ _/ |");gotoXY(32, 14);printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");gotoXY(33, 15);printf("~-_ _-~ ~-_ _-~");gotoXY(35, 16);printf("~--______-~ ~-___-~");}int welcomeGame(void)
{int i;int j;int n;printSnake();setColor(11);gotoXY(45, 18);printf("贪 吃 蛇 游 戏");setColor(14); for(i = 20; i <= 26; i++){for (j = 27; j <= 74; j++){gotoXY(j, i);if(i == 20 || i == 26){printf("-");}else if (j == 27 || j == 74){printf("|");} else{printf(" "); } }} //输出菜单 setColor(12);gotoXY(35, 22);printf("1.开始游戏");gotoXY(55, 22);printf("2.游戏说明");gotoXY(35, 24);printf("3.退出游戏"); setColor(3);gotoXY(27, 27);printf("请选择[1 2 3]: [ ]\b\b\b");scanf("%d", &n);getchar(); return n;
}int aboutGame(void)
{int i, j;system("cls");setColor(13);gotoXY(44, 3);printf("游戏说明");setColor(2);for(i=6; i <= 22; i++){for(j = 20; j<=75; j++){gotoXY(j, i);if(i == 6 || i == 22){printf("="); }else if(j == 20 || j == 75){printf("||"); } else {printf(" ");}} }//输出游戏说明界面 setColor(3);gotoXY(30, 8);printf("☆1: 不能穿墙,不能咬到自己");setColor(10);gotoXY(30, 11);printf("☆2: 用↑、↓、←、→控制蛇的移动方向");setColor(14);gotoXY(30, 14);printf("☆3: F1加速,F2减速");setColor(11);gotoXY(30, 17);printf("☆4: 按空格键暂停游戏,再按空格键继续");setColor(4);gotoXY(30, 20);printf("☆5: ESC退出游戏,spece暂停游戏"); gotoXY(20, 24);setColor(12);printf("请按下回车键返回主界面"); return 0;
}int printMap(void)
{int i=0, j=0;system("cls");//一个方块占两列 for(i=0; i<27; i++){for(j=0; j<57; j+=2) {gotoXY(j, i);if(i == 0 || i == 26 || j == 0 || j == 56){setColor(5);printf("□"); }else{setColor(3);printf("■");}}} }int showScoreTips(void)
{int highScore = 0;setColor(11);gotoXY(64, 4);highScore = readFile(); printf("☆最高记录☆: %d", highScore);setColor(14);gotoXY(64, 8);printf("得分: %d", score );setColor(12);gotoXY(72, 11);printf("温 馨 提 示");setColor(6);gotoXY(60, 13);printf("==============================");gotoXY(60, 25);printf("==============================");setColor(3);gotoXY(61, 14);printf("每个食物得分:%d", score);gotoXY(61, 16);printf("不能穿墙,不能咬到自己");gotoXY(61, 18);printf("用↑↓←→分别控制蛇移动方向");gotoXY(61, 20);printf("tip3: F1加速,F2减速");gotoXY(61, 22);printf("space: 暂停游戏");gotoXY(61, 24);printf("ESC: 退出游戏");
}int readFile(void)
{int n = 0; FILE *fp = NULL;//打开文件 fp = fopen("save.txt", "a+");if(NULL == fp){printf("打开文件失败、、、\n");return -1; }fscanf(fp, "%d", &n);fclose(fp);return n;}int initSnake(void)
{int i= 0;snake *new1 = NULL;snake *tmp = NULL;//创建四个蛇节点 for (i = 0; i < 4; i++){ //分配空间 new1 = (snake*)malloc(sizeof(snake));if(NULL == new1){printf("malloc failes...\n");break;}//清零 memset(new1, 0, sizeof(snake));//初始化列为偶数 new1->x = 24 + i * 2;new1->y = 5;//头插法 new1->next = head;head = new1;}tmp = head;while (NULL != tmp){setColor(14);gotoXY(tmp->x, tmp->y);if (head == tmp){printf("◆");}else{printf("★");}//指向下一个节点 tmp = tmp->next;}return 0;
}int randFood(void)
{snake *new2 = NULL;snake *tmp = NULL;//分配空间 new2 = malloc(sizeof(snake));if (NULL == new2){gotoXY(1, 28);printf("malloc failed...\n");return -1;} while (1){ //清零 memset(new2, 0, sizeof(snake));//随机X值 while (1){//随机X值,为偶数 new2->x = rand() % 53 + 2;if (new2->x % 2 == 0){break;}}//1-25new2->y = rand() % 25 + 1;//判断食物不能在蛇身上tmp = head;while (NULL != tmp){if ((tmp->x == new2->x) && ( tmp->y == new2->y)){break;}tmp = tmp->next;}//食物不在蛇身上 if (NULL == tmp){gotoXY(new2->x, new2->y);setColor(12);printf("●");food = new2;break;}else{continue;}}return 0;
}int moveSnake(void)
{snake *new = NULL;snake *tmp = NULL;snake *save = NULL; //保存上一个节点 //分配空间 new = malloc(sizeof(snake));if(NULL == new){printf("malloc failed...\n");return -1; } memset(new, 0, sizeof(snake));//向上 if(direction == UP){new->x = head->x;new->y = head->y-1; }//向下 if(direction == DOWN) {new->x = head->x;new->y = head->y+1; }//向左 if(direction == LEFT){new->x = head->x-2;new->y = head->y; }//向右 if(direction == RIGHT){new->x = head->x+2;new->y = head->y; }//头插法new->next = head;head = new;//使用临时节点指向链表第一个节点tmp = head;//前面是否为食物if(head->x == food->x && head->y == food->y) {while (NULL != tmp){setColor(14);gotoXY(tmp->x, tmp->y);if (tmp == head){printf("◆");}else{printf("★");}//指向下一个节点 tmp = tmp->next;}//吃掉食物后,分数增加score += add;//随机食物randFood(); }else{//删除最后一个节点 while (NULL != tmp->next){setColor(14);gotoXY(tmp->x, tmp->y);if (tmp == head){printf("◆");}else{printf("★");}//保存tmp节点save = tmp; //指向下一个节点 tmp = tmp->next;}gotoXY(tmp->x, tmp->y);setColor(3);printf("■");save->next = NULL;free(tmp);tmp = NULL; } return 0; }int moveKeyControl(void)
{//默认向右 direction = RIGHT;while(1){showScoreTips();if(GetAsyncKeyState(VK_UP) && direction != DOWN){direction = UP;}if(GetAsyncKeyState(VK_DOWN) && direction != UP){direction = DOWN;} if(GetAsyncKeyState(VK_LEFT) && direction != RIGHT){direction = LEFT;}if(GetAsyncKeyState(VK_RIGHT) && direction != LEFT){direction = RIGHT;}if(GetAsyncKeyState(VK_SPACE)){while(1){if(GetAsyncKeyState(VK_SPACE)){break;}Sleep(200);}} if(GetAsyncKeyState(VK_F1)){speedUp();}if(GetAsyncKeyState(VK_F2)){speedDown();}//ESC结束游戏 if(GetAsyncKeyState(VK_ESCAPE)){endStatus = 3;endGame();break;}moveSnake();if(isHitWall() == 1){endStatus = 1;endGame();break;}if(isBiteSelf()){endStatus = 2;endGame();break;}Sleep(sleepTime); } return 0;
} int speedUp(void)
{if(sleepTime > 50){sleepTime -= 50;add +=2; }return 0;
}int speedDown(void)
{if(sleepTime <300){sleepTime += 10;add -=2; }if(sleepTime > 250){add =1; }return 0;
}int isHitWall(void)
{if(head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26){return 1;}return 0;
}int isBiteSelf(void)
{snake *tmp = NULL;tmp = head->next;while(tmp != NULL){if(head->x == tmp->x && head->y == tmp->y){return 1;}tmp = tmp->next; }return 0;
}int failGameUi(void)
{system("cls");int i;gotoXY(46, 2);setColor(6);printf("\\\\\\|///");gotoXY(44, 3);printf("\\\\");setColor(15);gotoXY(47, 3);printf(".-.-");setColor(6);gotoXY(53, 3);printf("//");setColor(14);gotoXY(44, 4);printf("("); //左耳朵setColor(15);gotoXY(47, 4);printf(".@.@");setColor(14);gotoXY(53, 4);printf(")"); //右耳朵 //边框 setColor(11);gotoXY(17, 5);printf("+-----------------");gotoXY(35, 5);setColor(14);printf("o00o");gotoXY(39, 5);setColor(11);printf("----------");gotoXY(48, 5);setColor(14);printf("(_)");gotoXY(51, 5);setColor(11);printf("----------");gotoXY(61, 5);setColor(14);printf("o00o");gotoXY(65, 5);setColor(11);printf("-----------------+");for(i=6; i<20; i++){gotoXY(17, i);printf("|");gotoXY(82, i);printf("|");}gotoXY(17, 20);printf("+----------------------------------");gotoXY(52, 20);setColor(14);printf("☆☆☆");gotoXY(60, 20);setColor(11);printf("----------------------+"); return 0;
} int endGame(void)
{system("cls");//显示失败界面边框 failGameUi(); int highScore=0;int n=0;while(1){gotoXY(38, 9);setColor(12);switch(endStatus){case 1:printf("对不起,您已撞墙,游戏结束!");break;case 2:printf("对不起,您咬到自己,游戏结束!");break;case 3:printf("您已经结束了游戏!");break;default:break; }//显示得分 setColor(13);gotoXY(43, 12);printf("您的得分是:%d", score);//显示最高记录 highScore = readFile();if(score > highScore){setColor(10); gotoXY(38, 16);printf("您已创造新的最高记录!"); writeFile(score);} else{setColor(10);gotoXY(38, 16);printf("继续努力,离最高分还差:%d", highScore - score); }//显示选择菜单setColor(12);gotoXY(25, 23);printf("我要再玩一局----1");gotoXY(52, 23);printf("不玩了,退出----2");setColor(11);gotoXY(46, 25);printf("请选择:[ ]\b\b\b");scanf("%d", &n);getchar();if(n == 1){//回到初始状态 sleepTime = 250;score = 0;add = 1;//销毁蛇节点 snakeDestroy();//初始化头指针 head = NULL;break;}else if(n == 2){exit(0); } else{setColor(12);gotoXY(30, 27);printf("您的输入有误,请重新输入,按下任意键继续");getchar();continue; }}return 0;
}int writeFile(int score)
{FILE *fp = NULL;fp = fopen("save.txt", "w");if(NULL == fp){printf("打开文件失败...\n");return -1; } fprintf(fp, "%d", score);return 0;
}int snakeDestroy(void)
{snake *tmp = NULL;snake *save = NULL;tmp = head;while(NULL != tmp){save = tmp->next;free(tmp);tmp = save; } head = NULL;return 0;
}int main()
{//显示控制台宽高 system("mode con cols=100 lines=30");int n;while(1){system("cls");n = welcomeGame();switch(n){case 1:printMap();showScoreTips();initSnake();randFood();moveKeyControl();break;case 2:aboutGame();break;case 3:exit(0);break;default:;}getchar();}system("pause"); return 0;
}
贪吃蛇大作战游戏——C语言相关推荐
- html5小游戏 typescript,使用TypeScript和Canvas编写移动端贪吃蛇大作战游戏
基本介绍 一款移动端贪吃蛇大作战游戏.(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项目结构.如果你有好 ...
- 【项目实战】轻松实现C/C++大作业:贪吃蛇大作战游戏!
这是一个贪吃蛇大作战类游戏,修改特性为 AI 不互杀: 该程序有四个类:蛇基类 SnakeBase,玩家类 Player,AI 类,Game 类:SnakeBase 和 AI 均继承自 SnakeBa ...
- 面向对象版贪吃蛇大作战游戏创作
贪吃蛇大作战 创作思路: 1.创建蛇头蛇身-----2.让蛇动起来-----3.随机投放食物-----4.吃掉创建的食物------5.判断游戏开始结束 前期准备工作: 创建一个宽1200 高800的 ...
- 贪吃蛇大作战:C语言代码
代码: 代码有点长, #include<stdio.h> #include<Windows.h> #include<time.h> #include<stdl ...
- 贪吃蛇大作战游戏攻略
1.不去人群密集的地方 2.长大之后想要啥就有啥 3.跑马圈地,长大之后,要让身体占据更大的空间 4.不抢食物,头只在身体内运动,只有当外部空间比较大时再进行领土扩张 5.不抢食物,而是要围住食物之后 ...
- Android程序——经典贪吃蛇大作战逆向分析
逆向分析 1. 实现目标 2. 使用工具 3. 实现原理 4. 核心思路 5. 实现过程 1. 实现内购 2.屏蔽游戏下线提醒信息 1. 实现目标 (1)屏蔽经典经典贪吃蛇大作战游戏的过期提醒 (2) ...
- laya游戏开发之贪吃蛇大作战(一)
laya游戏开发之贪吃蛇大作战 一.背景 二.引擎选择 三.整体架构 3.1 玩法分析 3.2 游戏架构 3.3 技术选型 一.背景 需要快速实现一个贪吃蛇的 demo 以验证功能,非传统贪吃蛇玩法, ...
- laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
文章目录 一 功能分析 二 实现方案 1. 代码结构 2. 关键函数实现 2.1 游戏主循环(GameLoop) 2.2 数据层(Model) 2.3 画面绘制层(View) 帧同步的困难与解决方法 ...
- JAVA 实现《贪吃蛇大作战》游戏|CSDN创作打卡
前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长. 本程序是通过java的swing来实现<贪吃 ...
最新文章
- 鸿蒙系统3.0演示,华为鸿蒙系统3.0-华为鸿蒙系统3.0官网申请地址预约 v1.0-优盘手机站...
- 4 RACMulticastConnection 连接类
- [持续更新]UnsatisfiedLinkError常见问题及解决方案
- 人脸识别,现在连动漫角色都不放过
- Web 开发规范 — WSGI
- DNS 流程说明以及相关问题的解析
- C#环境下的钩子详解
- VSCode开发.NETCore项目入门(1)设置中文语言环境
- 63万张!旷视发布最大物体检测数据集Objects365,物体检测竞赛登陆CVPR
- 3D VR卡镜的使用方法
- 2012最新网上购物排行榜
- python编程输入法_用Python写一个拼音输入法
- 创新工场 DeeCamp 2019 人工智能训练营启动报名,计划招收至少 600 名大学生...
- SpringBoot整合Cache缓存技术(二十一)
- 直播APP源码iOS 调用系统铃声震动
- 龙卷风java_程序设计-理解java继承-遁地龙卷风
- 基于SqlServer基本表的插入、修改和删除
- 图像质量评价数据库TID2013 网盘下载
- 测试 软通动力软件测试机试_软通动力软件测试笔试题.doc
- 思科网络安全 第四章考试答案
热门文章
- Python正则表达式模式
- 2021-2022年新版监控量测软件 边坡,基坑,隧道监测系统
- 那些家装巨头为什么都不融资了?
- IBM系列企业云计算产品和服务正式亮相
- 用什么擦地最干净脑筋急转弯_27个有意思的脑筋急转弯(含答案)
- 神经翻译笔记4扩展c. 2017-2019年间RNN和RNN语言模型的新进展
- 在计算机的游戏怎样打开,电脑上那个吃鸡游戏怎么打开 | 手游网游页游攻略大全...
- GIT科普系列5:index in git
- windows cmd cd进入目录无效
- openstack官方安装文档的解析--环境配置篇(1)