#include<stdio.h>#include<conio.h>//#include<iostream>#include <process.h> #include<stdlib.h>#include<windows.h>#include<time.h>#define framex 2#define framey 2#define wide 40#define high 25\n\nusing namespace std;\n\nint i,j,a[2];\n\n//更改颜色\nint color(int c)\n{\n\tSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色\n\treturn 0;\n}\n\n\n//将光标移动到指定位置 \nvoid gotoxy(HANDLE hout,int x,int y){\n //COORD是WindowsAPI中定义的一种结构,表示一个字符在控制台屏幕上的坐标\n COORD pos;\n pos.X=x;\n pos.Y=y;\n //SetConsoleCursorPosition是API中定位光标位置的函数。\n SetConsoleCursorPosition(hout,pos);\n}\nvoid cover (HANDLE hout);\nvoid explation(HANDLE hout)\n {\n \tint i,j=1;\n \tsystem("cls");\n \tcolor(13);\n \tgotoxy(hout,44,3);\n \tcout << "游戏说明"; \n\t color(2);\n\t for(i=6;i<=22;i++)\n\t {\n\t \tfor(j=20;j<=75;j++)\n\t \t{\n\t \t\tgotoxy(hout,j,i);\n\t \t\tif(i==6||i==22)cout << "="; \n\t \t\telse if(j==20||j==75)cout << "||";\n\t \t}\n\t }\n\t color(3);\n\t gotoxy(hout,25,8);\n\t cout << "1、不能穿墙,不能咬到自己"; \n\t color(10);\n\t gotoxy(hout,25,11);\n\t cout << "2、用 \u25b2(W) \u25bc(S) \u25c0(A) \u25b6(D)分别控制蛇的移动";\n\t color(14);\n\t gotoxy(hout,25,14);\n\t cout << "3、按任意键(除去ESC)暂停游戏,方向键继续";\n\t color(11);\n\t gotoxy(hout,25,17);\n\t cout << "4、ESC:自爆,游戏结束";\n\t color(4);\n\t getch();//按任意键返回主界面\n\t system("cls");\n\t cover (hout); \n }\n\n\n//游戏封面\nvoid cover (HANDLE hout){\n\tgotoxy(hout,35,1);\n \tcolor(6);\n \tprintf("/^/^/");\n \t\n \tgotoxy(hout,34,2);\n \tprintf("|| o|");\n \t\n \tgotoxy(hout,33,2);\n \tcolor(2);\n \tprintf("");\n \t\n \tgotoxy(hout,25,3);\n \tcolor(12);\n \tprintf("\/");\n \t\n \tgotoxy(hout,31,3);\n \tcolor(2);\n \tprintf("/");\n \t\n \tgotoxy(hout,37,3);\n \tcolor(6);\n \tprintf("\/");\n \t\n \tgotoxy(hout,41,3);\n \tcolor(10);\n \tprintf(" \ ");\n \t\n \tgotoxy(hout,26,4);\n \tcolor(12);\n \tprintf("\");\n \t\n \tgotoxy(hout,32,4);\n \tprintf("");\n \t\n \tgotoxy(hout,31,4);\n \tcolor(2);\n \tprintf("|");\n \t\n \tgotoxy(hout,43,4);\n \tcolor(10);\n \tprintf("\ ");\n \t\n \tgotoxy(hout,32,5);\n \tcolor(2);\n \tprintf("\");\n \t\n \tgotoxy(hout,44,5);\n \tcolor(10);\n \tprintf("\ ");\n \t\n \tgotoxy(hout,39,6);\n \tprintf("| | \");\n \t\n \tgotoxy(hout,38,7);\n \tprintf("/ / \");\n \t\n \tgotoxy(hout,37,8);\n \tprintf("/ / \ \");\n \t\n \tgotoxy(hout,35,9);\n \tprintf("/ / \ \");\n \t\n \tgotoxy(hout,34,10);\n \tprintf(" / / \ \");\n \t\n \tgotoxy(hout,33,11);\n \tprintf("/ / ---- \ \");\n \t\n \tgotoxy(hout,32,12);\n \tprintf("/ / -~ ~- | |");\n \t\n \tgotoxy(hout,31,13);\n \tprintf("( ( -~ -- ~- / |");\n \t\n \tgotoxy(hout,32,14);\n \tprintf("\ ~--~ -~ ~- ~--~ /");\n \t\n \tgotoxy(hout,33,15);\n \tprintf("~- -~ ~- -~");\n \t\n \tgotoxy(hout,35,16);\n \tprintf("~---~ ~--~"); \n \n \tcolor(9);\n gotoxy(hout,43,18);\n\tcolor(11);\n\tcout << "贪吃蛇大作战";\n\tcolor(14);\n\tfor(i=20;i<=26;i++){\n\t for(j=27;j<=74;j++)\n\t\t{\n\t \tgotoxy(hout,j,i);\n\t \tif(i==20||i==26)\n\t\t{\n\t \t\tcout << "-";\n\t\t\t}\n\t\t\telse if(j==27||j==74)\n\t\t\t{\n\t\t\t\tcout << "|";\n\t\t\t}\n\t\t}\n\t}\n\tcolor(12);\n\tgotoxy(hout,35,22);\n\tcout << "1.开始游戏";\n\tgotoxy(hout,55,22);\n\tcout << "2.游戏说明";\n\tgotoxy(hout,35,24);\n\tcout << "3.退出游戏";\n\tcolor(9);\n\tgotoxy(hout,framex+wide2,framey+19);\n cout << "姓名:C++小将"; \n gotoxy(hout,framex+wide2,framey+21);\n cout << "来自:可达信奥"; \n gotoxy(hout,framex+wide2,framey+23);\n cout << "完成时间:2023年02月09日";\n gotoxy(hout,29,27);\n\tcolor(3);\n\tprintf("做出你的选择:");\n color(14);\n\tint n;\n\tscanf("%d",&n);\n\tswitch(n){\n\t case 1: \n\t \tsystem("cls");//清屏 \n\t\t break;\n\t case 2:\n\t \t explation(hout);\n\t \t break;\n\t case 3:\n\t \t exit(0);\n\t break;\n\t}\n}\n//定义蛇的结构体 \nstruct Snake{\n int x[100];\n int y[100];\n int speed;\n int length;\n int count;\n int tm1;//开始时间 \n int tm2;//持续时间 \n};\n//定义食物的结构体 \nstruct Food{\n int x;\n int y;\n};\n//制作框架 \nvoid makeframe(struct Snake snake){\n //定义显示器变量句柄 \n HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);\n gotoxy(hout,framex+wide2+5,framey);\n cout << " 贪吃蛇游戏"; \n gotoxy(hout,framex+wide2+5,framey+3);\n cout << "使用方向键或wasd移动";\n gotoxy(hout,framex+wide2+5,framey+5);\n cout << "长按方向键可加速";\n gotoxy(hout,framex+wide2+5,framey+7);\n cout << "按任意键暂停,方向键继续";\n //打印上边框 \n for(i=0;i<wide2+1;i++){\n gotoxy(hout,framex+i,framey);\n cout << "";\n }\n //打印下边框 \n for(i=0;i<wide2+2;i++){\n gotoxy(hout,framex+i,framey+high);\n cout << "";\n }\n //打印左边框 \n for(i=0;i<high;i++){\n gotoxy(hout,framex,framey+i);\n cout << "";\n }\n //打印右边框 \n for(i=0;i<high;i++){\n gotoxy(hout,framex+wide2+1,framey+i);\n cout << "";\n }\n}\n//游戏信息\nvoid infor(HANDLE hout,struct Snake* snake){\n gotoxy(hout,framex+wide2+5,framey+15);\n printf("当前速度:%d",-snake->speed+500);\n gotoxy(hout,framex+wide2+5,framey+17);\n printf("当前得分:%d",snake->count);\n gotoxy(hout,framex+wide2+5,framey+19);\n printf("当前长度:%d",snake->length);\n gotoxy(hout,framex+wide2+5,framey+21);\n snake->tm2=time(NULL);\n snake->tm2-=snake->tm1;\n printf("蛇已经活了:%d秒",snake->tm2);\n}\n//初始化蛇 \nvoid initsnake(struct Snake *snake){\n snake->x[0]=framex+2;\n snake->y[0]=framey+high/2;\n snake->count=0;\n snake->length=3;\n snake->speed=400;\n snake->tm1=time(NULL);\n\t \n //初始化由蛇尾至蛇头的坐标 \n for(i=1;ilength;i++){\n snake->x[i]=snake->x[i-1]+1;\n snake->y[i]=snake->y[i-1];\n }\n}\n//打印蛇 \nvoid printsnake(HANDLE hout ,struct Snake snake){\n for(i=0;ilength;i++){\n gotoxy(hout,snake->x[i],snake->y[i]);\n if(i==snake->length-1) \n cout << "头";\n else if(i==0)\n cout << "尾";\n else \n cout << "身"; \n }\n}\n//移动蛇 \nvoid movesnake(HANDLE hout,struct Snake snake){\n gotoxy(hout,snake->x[0],snake->y[0]);\n //清除蛇尾 \n printf(" ");\n //蛇的后一节坐标变成前一节的坐标 \n for(i=1;ilength;i++){\n snake->x[i-1]=snake->x[i];\n snake->y[i-1]=snake->y[i];\n }\n}\n//打印食物 \nvoid printfood (HANDLE hout,struct Snake snake,struct Food food){\n //用计算机时间获取随机值 \n srand((unsigned)time(NULL));\n while(1){\n //将食物的横纵坐标的大小限定在窗口大小内 \n food->x=rand()%(wide-2)+1;\n food->y=rand()%(high-2)+1;\n //避免食物出现在边框上 \n if(food->x==0&&food->y==0)\n continue;\n //将食物的坐标放置在窗口内 \n food->x=2food->x+framex;\n food->y+=framey;\n //如果食物出现在蛇上,重新产生食物 \n for(i=0;ilength;i++){\n if(food->x==snake->x[i]&&food->y==snake->y[i])\n break;\n }\n //食物不在蛇上,打印食物,结束循环 \n if(i==snake->length){\n gotoxy(hout,food->x,food->y);\n cout << "食";\n break; \n }\n }\n\n}\n//吃食物 \nvoid eatfood(HANDLE hout,struct Snake * snake,struct Food food){\n //如果蛇头的坐标等于食物的坐标 \n if(snake->x[snake->length-1]==food->x&&snake->y[snake->length-1]==food->y){\n //蛇长加一 \n snake->length++;\n //蛇身(不包括蛇尾)整体像前移动一格 \n for(i=snake->length-1;i>0;i--){\n snake->x[i]=snake->x[i-1];\n snake->y[i]=snake->y[i-1];\n }\n //得到蛇尾的坐标(即蛇移动前的蛇尾坐标) \n snake->x[0]=a[0]; \n snake->y[0]=a[1];\n printfood(hout,snake,food);\n snake->count++;\n if(snake->count%3==0)\n snake->speed-=50;\n }\n}\n//死亡判断 \nint ifdead(struct Snake snake){\n //如果碰到左边界 返回0;\n if(snake->x[snake->length-1]==framex)\n return 0;\n //如果碰到右边界 返回0;\n if(snake->x[snake->length-1]==framex+wide2)\n return 0;\n //如果碰到上边界 返回0;\n if(snake->y[snake->length-1]==framey)\n return 0;\n //如果碰到下边界 返回0;\n if(snake->y[snake->length-1]==framey+high)\n return 0;\n //如果碰到自己身体 返回0; \n for(i=0; ilength-1; i++) \n if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] ) \n return 0;\n //否则返回1; \n return 1;\n}\n//开始游戏 \nint main(){\n unsigned char ch =77;\n //定义显示器句柄 \n HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);\n cover(hout);\n struct Snake s, *snake=&s;\n struct Food f, *food=&f;\n initsnake(snake);\n makeframe(*snake);\n printfood(hout,snake,food);\n Sleep(500);\n while(1){\n infor(hout,snake);\n //保存蛇尾横纵坐标 \n a[0]=snake->x[0];\n a[1]=snake->y[0];\n j=0;\n //如果用户敲击键盘\n if(kbhit()){ \n //用ch接收输入 ,注意是getch(),不需敲击回车\n ch=getch();\n if(kbhit()){\n //长按时间\n Sleep(20);\n j=1;\n }\n }\n switch(ch){\n //向上移动 \n case'W':\n case 'w' :\n case 72:{\n movesnake(hout,snake);\n //蛇头纵坐标减一 \n snake->y[snake->length-1]-=1;\n break;\n }\n //向下移动 \n case'S':\n case 's':\n case 80:{\n movesnake(hout,snake);\n //蛇头纵坐标加一 \n snake->y[snake->length-1]+=1;\n break;\n }\n //向左移动 \n case'A':\n case 'a':\n case 75:{\n movesnake(hout,snake);\n //蛇头横坐标减二 \n snake->x[snake->length-1]-=2;\n break;\n }\n //向右移动 \n case'D':\n case 'd':\n case 77:{\n movesnake(hout,snake);\n //蛇头横坐标加二 \n snake->x[snake->length-1]+=2;\n break;\n }\n }\n\n eatfood(hout,snake,food);\n printsnake(hout,snake);\n //如果判断蛇死亡,跳出循环\n if(ifdead(snake)==0||ch==27||snake->speed==0){\n gotoxy(hout,framex+wide/2,framey-2);\n if(snake->speed==0)\n printf("恭喜你通关了!!!");\n else\n printf("糟糕 T_T");\n break;\n }\n\n if(j==0)\n //如果没有长按,蛇滞留的时间为 \n Sleep(snake->speed);\n //如果长按,蛇滞留的时间为 20ms,即加速 \n else \n Sleep(20);\n }\n //跳出循环时 ,滞留死亡场景一段时间\n Sleep(1000);\n //清屏 \n system("cls");\n //显示结束界面 \n if(snake->speed==0) \n printf("\n\n\n\n\n\t\t\t哈哈,你赢了\n\n\t\t\t你得到了满分:24\n\n\n");\n else \n printf("\n\n\n\n\n\t\t\t哈哈,你输了\n\n\t\t\t你的最终得分是:%d\n\n\n",snake->count); \n Sleep(1000);\n system("cls");\n //递归调用main函数,死亡之后回到主界面 \n main();\n return 0; \n

C++ 贪吃蛇游戏代码解析 - 从入门到精通

原文地址: https://www.cveoy.top/t/topic/p9Iw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录