1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【c语言大作业】c语言编写贪吃蛇

【c语言大作业】c语言编写贪吃蛇

时间:2023-10-04 10:47:29

相关推荐

【c语言大作业】c语言编写贪吃蛇

#include <stdio.h>#include <time.h>#include <windows.h>#include <stdlib.h>#define U 1#define D 2#define L 3 #define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右typedef struct SNAKE //蛇身的一个节点{int x;int y;struct SNAKE* next;}snake;//全局变量//int score = 0, add = 10;//总得分与每次吃食物得分。int status, sleeptime = 200;//每次运行的时间间隔snake* head, * food;//蛇头指针,食物指针snake* q;//遍历蛇的时候用到的指针int endgamestatus = 0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。//声明全部函数//void Pos();void creatMap();void initsnake();int biteself();void createfood();void cantcrosswall();void snakemove();void pause();void gamecircle();void welcometogame();void endgame();void gamestart();void replay();void choose();void Pos(int x, int y)//设置光标位置{COORD pos;HANDLE hOutput;pos.X = x;pos.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);}void creatMap()//创建地图{int i;for (i = 0; i < 58; i += 2)//打印上下边框{Pos(i, 0);printf("■");Pos(i, 26);printf("■");}for (i = 1; i < 26; i++)//打印左右边框{Pos(0, i);printf("■");Pos(56, i);printf("■");}}void initsnake()//初始化蛇身{snake* tail;int i;tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//tail->x = 24;tail->y = 5;tail->next = NULL;for (i = 1; i <= 4; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 24 + 2 * i;head->y = 5;tail = head;}while (tail != NULL)//从头到尾,输出蛇身{Pos(tail->x, tail->y);printf("■");tail = tail->next;}}int biteself()//判断是否咬到了自己{snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y){return 1;}self = self->next;}return 0;}void createfood()//随机出现食物{snake* food_1;srand((unsigned)time(NULL));food_1 = (snake*)malloc(sizeof(snake));while ((food_1->x % 2) != 0) //保证其为偶数,使得食物能与蛇头对其{food_1->x = rand() % 52 + 2;}food_1->y = rand() % 24 + 1;q = head;while (q->next == NULL){if (q->x == food_1->x && q->y == food_1->y) //判断蛇身是否与食物重合{free(food_1);createfood();}q = q->next;}Pos(food_1->x, food_1->y);food = food_1;printf("■");}void cantcrosswall()//不能穿墙{if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26){endgamestatus = 1;endgame();}}//反复调用此函数// 函数协作//说明:无论蛇是否吃到食物 蛇身都会延长void snakemove()//蛇前进,上U,下D,左L,右R{snake* nexthead;//定义蛇头下一个位置结构化指针 关联函数:struct snakecantcrosswall();//不能撞墙 关联函数:cantcrosswall()nexthead = (snake*)malloc(sizeof(snake));//为蛇头的下一个位置变量申请内存 使用了window.h的sizeofif (status == U)//向上移动 关联函数:游戏控制 键入w返回值为1{//正常移动nexthead->x = head->x;nexthead->y = head->y - 1;//蛇头的下一个位置y坐标+1 if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物//蛇头时时刻刻在判断前方是否有食物//原理:蛇头的下一个位置坐标与食物的坐标重合{nexthead->next = head;//新的蛇头的下一个位置成为了旧的nexthead的下一个坐标head = nexthead;//旧的nexthead成为了新的蛇头q = head;//蛇头&蛇身的遍及 q指针指向了新蛇头while (q != NULL)//开始打印蛇身 q指针向后指 直到q指针的指向为空 停止打印{Pos(q->x, q->y);//使用了window.h中的posprintf("■");//打印蛇头蛇身q = q->next;}score = score + add;//比分相加 关联函数:游戏控制中的比分createfood();//继续创建食物 关联函数:createfood()}else//如果没有食物{nexthead->next = head;head = nexthead;q = head;//以上程序与前一个原理相同while (q->next->next != NULL)//打印蛇身直到q指针指向为空 停止打印 会多打印一节蛇身//解决方法:将最后一节蛇身打印为空白{Pos(q->x, q->y);printf("■");//打印蛇身q = q->next;}Pos(q->next->x, q->next->y);//指向多打印的一节蛇身printf(" ");//将其打印为空白free(q->next);//释放内存q->next = NULL;//q指针置空}}//以下程序原理与上述相同if (status == D)//向下移动{nexthead->x = head->x;nexthead->y = head->y + 1;if (nexthead->x == food->x && nexthead->y == food->y) //有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf(" ");free(q->next);q->next = NULL;}}if (status == L)//向左移动{nexthead->x = head->x - 2;//考虑到屏幕宽度 一次移动2个格nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf(" ");free(q->next);q->next = NULL;}}if (status == R)//向右移动{nexthead->x = head->x + 2;nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf(" ");free(q->next);q->next = NULL;}}if (biteself() == 1) //判断是否会咬到自己{endgamestatus = 2;//对于游戏死亡结果的判断 关联函数:endcircle();endgame();}}void pause()//暂停{while (1){Sleep(300);if (GetAsyncKeyState(VK_SPACE)){break;}}}void gamecircle()//控制游戏 {Pos(64, 15);printf("不能穿墙,不能咬到自己\n");Pos(64, 16);printf("用↑.↓.←.→分别控制蛇的移动.");Pos(64, 17);printf("F1 为加速,F2 为减速\n");Pos(64, 18);printf("ESC :退出游戏.space:暂停游戏.");status = R;while (1){Pos(64, 10);printf("得分:%d ", score);Pos(64, 11);printf("每个食物得分:%d分", add);if (GetAsyncKeyState(VK_UP) && status != D){status = U;}else if (GetAsyncKeyState(VK_DOWN) && status != U){status = D;}else if (GetAsyncKeyState(VK_LEFT) && status != R){status = L;}else if (GetAsyncKeyState(VK_RIGHT) && status != L){status = R;}else if (GetAsyncKeyState(VK_SPACE)){pause();}else if (GetAsyncKeyState(VK_ESCAPE)){endgamestatus = 3;break;}else if (GetAsyncKeyState(VK_F1)){if (sleeptime >= 50){sleeptime = sleeptime - 30;add = add + 2;if (sleeptime == 320){add = 2;//防止减到1之后再加回来有错}}}else if (GetAsyncKeyState(VK_F2)){if (sleeptime < 350){sleeptime = sleeptime + 30;add = add - 2;if (sleeptime == 350){add = 1; //保证最低分为1}}}Sleep(sleeptime);snakemove();}}void choose(){printf("*******************************\n");printf(" \n");printf("贪吃蛇\n");printf("\n");printf(" 1.开始游戏\n");printf(" 2.游戏说明\n");printf(" 3.开发人员\n");printf(" 4.退出游戏\n");printf("\n");printf("*******************************\n");int s;printf("请输入1~4,开始你的游戏:");scanf_s("%d", &s);if (s == 1){system("cls");creatMap();initsnake();createfood();}else if (s == 2){system("cls");printf("*******************************\n");printf(" 游戏规则\n");printf("开始的时候你将扮演一条小蛇,通过↑↓←→控制蛇的方向,\n");printf("且不懂沿着相反方向移动,在地图中寻找吃的食物\n");printf("每次吃一口身体就会增长一格,小心不要撞到墙壁!\n");printf("祝你好运!\n");printf("*******************************\n");printf("\n");printf("请输入1,放回主界面:\n");int t;scanf_s("%d", &t);if (t == 1){system("cls");choose();}else{system("cls");printf("error!\n");choose();}}else if (s == 3){system("cls");printf("*******************************\n");printf(" 开发人员列表\n");printf(" 赵宸\n");printf("*******************************\n");printf("请输入1,放回主界面:\n");int r;scanf_s("%d", &r);if (r == 1){system("cls");choose();}else{system("cls");printf("error!\n");choose();}}else if (s == 4) {exit(0);}else{system("cls");printf("error!\n");choose();}}void endgame()//结束游戏{system("cls");Pos(24, 12);if (endgamestatus == 1){printf("对不起,您撞到墙了。游戏结束.");}else if (endgamestatus == 2){printf("对不起,您咬到自己了。游戏结束.");}else if (endgamestatus == 3){printf("您的已经结束了游戏。");}Pos(24, 13);printf("您的得分是%d\n", score);replay();}void replay() //重新玩的程序 {system("cls");printf("您的得分是%d\n", score);printf("你是否要重新尝试该游戏?\n");printf("输入1:重新开始游戏;输入2:退出游戏\n");printf("请在此输入:");int t;scanf_s("%d", &t);if (t == 1){system("cls");score = 0;sleeptime = 200;status = 0;choose();}else if (t == 2){exit(0);}else {system("cls");printf("error!");replay();}}void gamestart()//游戏初始化{system("mode con cols=100 lines=30");choose();}int main(){gamestart();gamecircle();endgame();return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。