用C写一个功能较为完善的贪吃蛇小游戏
主要功能:
方向控制-食物与增长-变速(进入游戏界面后,需按shift键切换成英文输入)
1 #include<stdio.h> 2 #include<time.h>//种子-随机数 3 #include<windows.h>//system函数,控制台句柄 4 #include<conio.h>//按键 5 //界面(欢迎界面-游戏界面-结束得分界面)-驱动-方向控制-食物 6 //位置锁定-打印-删除 7 int snake_x[520]={0};//存储蛇各节的x坐标 8 int snake_y[520]={0};//存储y坐标 9 int head=2;//蛇头在坐标数组中的位置; 10 int food_x,food_y; 11 char dir=1;//在gotoprint中需要用到 12 int dx,dy=0;//在桌面上要删除的坐标,上一帧的蛇尾 13 int flag_eat=0;//吃到食物的标志 14 int score=0; 15 int f_gover=0; 16 int f_all=0;//是否达到通关分数 17 18 void gotoxy(int x,int y){ 19 COORD pos; 20 HANDLE hOutput; 21 pos.X=x; 22 pos.Y=y; 23 hOutput=GetStdHandle(STD_OUTPUT_HANDLE); 24 SetConsoleCursorPosition(hOutput,pos); 25 } 26 void createfood(){ 27 srand(time(NULL));//每次产生不同的种子 28 29 int flag=0; 30 while(1){ 31 food_x=((rand()%65)/2)*2+18;//x坐标一定要对齐,我们采取的是偶数对齐(统一小方格的坐标取法) 32 food_y=(rand()%15)+6; 33 for(int i=0;i<=head;i++){//判断食物是否与蛇重叠 34 if(food_x==snake_x[head-i]&&food_y==snake_y[head-i]) { 35 flag=1; break;//有则跳出循环,置重新生成标志为有效 36 } 37 else; 38 } 39 if(flag==0) break;//食物达标,可生成跳出while 40 else flag=0;//食物不达标,再次生成 41 } 42 gotoxy(food_x,food_y); 43 printf("⊙"); 44 } 45 46 void gotoprint(int x,int y){ 47 gotoxy(x,y); 48 printf("■");//正方形宽占两个字符,高占一个字符 49 //吃到食物的情况 50 if((x==food_x)&&(y==food_y)){ 51 flag_eat=1;//吃到食物了 52 createfood();//需要生成新食物 53 //分数增加-分数越高速度越快,每次分值越大 54 if(score<150)score+=10; 55 else if(score<370) score+=20; 56 else score+=30; 57 58 if(score==520) {f_gover=1; f_all=1;}//设定达到520分游戏结束 59 60 head++;//增加蛇长,下面更新蛇位置数据 61 for(int i=0;i<=head-1;i++){ 62 snake_x[head-i]=snake_x[head-i-1]; 63 snake_y[head-i]=snake_y[head-i-1]; 64 } 65 snake_x[0]=dx; 66 snake_y[0]=dy; 67 //正确 68 } 69 } 70 void gotodelete(int x,int y){ 71 gotoxy(x,y); 72 printf(" ");//正方形宽占两个字符,高占一个字符 73 } 74 75 void welcome(){ 76 gotoxy(35,8); printf("/***********************************/"); 77 gotoxy(35,10); printf("/ /"); 78 gotoxy(35,12); printf("/ 欢迎来到贪吃蛇小游戏/ /"); 79 gotoxy(35,14); printf("/ /"); 80 gotoxy(35,16); printf("/***********************************/"); 81 system("pause"); 82 system("cls"); 83 } 84 void gamepage(){ 85 //外围 86 for(int i=0;i<=68;i+=2) { gotoprint(16+i,4);}//原点坐标(16,4)外围设定:长X高=34X18 87 for(int i=0;i<=68;i+=2) { gotoprint(16+i,22);} 88 for(int i=1;i<=17;i++){gotoprint(16,4+i);gotoprint(84,4+i);} 89 //蛇身 90 snake_x[0]=32;snake_y[0]=12;gotoprint(snake_x[0],snake_y[0]); 91 snake_x[1]=34;snake_y[1]=12;gotoprint(snake_x[1],snake_y[1]); 92 snake_x[2]=36;snake_y[2]=12;gotoprint(snake_x[2],snake_y[2]); 93 createfood(); 94 } 95 96 void running(){ 97 98 int f_ws,f_ad; 99 f_ws=f_ad=1; 100 int ini_dir=1; 101 102 while(1){ 103 if (_kbhit()) ini_dir = _getch(); 104 if(ini_dir=='w') {if(f_ws==1) dir=ini_dir; else ;}//如果是w s a d 按键,需要判断按键有效性;直接掉头和朝同一方向的按键是无效的 105 else if(ini_dir=='s') {if(f_ws==1) dir=ini_dir; else ;} 106 else if(ini_dir=='a') {if(f_ad==1) dir=ini_dir; else ;} 107 else if(ini_dir=='d') {if(f_ad==1) dir=ini_dir; else ;} 108 else dir=ini_dir; 109 110 if(score<=120) Sleep(170);//分数越高-蛇移动越快 111 else if(score<=200) Sleep(140); 112 else if(score<=320) Sleep(110); 113 else if(score<=450) Sleep (80); 114 else Sleep(60); 115 116 if(dir=='w'){ 117 dx=snake_x[0];dy=snake_y[0]; 118 for(int i=0;i<head;i++){ 119 snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1]; 120 } 121 //snake_x[head]=snake_x[head]; 122 snake_y[head]=snake_y[head]-1; 123 f_ws=0; 124 f_ad=1; 125 126 } 127 else if(dir=='s'){ 128 dx=snake_x[0];dy=snake_y[0]; 129 for(int i=0;i<head;i++){ 130 snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1]; 131 } 132 snake_y[head]=snake_y[head]+1; 133 f_ws=0; 134 f_ad=1; 135 136 } 137 else if(dir=='a'){ 138 dx=snake_x[0];dy=snake_y[0]; 139 for(int i=0;i<head;i++){ 140 snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1]; 141 } 142 snake_x[head]=snake_x[head]-2; 143 f_ws=1; 144 f_ad=0; 145 } 146 else if(dir=='d'){ 147 dx=snake_x[0];dy=snake_y[0]; 148 for(int i=0;i<head;i++){ 149 snake_x[i]=snake_x[i+1];snake_y[i]=snake_y[i+1]; 150 } 151 snake_x[head]=snake_x[head]+2; 152 f_ws=1; 153 f_ad=0; 154 } 155 else continue; 156 //检查是否超出范围 157 if (snake_x[head]<=16||snake_x[head]>=84||snake_y[head]<=4||snake_y[head]>=22) break;//直接跳出while循环 158 gotoprint(snake_x[head],snake_y[head]); 159 gotoxy(16,23); 160 printf("Dear,You've got %d points so far!",score); 161 //判断有没有吃的食物,吃到食物则不用删除蛇尾,因为长度+1 162 if(flag_eat==0){ 163 gotodelete(dx,dy);gotoxy(16,23); 164 printf("Dear,You've got %d points so far!",score); 165 } 166 else flag_eat=0; 167 //检查蛇是否吃到自己 168 for(int i=1;i<=head;i++){ 169 if(snake_x[head]==snake_x[head-i]&&snake_y[head]==snake_y[head-i]) f_gover=1; 170 } 171 172 if(f_gover==1){f_gover=0;Sleep(300);break;} 173 else ; 174 } 175 system("cls");//清除屏幕 176 gotoxy(36,13); 177 if(f_all==0) printf("Baby,You got %d points !Keep Trying!",score); 178 else printf("Baby,You got all %d points !",score); 179 gotoxy(2,32); 180 system("pause"); 181 182 } 183 184 int main(){ 185 system("color 0B"); 186 welcome(); 187 gamepage(); 188 running(); 189 gotoxy(2,24); 190 printf("\n"); 191 printf("\n"); 192 return 0; 193 }