贪吃蛇
来源:互联网 发布:知敬畏守底线心得体会 编辑:程序博客网 时间:2024/04/30 14:43
嗯,这个版本的贪吃蛇用链表实现
创建一个蛇头 连接蛇身(随机初始化整条蛇)
因为在蛇移动的过程中 可以蛇头更新为新到达的位置 蛇尾删除并将原来的链接蛇尾的那节作为新的蛇尾
使用gotoxy进行屏幕的更新操作 避免 system(“cls”)频繁刷新造成的闪屏
具体代码如下
//ILSSWFR#include<iostream>#include<conio.h>#include<cstdlib>#include"windows.h"#include<ctime>using namespace std;int speed[9]={0,500,400,350,300,250,200,150};int speed2[13]={0,400,400,400,300,300,300,200,200,200,150,150};int cc2[13]={0,1,2,3,4,5,6,7,4,5,6,7};int level1[17][27] ,level3[17][27]={{1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1}} ,level2[17][27]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}} ,level4[17][27]={{1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0} ,{1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0} ,{0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0} ,{0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0} ,{0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1} ,{0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0,1} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}} ,level5[17][27]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0} ,{1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0} ,{1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0} ,{1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1} ,{1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1} ,{0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1} ,{0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1} ,{1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1} ,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1}} ,level6[17][27]={{1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ,{1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0} ,{1,0,0,0,0,1,0,0,0,1,0,0,1,1,1,1,0,0,0} ,{1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0} ,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}} ,level7[17][27]={{1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0} ,{0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0} ,{0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0} ,{0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0} ,{0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1} ,{0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1} ,{0,0,0,1,0,0,1,0,0,1,1,1,1,1,0,0,0,0,1} ,{0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1} ,{0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1} ,{0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1} ,{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};int *point[10]={NULL,level1[0],level2[0],level3[0],level4[0],level5[0],level6[0],level7[0]};int p[17][27];//记录蛇身的位置struct snake{ int x; int y; struct snake* next;};void gotoxy(int x, int y){ COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}int rad(int n){ srand(unsigned(time(NULL))); return rand()%n;}struct snake* judge(struct snake* head,char choose )//嗯,这个比俄罗斯方块方便一点,如果不能移动就直接GAMEOVER了{ int a,b; struct snake* s=(struct snake*)malloc(sizeof(struct snake)); if (choose=='w') a=-1,b=0; else if(choose=='s') a=1,b=0; else if (choose=='a') a=0,b=-1; else if (choose=='d') a=0,b=1; s->x=head->x+a; s->y=head->y+b; s->next=head; //system("pause"); if (s->x==0){ if (p[0][s->y]==1||p[10][s->y]==1) return NULL; s->x=9; } if (s->x==10){ if (p[0][s->y]==1||p[10][s->y]==1) return NULL; s->x=1; } if (s->y==0){ if (p[s->x][0]==1||p[s->x][18]==1) return NULL; s->y=17; } if (s->y==18){ if (p[s->x][0]==1||p[s->x][18]==1) return NULL; s->y=1; } if (p[s->x][s->y]==1||p[s->x][s->y]==2) return NULL; return s;}void makeapple()//制造苹果{ int x,y; for (;;){ x=rad(11); y=rad(19); if (!p[x][y]&&x!=0&&x!=10&&y!=0&&y!=18){ p[x][y]=3; gotoxy(y,x); cout<<'$'; return; } }}void moving(struct snake* head,char choose,int* score)//就是删除链表的尾节点,新增一个头节点{ gotoxy(head->y,head->x); cout<<'*'; //system("pause"); if (p[head->x][head->y]==3){ *score+=50; gotoxy(25,3); cout<<*score; makeapple(); return; } p[head->x][head->y]=2; struct snake* s=head,*k; for (;s->next->next!=NULL;) s=s->next; //cout<<"sss"<<endl; // system("pause"); k=s; s=s->next; k->next=NULL; // cout<<"sss"<<endl; //system("pause"); gotoxy(s->y,s->x); if (s->y==0||s->y==18||s->x==0||s->x==10) cout<<'.'; else cout<<' '; gotoxy(k->y,k->x); cout<<'~'; p[s->x][s->y]=0; free(s);}struct snake* makesnake(char *fx)//产生一个在随机位置的蛇,返回蛇头{ int sx,sy,flag=0; int arrow[4]={0,0,0,0};//上0,下1,左2,右3 for (;;){ sx=rad(11); sy=rad(19); if (sx==0||sx==10||sy==0||sy==18) continue; int i; for (i=0;i<5;++i){ if (i+sx>10||p[i+sx][sy]) break; } if (i==5) arrow[1]++,flag=1; for (i=0;i<5;++i){ if (sx-i<0||p[sx-i][sy]) break; } if (i==5) arrow[0]++,flag=1; for (i=0;i<5;++i){ if (sy-i<0||p[sx][sy-i]) break; } if (i==5) arrow[2]++,flag=1; for (i=0;i<5;++i){ if (sy+i>18||p[sx][sy+i]) break; } if (i==5) arrow[3]++,flag=1; if (flag) break; } int k=rad(4),local; for (int i=k;i<4;++i) if (arrow[i]) {local=i;flag=0;break;} for (int i=0;i<k&&flag;++i) if (arrow[i]) {local=i;break;} //找到一个满足存放蛇的长度的地方 struct snake* s,*s1,*s2; s=(struct snake* )malloc(sizeof(struct snake)); s1=(struct snake* )malloc(sizeof(struct snake)); s2=(struct snake* )malloc(sizeof(struct snake)); int a=0,b=0; if (local==0) a=-1,b=0,*fx='s'; if (local==1) a=1,b=0,*fx='w'; if (local==2) a=0,b=-1,*fx='d'; if (local==3) a=0,b=1,*fx='a'; s->x=sx+a; s->y=sy+b; s->next=s1; s1->x=s->x+a; s1->y=s->y+b; s1->next=s2; s2->x=s1->x+a; s2->y=s1->y+b; s2->next=NULL; p[s->x][s->y]=p[s1->x][s1->y]=p[s2->x][s2->y]=2; return s;//返回蛇头}bool findapple()//清{ for (int i=0;i<11;++i) for (int j=0;j<19;++j) if (p[i][j]==3) return true; return false;}void outscreen(struct snake* head){ struct snake* s=head; for (;s->next!=NULL;) s=s->next; for (int i=0;i<11;++i){ for (int j=0;j<19;++j){ if (p[i][j]==1) cout<<'+'; else if (p[i][j]==2){ if (s->x==i&&s->y==j) cout<<'~'; else cout<<'*'; } else if (p[i][j]==3) cout<<'$'; else if (i==0||i==10||j==0||j==18) cout<<'.'; else cout<<' '; } cout<<endl; } gotoxy(20,2); cout<<"分数:"; gotoxy(25,3); cout<<0; gotoxy(20,9); cout<<"1:暂停"; gotoxy(20,10); cout<<"2:退出";}void gamestart(int level,int speeds,int tip,int *re){HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(hOut,&cci);cci.bVisible = FALSE;SetConsoleCursorInfo(hOut,&cci); system("cls"); struct snake* head; for (int i=0;i<11;++i){ for (int j=0;j<19;++j) p[i][j]=*(point[level]+i*27+j); } char choose,record; head=makesnake(&choose); record=choose; double start=clock(),startapple=clock(); makeapple(); int flag=0,score=0; system("cls"); outscreen(head); // system("pause"); for (;!flag;){ while (!kbhit()||!(choose=getch())){ if(int(clock()-start)<speeds) continue; start=clock(); if ((head=judge(head,record))==NULL){ flag=1;break;} moving(head,choose,&score); if(tip&&score>=1000) {*re=3;return;} } if ((choose=='w'&&record=='s')|| (choose=='a'&&record=='d')|| (choose=='s'&&record=='w')|| (choose=='d'&&record=='a')|| (choose!='w'&&choose!='s'&&choose!='a'&&choose!='d')) ; else record=choose; if (choose=='1'){ gotoxy(0,12); system("pause"); gotoxy(0,12); for (int q=0;q<19;++q) cout<<' '; } if (choose=='2'){ system("cls"); *re=1; return; } } system("cls"); cout<<"您获得的分数是:"<<score<<endl; system("pause"); *re=2;}int main(){ for(;;){ system("cls"); cout<<"-----------------------"<<endl; cout<<"| 贪吃蛇 |"<<endl; cout<<"-----------------------"<<endl; cout<<"| |"<<endl; cout<<"| |"<<endl; cout<<"| |"<<endl; cout<<"| 1:开始游戏 |"<<endl; cout<<"| 2:游戏介绍 |"<<endl; cout<<"| 3:退出游戏 |"<<endl; cout<<"| |"<<endl; cout<<"-----------------------"<<endl; char choose; choose=getch(); if (choose=='3') return 0; else if (choose=='2'){ system("cls"); cout<<"传统模式一共有7个关卡,分别对应不同的地图"; cout<<"并且有7个速度等级,玩家自选速度"<<endl<<endl; cout<<"极限模式一共有13个关卡,每关获得1000分后自动升级"<<endl<<endl; cout<<"具体操作如下"<<endl; cout<<"向左:a"<<endl; cout<<"向右:d"<<endl; cout<<"向上:w"<<endl; cout<<"向下:s"<<endl; system("pause"); } else if (choose=='1'){ char user1; system("cls"); cout<<"1:传统模式\n2:极限模式"<<endl; user1=getch(); system("cls"); if (user1=='1'){ cout<<"请选择关卡(1~7):"<<endl; char game=getch(); system("cls"); cout<<"请选择速度(1~7):"<<endl; user1=getch(); int tip=0; gamestart(game-'0',speed[user1-'0'],0,&tip); } else if (user1=='2'){ int j,re=3; for (j=1;j<=11&&re==3;++j){ Sleep(300); gamestart(cc2[j],speed2[j],1,&re); } if(j==12){ system("cls"); cout<<"恭喜您通过所有关卡"<<endl; system("pause"); } } } } return 0;}
0 0
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 贪吃蛇
- 开源爬虫框架各有什么优缺点?
- leetcode:Wildcard Matching
- Redis源码研究—哈希表
- KMP POJ 2752 Seek the Name, Seek the Fame
- 一些关于面向对象的思考
- 贪吃蛇
- 自定义View之刻度盘
- 利用分桶思想实现小范围整数的优先队列
- LinkedList---Delete Node in the Middle of Singly Linked List
- 代理模式
- css hack
- Android自定义布局弹窗
- WCF、WebAPI、WCFREST、WebService之间的区别
- JavaSE学习笔记_10:Java多线程