贪吃蛇,请问这个代码怎么实现死亡之后能询问是否继续,否退出,是的话重新开始游戏

GuaGuaJinDie 2019-12-05 08:24:45
#include<stdio.h> #include<string.h> #include<windows.h> #include<time.h> #include<conio.h> #define up 'w' #define down 's' #define left 'a' #define right 'd' #define stop 'P' void welcome(); //55开始界面 void Finish(); //291结束界面 void creategraph(); //69围墙打印 void gotoxy(int x, int y); //111光标跳转,横为X 0,1,2.. void gotoprint(int x, int y); //121跳转打印 void gotodelete(int x, int y);//127跳转删除 void createfood(); //133食物产生 int ClickControl(); //157获取键盘信号 int Judge(); //270游戏结束判断 void MovingBody(); //172蛇的移动 void Eatting(); //223蛇吃到东西后的操作(伸长) void ChangeBody(int a, int b); //245蛇的坐标变换,后一个复制前一个STRUCT,a,b为head之前坐标 /*全局变量 + 预处理:*/ typedef struct Snakes { int x; int y; struct Snakes* next; }snake; snake* head, * tail; struct Food { int x; int y; }food; char name[20]; int score = 0; char click = 1; int speed; int main() { system("color 3E"); welcome(); creategraph(); createfood(); if (ClickControl() == 0) return 0; return 0; } void welcome() { gotoxy(15, 10); printf( "); gotoxy(15, 20); printf(" "); gotoxy(20, 13); printf("WELCOME TO THE GAME:贪吃蛇"); gotoxy(14, 16); printf("请在英文输入法中操作,相反方向移动则直接游戏结束,wasd控制,p暂停"); gotoxy(20, 18); printf("你的游戏名(英文):"); scanf_s("%s", &name, 10); system("cls"); } void creategraph() { int i; for (i = 0; i < 58; i += 2)//打印上下边框 { gotoprint(i, 0); gotoprint(i, 26); } for (i = 1; i < 26; i++) { gotoprint(0, i); gotoprint(56, i); } gotoxy(63, 10); printf("你好, %s,你正在玩贪吃蛇", name); gotoxy(63, 15); printf("你的当前得分是:%d ", score); gotoxy(63, 20); head = (snake*)malloc(sizeof(snake)); head->x = 16; head->y = 15; //gotoprint(head->x, head->y); tail = (snake*)malloc(sizeof(snake)); snake* p = (snake*)malloc(sizeof(snake)); snake* q = (snake*)malloc(sizeof(snake)); p->x = 16; p->y = 16; q->x = 16; q->y = 17; head->next = p; p->next = q; q->next = tail; tail->next = NULL; } /**********************************************************/ void gotoxy(int x, int y) { COORD pos; HANDLE hOutput; pos.X = x; pos.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos); } /**********************************************************/ void gotoprint(int x, int y) { gotoxy(x, y); printf(" "); } /**********************************************************/ void gotodelete(int x, int y) { gotoxy(x, y); printf(" "); } /**********************************************************/ void createfood() { srand((int)time(NULL)); lable: food.y = rand() % (25 - 1 + 1) + 1; food.x = rand() % (54 - 2 + 1) + 2; if (food.x % 2 != 0) { food.x = food.x + 1; } snake* judge = head; while (1) //遍历排除蛇身重复 { if (judge->next == NULL) break; if (food.x == judge->x && food.y == judge->y) { goto lable; } judge = judge->next; } gotoxy(food.x, food.y); printf("¥"); } /**********************************************************/ int ClickControl() { char c; while (1) { if (Judge() == 0) return 0; if (_kbhit()) { click = _getch(); } MovingBody(); Eatting(); } return 1; } /**********************************************************/ void MovingBody() { int count = 0; int a = head->x, b = head->y; snake* p = head; //通过先清空后打印实现动画效果 while (1) { if (p->next == NULL) break; gotodelete(p->x, p->y); count++; p = p->next; } switch (click) { case up: head->y -= 1; ChangeBody(a, b); break; case down: head->y += 1; ChangeBody(a, b); break; case left: head->x -= 2; ChangeBody(a, b); break; case right: head->x += 2; ChangeBody(a, b); break; case stop: break; } p = head; while (1) { if (p->next == NULL) break; gotoprint(p->x, p->y); p = p->next; } p = head; gotoxy(0, 28); if (count <= 10) speed = 150; else if (count > 10 && count <= 20) speed = 100; else if (count > 20 && count <= 40) speed = 50; else speed = 10; Sleep(speed); } /**********************************************************/ void Eatting() { if (head->x == food.x && head->y == food.y) { createfood(); snake* _new = (snake*)malloc(sizeof(snake)); snake* p; p = head; while (1) { if (p->next->next == NULL) break; p = p->next; } p->next = _new; _new->next = tail; score += 10; gotoxy(77, 15); printf("%d", score); } } /**********************************************************/ void ChangeBody(int a, int b) { snake* p = head->next; int mid1, mid2, _mid1, _mid2; mid1 = p->x; mid2 = p->y; while (1) { if (p->next->next == NULL) break; _mid1 = p->next->x; _mid2 = p->next->y; p->next->x = mid1; p->next->y = mid2; mid1 = _mid1; mid2 = _mid2; p = p->next; } p = head->next; //if (p->next!= NULL) { p->x = a; p->y = b; } } /**********************************************************/ int Judge() { if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26) { Finish(); return 0; } snake* p = head->next; while (1) { if (p->next == NULL) break; if (head->x == p->x && head->y == p->y) { Finish(); char q; printf("是否继续?y/n"); q = getchar(); if (q == 'y') main(); else if (q == 'n') return 0; } p = p->next; } return 1; } /**********************************************************/ void Finish() { system("cls"); gotoxy(15, 10); printf("····································"); gotoxy(15, 20); printf("····································"); gotoxy(18, 14); printf("游戏结束 下次加油(•w•ଓ)=33"); gotoxy(20, 16); printf("最终得分: %d 挺不错的", score); gotoxy(18, 18); printf("还不错哦, 继续努力(ŏ ﹏ ŏ)"); gotoxy(0, 27); system("pause"); printf(""); }
...全文
118 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧