Home
Problem
Status
Contest
Workbook
User
Group
Forum
Register
Login
{"managingGroups":{},"author":"tini","updateTime":1714713299000,"title":"贪吃蛇plus","dislikeCnt":0,"content":"```\n#include \u003cwindows.h\u003e\n#include \u003cstdlib.h\u003e\n#include \u003cconio.h\u003e\n#include \u003ctime.h\u003e\n#include \u003ccstring\u003e\n#include \u003ccstdio\u003e\n#include \u003ciostream\u003e\n#define N 22\nusing namespace std;\n\n int gameover;\n\n int x1, y1; // 随机出米\n\n int x,y;\n\n long start;\n\n//\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n//类的实现与应用initialize\n//\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n//下面定义贪吃蛇的坐标类\nclass snake_position\n{\npublic:\n\n int x,y; //x表示行,y表示列\n\n snake_position(){};\n\n void initialize(int \u0026);//坐标初始化\n\n\n};\n\nsnake_position position[(N-2)*(N-2)+1]; //定义贪吃蛇坐标类数组,有(N-2)*(N-2)个坐标\n\nvoid snake_position::initialize(int \u0026j)\n{\n x \u003d 1;\n\n y \u003d j;\n}\n\n\n//下面定义贪吃蛇的棋盘图\n\nclass snake_map\n{\n\nprivate:\n\n char s[N][N];//定义贪吃蛇棋盘,包括墙壁。\n\n int grade, length;\n\n int gamespeed; //前进时间间隔\n\n char direction; // 初始情况下,向右运动\n\n int head,tail;\n\n int score;\n\n bool gameauto;\n\npublic:\n\n snake_map(int h\u003d4,int t\u003d1,int l\u003d4,char d\u003d77,int s\u003d0):length(l),direction(d),head(h),tail(t),score(s){}\n\n void initialize(); //初始化函数\n\n void show_game();\n\n int updata_game();\n\n void setpoint();\n\n void getgrade();\n\n void display();\n\n\n};\n\n//定义初始化函数,将贪吃蛇的棋盘图进行初始化\n\nvoid snake_map::initialize()\n{\n int i,j;\n\n for(i\u003d1;i\u003c\u003d3;i++)\n\n s[1][i] \u003d \u0027*\u0027;\n\n s[1][4] \u003d \u0027#\u0027;\n\n for(i\u003d1;i\u003c\u003dN-2;i++)\n\n for(j\u003d1;j\u003c\u003dN-2;j++)\n\n s[i][j]\u003d\u0027 \u0027; // 初始化贪吃蛇棋盘中间空白部分\n\n for(i\u003d0;i\u003c\u003dN-1;i++)\n\n s[0][i] \u003d s[N-1][i] \u003d \u0027-\u0027; //初始化贪吃蛇棋盘上下墙壁\n\n for(i\u003d1;i\u003c\u003dN-2;i++)\n\n s[i][0] \u003d s[i][N-1] \u003d \u0027|\u0027; //初始化贪吃蛇棋盘左右墙壁\n}\n\n\n//\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n//输出贪吃蛇棋盘信息\n\nvoid snake_map::show_game()\n\n{\n\n system(\"cls\"); // 清屏\n\n int i,j;\n\n cout \u003c\u003c endl;\n\n for(i\u003d0;i\u003cN;i++)\n {\n\n cout \u003c\u003c \u0027\\t\u0027;\n\n for(j\u003d0;j\u003cN;j++)\n\n cout\u003c\u003cs[i][j]\u003c\u003c\u0027 \u0027; // 输出贪吃蛇棋盘\n\n if(i\u003d\u003d2) cout \u003c\u003c \"\\t等级:\" \u003c\u003c grade;\n\n if(i\u003d\u003d6) cout \u003c\u003c \"\\t速度:\" \u003c\u003c gamespeed;\n\n if(i\u003d\u003d10) cout \u003c\u003c \"\\t得分:\" \u003c\u003c score \u003c\u003c \"分\" ;\n\n if(i\u003d\u003d14) cout \u003c\u003c \"\\t暂停:按一下空格键\" ;\n\n if(i\u003d\u003d18) cout \u003c\u003c \"\\t继续:按两下空格键\" ;\n\n cout\u003c\u003cendl;\n }\n}\n\n//输入选择等级\nvoid snake_map::getgrade()\n{\n cin\u003e\u003egrade;\n\n while( grade\u003e7 || grade\u003c1 )\n {\n cout \u003c\u003c \"请输入数字1-7选择等级,输入其他数字无效\" \u003c\u003c endl;\n\n cin \u003e\u003e grade;\n }\n switch(grade)\n {\n case 1: gamespeed \u003d 10;gameauto \u003d 0;break;\n\n case 2: gamespeed \u003d 8;gameauto \u003d 0;break;\n\n case 3: gamespeed \u003d 6;gameauto \u003d 0;break;\n\n case 4: gamespeed \u003d 4;gameauto \u003d 0;break;\n\n case 5: gamespeed \u003d 2;gameauto \u003d 0;break;\n\n case 6: gamespeed \u003d 1;gameauto \u003d 0;break;\n\n case 7: grade \u003d 1;gamespeed \u003d 1000;gameauto \u003d 1;break;\n\n }\n\n}\n\n//输出等级,得分情况以及称号\n\nvoid snake_map::display()\n{\n\n cout \u003c\u003c \"\\n\\t\\t\\t\\t等级:\" \u003c\u003c grade;\n\n cout \u003c\u003c \"\\n\\n\\n\\t\\t\\t\\t速度:\" \u003c\u003c gamespeed;\n\n cout \u003c\u003c \"\\n\\n\\n\\t\\t\\t\\t得分:\" \u003c\u003c score \u003c\u003c \"分\" ;\n\n}\n\n//随机产生米\nvoid snake_map::setpoint()\n{\n srand(time(0));\n\n do\n {\n\n x1 \u003d rand() % (N-2) + 1;\n\n y1 \u003d rand() % (N-2) + 1;\n\n }while(s[x1][y1]!\u003d\u0027 \u0027);\n\n s[x1][y1]\u003d\u0027*\u0027;\n}\n\nchar key;\n\nint snake_map::updata_game()\n{\n gameover \u003d 1;\n\n key \u003d direction;\n\n start \u003d clock();\n\n while((gameover\u003d(clock()-start\u003c\u003dgamespeed))\u0026\u0026!kbhit());\n\n //如果有键按下或时间超过自动前进时间间隔则终止循环\n\n\n\n if(gameover)\n {\n\n getch();\n\n key \u003d getch();\n }\n\n if(key \u003d\u003d \u0027 \u0027)\n\n {\n while(getch()!\u003d\u0027 \u0027){};//这里实现的是按空格键暂停,按空格键继续的功能,但不知为何原因,需要按两下空格才能继续。这是个bug。\n }\n\n else\n\n direction \u003d key;\n\n switch(direction)\n {\n case 72: x\u003d position[head].x-1; y\u003d position[head].y;break; // 向上\n\n case 80: x\u003d position[head].x+1; y\u003d position[head].y;break; // 向下\n\n case 75: x\u003d position[head].x; y\u003d position[head].y-1;break; // 向左\n\n case 77: x\u003d position[head].x; y\u003d position[head].y+1; // 向右\n\n }\n\n if(!(direction\u003d\u003d72||direction\u003d\u003d80||direction\u003d\u003d75 ||direction\u003d\u003d77)) // 按键非方向键\n\n gameover \u003d 0;\n\n else if(x\u003d\u003d0 || x\u003d\u003dN-1 ||y\u003d\u003d0 || y\u003d\u003dN-1) // 碰到墙壁\n\n gameover \u003d 0;\n\n else if(s[x][y]!\u003d\u0027 \u0027\u0026\u0026!(x\u003d\u003dx1\u0026\u0026y\u003d\u003dy1)) // 蛇头碰到蛇身\n\n gameover \u003d 0;\n\n else if(x\u003d\u003dx1 \u0026\u0026 y\u003d\u003dy1)\n\n { // 吃米,长度加1\n\n length ++;\n\n if(length\u003e\u003d8 \u0026\u0026 gameauto)\n\n {\n\n length -\u003d 8;\n\n grade ++;\n\n if(gamespeed\u003e\u003d200)\n\n gamespeed -\u003d 200; // 改变贪吃蛇前进速度\n\n else\n\n gamespeed \u003d 100;\n\n }\n\n s[x][y]\u003d \u0027#\u0027; //更新蛇头\n\n s[position[head].x][position[head].y] \u003d \u0027*\u0027; //吃米后将原先蛇头变为蛇身\n\n head \u003d (head+1) % ( (N-2)*(N-2) ); //取蛇头坐标\n\n position[head].x \u003d x;\n\n position[head].y \u003d y;\n\n show_game();\n\n gameover \u003d 1;\n\n score +\u003d grade*20; //加分\n\n setpoint(); //产生米\n\n }\n\n else\n { // 不吃米\n\n s[position[tail].x][position[tail].y]\u003d\u0027 \u0027;//将蛇尾置空\n\n tail\u003d (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐标\n\n s[position[head].x][position[head].y]\u003d\u0027*\u0027; //将蛇头更为蛇身\n\n head\u003d (head+1) % ( (N-2) * (N-2) );\n\n position[head].x \u003d x;\n\n position[head].y \u003d y;\n\n s[position[head].x][position[head].y]\u003d\u0027#\u0027; //更新蛇头\n\n gameover \u003d 1;\n\n }\n return gameover;\n\n}\n//\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n//主函数部分\n//\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nint main()\n{\n char ctn \u003d \u0027y\u0027;\n\n int nodead;\n\n cout\u003c\u003c\"\\n\\n\\n\\n\\n\\t\\t\\t 欢迎进入贪吃蛇游戏!\"\u003c\u003cendl;//欢迎界面;\n\n cout\u003c\u003c\"\\n\\n\\n\\t\\t\\t 按任意键马上开始。。。\"\u003c\u003cendl;//准备开始;;\n\n getch();\n\n while( ctn\u003d\u003d\u0027y\u0027 )\n {\n system(\"cls\"); // 清屏\n\n snake_map snake;\n\n snake.initialize();\n\n cout \u003c\u003c \"\\n\\n请输入数字选择游戏等级:\" \u003c\u003c endl;\n\n cout \u003c\u003c \"\\n\\n\\n\\t\\t\\t1.等级一:速度 1000 \\n\\n\\t\\t\\t2.等级二:速度 800 \\n\\n\\t\\t\\t3.等级三:速度 600 \";\n\n cout \u003c\u003c \"\\n\\n\\t\\t\\t4.等级四:速度 400 \\n\\n\\t\\t\\t5.等级五:速度 200 \\n\\n\\t\\t\\t6.等级六:速度 100 \\n\\n\\t\\t\\t7.自动升级模式\" \u003c\u003c endl;\n\n snake.getgrade();//获取等级\n\n for(int i\u003d1;i\u003c\u003d4;i++)\n {\n position[i].initialize(i);//初始化坐标\n }\n\n snake.setpoint(); // 产生第一个米\n\n do\n {\n snake.show_game();\n\n nodead \u003d snake.updata_game();\n\n }while(nodead);\n\n system(\"cls\"); //清屏\n\n\n\n cout \u003c\u003c \"\\n\\n\\n\\t\\t\\t\\tGameover!\\n\\n\"\u003c\u003cendl;\n\n snake.display();//输出等级/得分情况\n\n cout \u003c\u003c \"\\n\\n\\n\\t\\t 是否选择继续游戏?输入 y 继续,n 退出\" \u003c\u003c endl;\n\n cin \u003e\u003e ctn;\n\n }\n\n return 0;\n}\n```","threadId":191071,"likeCnt":0,"createTime":1714627836000,"isWorkbook":false,"viewCnt":42,"openness":2,"fav":false,"id":4977,"trustable":false}