33,311
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <windows.h>#include <time.h>typedef struct node{int x;int y;struct node *next;}node,*linklist;typedef struct{linklist front;linklist rear;int length;}line;line snake;void coord(int x,int y){COORD num;num.X=y;num.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), num);}void show_food()//随机化食物位置{ linklist p; srand(time(NULL));//随机种子 while(1){ snake.front->x = rand() %13+2; snake.front->y = rand() %27+2; p = snake.front->next; //防止食物出现在蛇内部 while(p){ if(snake.front->x == p->x && snake.front->y == p->y){ break; } else{p=p->next;} } if( !p){ break; } } coord(snake.front->x,snake.front->y); putchar('@');//食物}void game_imformation()//显示游戏信息{ coord(3,60); printf("当前蛇长度: %d",snake.length); coord(5,60); printf(" "); coord(5,60); printf("离胜利还差: %d",20-snake.length); coord(10,55); puts("上,下,左,右:w,s,a,d");}void in_line(int x,int y)//入队{linklist p;p=(linklist)malloc(sizeof(node));p->x=x;p->y=y;snake.rear->next = p;snake.rear=p;p->next=NULL;snake.length++;}void out_line()//出队{linklist p=snake.front;p->next->x=p->x;p->next->y=p->y;snake.front=snake.front->next;snake.length--;free(p);}void destroy_queue()//销毁队列{ linklist p; while(p = snake.front){ snake.front = snake.front->next; free(p); }}void snake_shape()//初始化蛇{int i;snake.rear=snake.front=(linklist)malloc(sizeof(node));snake.rear->next=NULL;snake.length=0;for(i=0;i<3;i++){in_line(2,i+4);}}void draw_snake(int i)//画蛇{linklist p;p=snake.rear;coord(p->x,p->y);if(i){ putchar('*'); }else{ putchar('@'); }}void clear_snake_tail(){linklist p = snake.front->next;coord(p->x,p->y);putchar(' ');p=p->next;coord(p->x,p->y);putchar('~');}void snake_auto_move(char run)//实现蛇的自动移动{void draw_wall();/*void snake_auto_comand();*/int x,y; do{clear_snake_tail();draw_snake(1);x=snake.rear->x;y=snake.rear->y;switch(run){ case 'w': x--;break; case 's': x++;break; case 'a': y--;break; case 'd': y++;}in_line(x,y);if(snake.front->x==x&&snake.front->y==y)//蛇捕捉食物{show_food(); game_imformation();}else{out_line(); }draw_snake(0);if(snake.rear->x>15){snake.rear->x-=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->y>27){snake.rear->y-=25; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->x<1){snake.rear->x+=16; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->y<1){snake.rear->y+=28; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}
Sleep(200);/*snake_auto_comand();*/}while(!_kbhit());}/*typedef struct node2{int x;int y;struct node2 *next;}node2,*linklist2;typedef struct{linklist2 front;linklist2 rear;int length;}line2;line2 snake2;void in_line2(int x,int y)//2蛇入队{linklist2 p;p=(linklist2)malloc(sizeof(node2));p->x = x;p->y = y;snake2.rear->next = p;snake2.rear = p;p->next = NULL;snake2.length++;}void out_line2()//2蛇出队{linklist2 p = snake2.front;p->next->x = p->x;p->next->y = p->y;snake2.front = snake2.front->next;snake2.length--;free(p);}void snake_shape2()//2蛇初始化蛇{int i;snake2.rear = snake2.front = (linklist2)malloc(sizeof(node2));snake2.rear->next = NULL;snake2.length = 0;for(i=0;i<3;i++){in_line2(10,i+4);}}void draw_snake2(int i)//2蛇画蛇{linklist2 p;p=snake2.rear;coord(p->x,p->y);if(i){ putchar('*'); }else{ putchar('%'); }}void clear_snake_tail2(){linklist2 p = snake2.front->next;coord(p->x,p->y);putchar(' ');p=p->next;coord(p->x,p->y);putchar('-');}void snake_auto_move2(char run)//2蛇实现蛇的自动移动{void draw_wall();int x,y;clear_snake_tail2();draw_snake2(1);x=snake2.rear->x;y=snake2.rear->y;switch(run){ case 'w': x--;break; case 's': x++;break; case 'a': y--;break; case 'd': y++;}in_line2(x,y);if(snake2.front->x==x&&snake2.front->y==y)//2蛇捕捉食物{show_food();}else{out_line2(); }draw_snake2(0);Sleep(200);}void snake_auto_comand()//第二条蛇的自动控制{int p,p2;char temp,temp2;srand((unsigned)time(NULL));while(1){p=rand()%2+1;p2=rand()%2+1;switch(p){case 1:temp='w';break; case 2:temp='s';break;}switch(p2){ case 1:temp2='a';break; case 2:temp2='d';}break;}snake_auto_move2(temp);
snake_auto_move2(temp2);
if(snake2.rear->x>15){snake2.rear->x-=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->y>27){snake2.rear->y-=26; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->x<1){snake2.rear->x+=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->y<3){snake2.rear->y+=27; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}}*/void draw_wall(){int k;printf(" ———————————————\n");for(k=1;k<=15;k++) { coord(k,0);printf("│");}for(k=1;k<=16;k++) { coord(k,30);printf("│");}coord(16,0);printf(" ———————————————\n");}
void snake_play_move()//play控制蛇{char c;static char temp=0;if(!temp){temp='d';snake_auto_move(temp);}while(1){c=getch();if(c=='w'||c=='a'||c=='s'||c=='d'){if((temp=='w'&&c=='s')||(temp=='s'&&c=='w')||(temp=='d'&&c=='a')||(temp=='a'&&c=='d'))//防止按相反方向{snake_auto_move(temp);continue;}break;}snake_auto_move(temp);}temp = c; snake_auto_move(temp);
}int judge()//判断失败与否不足!!!还不能正常运作。{ linklist k;//碰到自身 k=snake.front->next; while(snake.rear!=k){ if(snake.rear->x==k->x && snake.rear->y==k->y) {system("cls"); coord(5,25); puts("GAME OVER!!!"); destroy_queue(); getch(); exit(0);} else {k=k->next;} } }void main(){draw_wall();snake_shape(); game_imformation();/*snake_shape2();*/show_food();while(judge()){snake_play_move();}}