C++版贪吃蛇(原创)(限windows)
作者:互联网
这是本人于2021 9 2花费1.5个小时的成果
请勿转载,请勿商用
//本程序属个人劳动成果,如有雷同,纯属巧合(全是手打的,思路也是自己的) #include<bits/stdc++.h> #include<windows.h> #include <conio.h> #define rep(i,l,r) for(int i=l;i<=r;i++) #define lep(i,l,r) for(int i=l;i>=r;i--) using namespace std; inline void gotoxy(int x,int y){ HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(handle,pos); return; } int mp[1000][1000],len=3,now_len; vector<int> x,y; int way,nowx,nowy; int xinx,xiny; int head; bool now_has; char opt; int fx[5]= {0,1,-1,0,0},fy[5]= {0,0,0,-1,1}; void color(int a) {//颜色函数 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a); } bool check_canmove() {//判断是否有路可走 rep(i,1,4) { if(mp[nowx+fx[i]][nowy+fy[i]]!=1)return true; } return false; } void make_map() { //生成地图 memset(mp,0,sizeof(mp)); vector<int> tmpx,tmpy; int vlen=x.size()-1; rep(i,head,vlen){ tmpx.push_back(x[i]); tmpy.push_back(y[i]); } x.clear(),y.clear(); x=tmpx,y=tmpy; mp[xinx][xiny]=2; vlen=x.size()-1; mp[x[0]][y[0]]=8; rep(i,1,vlen-1) { int how; bool l,r,h,u; l=h=r=u=0; if(y[i]<y[i-1])l=1; else if(y[i]>y[i-1])r=1; else if(x[i]>x[i-1])h=1; else u=1; if(y[i]<y[i+1])l=1; else if(y[i]>y[i+1])r=1; else if(x[i]>x[i+1])h=1; else u=1; if(h&&l)how=5; else if(l&&u)how=6; else if(h&&u)how=4; else if(h&&r)how=9; else if(u&&r)how=3; else if(l&&r)how=7; mp[x[i]][y[i]]=how; } mp[x[vlen]][y[vlen]]=1; head=0; } //1:Θ //3:╗ //4:║ //5:╚ //6:╔ //7;═ //9:╝ //8:@ void print_map() {//输出地图 gotoxy(0,0); cout<<"by lize yyd 2021.9.2 8:06~9.37\n"; cout<<"wsad:上下左右\n"; color(648); cout<<"———————————————————————————\n"; rep(i,1,15) { color(648); cout<<"—"; color(7); rep(j,1,25) { if(mp[i][j]==0)color(51),cout<<"■"; color(63); if(mp[i][j]==1)cout<<"Θ"; else if(mp[i][j]>2){ if(mp[i][j]==3)cout<<"╗ "; else if(mp[i][j]==4)cout<<"║ "; else if(mp[i][j]==5)cout<<"╚ "; else if(mp[i][j]==6)cout<<"╔ "; else if(mp[i][j]==7)cout<<"═ "; else if(mp[i][j]==8)cout<<"·"; else cout<<"╝ "; } color(54); if(mp[i][j]==2)cout<<"★"; color(7); } color(648); cout<<"—\n"; } color(648);cout<<"———————————————————————————\n";color(7); cout<<"现在长度:" <<now_len<<endl<<"最长长度:"<<len<<endl<<"吃掉星星:"<<len-3<<endl; } void print_gameover() {//游戏结束 system("cls"); color(4); printf( " _____ __ __ ______ ______ ________ _____ \n" " / ____| /\\ | \\/ | ____| / __ \\ \\ / / ____| __ \\\n" " | | __ / \\ | \\ / | |__ | | | \\ \\ / /| |__ | |__) |\n" " | | |_ | / /\\ \\ | |\\/| | __| | | | |\\ \\/ / | __| | _ / \n" " | |__| |/ ____ \\| | | | |____ | |__| | \\ / | |____| | \\ \\ \n" " \\_____/_/ \\_\\_| |_|______| \\____/ \\/ |______|_| \\_\\\n" ); color(7); exit(0); } void print_win() {//你赢了 system("cls"); color(10); printf( " __ ______ _ _ __ _______ _ _\n" " \\ \\ / / __ \\| | | | \\ \\ / /_ _| \\ | |\n" " \\ \\_/ / | | | | | | \\ \\ /\\ / / | | | \\| |\n" " \\ /| | | | | | | \\ \\/ \\/ / | | | . ` |\n" " | | | |__| | |__| | \\ /\\ / _| |_| |\\ |\n" " |_| \\____/ \\____/ \\/ \\/ |_____|_| \\_|\n" ); color(7); exit(0); } int main() { // system("stty -icanon"); way=rand()%4+1; srand(time(NULL)); nowx=rand()%10+5,nowy=rand()%10+10; x.push_back(nowx),y.push_back(nowy),now_len=1; while(check_canmove()) { srand(time(NULL)); if(!now_has) { do { xinx=rand()%15+1,xiny=rand()%25+1; } while(mp[xinx][xiny]==1||mp[xinx][xiny]>2); mp[xinx][xiny]=2; now_has=true; } if(kbhit()){ opt=_getch(); } if(opt=='w')way=2; if(opt=='s')way=1; if(opt=='d')way=4; if(opt=='a')way=3; nowx+=fx[way],nowy+=fy[way]; if(mp[nowx][nowy]==2)len++,now_has=false; x.push_back(nowx),y.push_back(nowy); if(now_len>=len)head++;else now_len++; if(((nowx!=x[head-1]||nowy!=y[head-1])&&(mp[nowx][nowy]==1||mp[nowx][nowy]>2))||nowx==0||nowy==0||nowx==16||nowy==26)print_gameover(); make_map(); print_map(); Sleep(100); //可以自己调时间,单位ms if(len==15*25)print_win(); } return 0; }
还有一个有点小bug的优化++版本
有些电脑不知道为什么不适用
但也先放上来(同样不能转载,不能商用
//本程序属个人劳动成果,如有雷同,纯属巧合(全是手打的,思路也是自己的) #include<bits/stdc++.h> #include<windows.h> #include <conio.h> #define rep(i,l,r) for(int i=l;i<=r;i++) #define lep(i,l,r) for(int i=l;i>=r;i--) using namespace std; inline void gotoxy(int x,int y) { HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(handle,pos); return; } int mp[1000][1000],len=3,now_len; string x,y; int way,nowx,nowy; int xinx,xiny; int head,mx; bool now_has; char opt,last; int fx[5]= {0,1,-1,0,0},fy[5]= {0,0,0,-1,1}; void color(int a) {//颜色函数 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a); } bool check_canmove() {//判断是否有路可走 rep(i,1,4) { if(mp[nowx+fx[i]][nowy+fy[i]]!=1)return true; } return false; } void make_map() { //生成地图 memset(mp,0,sizeof(mp)); if(head)x.erase(0,1),y.erase(0,1);; int vlen=x.size()-1; mp[xinx][xiny]=2; vlen=x.size()-1; mp[x[0]-'0'][y[0]-'0']=8; rep(i,1,vlen-1) { int how; bool l,r,h,u; l=h=r=u=0; if(y[i]<y[i-1])l=1; else if(y[i]>y[i-1])r=1; else if(x[i]>x[i-1])h=1; else u=1; if(y[i]<y[i+1])l=1; else if(y[i]>y[i+1])r=1; else if(x[i]>x[i+1])h=1; else u=1; if(h&&l)how=5; else if(l&&u)how=6; else if(h&&u)how=4; else if(h&&r)how=9; else if(u&&r)how=3; else if(l&&r)how=7; mp[x[i]-'0'][y[i]-'0']=how; } mp[x[vlen]-'0'][y[vlen]-'0']=1; head=0; } //1:Θ //3:╗ //4:║ //5:╚ //6:╔ //7;═ //9:╝ //8:@ void print_map() {//输出地图 gotoxy(0,0); cout<<"by lize yyd 2021.9.2 8:06~9.37\n"; cout<<"wsad:上下左右\n"; cout<<"r:重开 空格:暂停\n"; color(648); cout<<"———————————————————————————\n"; rep(i,1,15) { color(648); cout<<"—"; color(7); rep(j,1,25) { if(mp[i][j]==0)color(51),cout<<"■"; color(63); if(mp[i][j]==1)cout<<"Θ"; else if(mp[i][j]>2) { if(mp[i][j]==3)cout<<"╗ "; else if(mp[i][j]==4)cout<<"║ "; else if(mp[i][j]==5)cout<<"╚ "; else if(mp[i][j]==6)cout<<"╔ "; else if(mp[i][j]==7)cout<<"═ "; else if(mp[i][j]==8)cout<<"·"; else cout<<"╝ "; } color(54); if(mp[i][j]==2)cout<<"★"; color(7); } color(648); cout<<"—\n"; } color(648); cout<<"———————————————————————————\n"; color(7); cout<<"现在长度:" <<now_len<<endl<<"最长长度:"<<mx<<endl<<"吃掉星星:"<<len-3<<endl; } void print_gameover() {//游戏结束 color(4); gotoxy(55,7),printf(" _____ __ __ ______ ______ ________ _____ \n"); gotoxy(55,8),printf(" / ____| /\\ | \\/ | ____| / __ \\ \\ / / ____| __ \\\n"); gotoxy(55,9),printf(" | | __ / \\ | \\ / | |__ | | | \\ \\ / /| |__ | |__) |\n"); gotoxy(55,10),printf(" | | |_ | / /\\ \\ | |\\/| | __| | | | |\\ \\/ / | __| | _ / \n"); gotoxy(55,11),printf(" | |__| |/ ____ \\| | | | |____ | |__| | \\ / | |____| | \\ \\ \n"); gotoxy(55,12),printf(" \\_____/_/ \\_\\_| |_|______| \\____/ \\/ |______|_| \\_\\\n"); gotoxy(55,14),printf(" 按任意键继续\n"); color(7); while(!kbhit()); char tmpppppp=_getch(); } void print_cls() { //清空 gotoxy(55,7),printf(" \n"); gotoxy(55,8),printf(" \n"); gotoxy(55,9),printf(" \n"); gotoxy(55,10),printf(" \n"); gotoxy(55,11),printf(" \n"); gotoxy(55,12),printf(" \n"); } void print_win() {//你赢了 color(10); gotoxy(55,7),printf(" __ ______ _ _ __ _______ _ _\n"); gotoxy(55,8),printf(" \\ \\ / / __ \\| | | | \\ \\ / /_ _| \\ | |\n"); gotoxy(55,9),printf(" \\ \\_/ / | | | | | | \\ \\ /\\ / / | | | \\| |\n"); gotoxy(55,10),printf(" \\ /| | | | | | | \\ \\/ \\/ / | | | . ` |\n"); gotoxy(55,11),printf(" | | | |__| | |__| | \\ /\\ / _| |_| |\\ |\n"); gotoxy(55,12),printf(" |_| \\____/ \\____/ \\/ \\/ |_____|_| \\_|\n"); gotoxy(55,14),printf(" 按任意键继续\n"); color(7); while(!kbhit()); char tmpppppp=_getch(); } void print_stop() {//游戏暂停 color(4); gotoxy(55,7),printf(" __ \n"); gotoxy(55,8),printf(" _______/ |_ ____ ______ \n"); gotoxy(55,9),printf(" / ___/\\ __\\/ _ \\\\____ \\ \n"); gotoxy(55,10),printf(" \\___ \\ | | ( <_> ) |_> >\n"); gotoxy(55,11),printf("/____ > |__| \\____/| __/ \n"); gotoxy(55,12),printf(" \\/ |__| \n"); color(7); } void init() { system("cls"); printf( " ________.__ __ __ \n" " / _____/| | __ ___/ |__/ |_ ____ ____ ____ __ __ ______\n" " / \\ ___| | | | \\ __\\ __\\/ _ \\ / \\ / _ \\| | \\/ ___/\n" " \\ \\_\\ \\ |_| | /| | | | ( <_> ) | ( <_> ) | /\\___ \\\n" " \\______ /____/____/ |__| |__| \\____/|___| /\\____/|____//____ >\n" " \\/ \\/ \\/\n" " _________ __ \n" " / _____/ ____ _____ | | __ ____ \n" " \\_____ \\ / \\\\__ \\ | |/ // __ \\\n" " / \\ | \\/ __ \\| <\\ ___/\n" " /_______ /___| (____ /__|_ \\\\___ >\n" " \\/ \\/ \\/ \\/ \\/ \n" "\n\n\n" " 按任意键开始\n" ); memset(mp,0,sizeof(mp)); x=y=""; len=3,now_len=0; way=nowx=nowy=0; xinx=xiny=0; head=0; now_has=false; opt='\0',last='\0'; while(!kbhit()); char tmpppppp=_getch(); system("cls"); } int main() { //system("stty -icanon"); chongkai: init(); way=rand()%4+1; srand(time(NULL)); nowx=rand()%10+5,nowy=rand()%10+10; x.push_back(nowx),y.push_back(nowy),now_len=1; while(check_canmove()) { srand(time(NULL)); if(!now_has) { do xinx=rand()%15+1,xiny=rand()%25+1; while(mp[xinx][xiny]==1||mp[xinx][xiny]>2); mp[xinx][xiny]=2; now_has=true; } if(kbhit())opt=_getch(); if(opt==' ') { print_stop(); nospace:; while(!kbhit()); opt=_getch(); if(opt!=' ')goto nospace; opt=last; print_cls(); } if(opt=='r')goto chongkai; if(opt=='w')way=2; if(opt=='s')way=1; if(opt=='d')way=4; if(opt=='a')way=3; last=opt; nowx+=fx[way],nowy+=fy[way]; if(mp[nowx][nowy]==2)len++,now_has=false; x+=(nowx+'0'),y+=(nowy+'0'); if(now_len>=len)head++; else now_len++; mx=max(mx,len); if(((nowx!=x[head-1]||nowy!=y[head-1])&&(mp[nowx][nowy]==1||mp[nowx][nowy]>2))||nowx==0||nowy==0||nowx==16||nowy==26) {print_gameover();goto chongkai;} make_map(); print_map(); Sleep(100); //可以自己调时间,单位ms if(len==15*25){print_win();goto chongkai;} } return 0; }
标签:opt,windows,C++,else,int,贪吃蛇,nowx,mp,nowy 来源: https://www.cnblogs.com/YyD081012/p/16325564.html