#进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏

news/2024/4/24 1:20:28/
#进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏。

想必很多大一新生在刚学C语言时和我们遇到过同样的问题,就是如何去做第一个C语言大作业。
我们小组内部在讨论大作业时,并不打算在网络上全抄一个代码敷衍了事,而是打算自己亲手去做出来,并且部分参考书本和网络上的例子。毕竟通过自己亲手做出来的才会更有成就感,学到的更多。
1·首先是设计思路:刚学C语言的我们都想去挑战做出来一个不一样的新游戏。这时我们就先想到将不同的游戏功能结合起来,让它具有贪吃蛇的大致结构,并且拥有飞机大战发射子弹的能力,和坦克大战中自动射击的AI。
下面是我们小组的心得
2. 1.身为组长,其实我对代码的熟悉度最高。在一开始我就上网查找资料,发现大多数贪吃蛇代码我看不懂(这应该就是菜鸡的悲哀),后来我发现一本书《C语言课程设计与游戏开发实践》,通俗易懂的教你如何做一款游戏,只需要用一些简单的C语言知识。虽然过程中会遇到一些困难,但我都克服了下来,和小组一起从200~300行的贪吃蛇代码一步一步写到了一千多行,其实我知道,只有一些基础知识的我们,写出来的代码结构上并不好,存在代码过长,有游戏bug等问题,但是起码简单易理解,并且我收获在过程中与同学合作的喜悦,在此感谢我的组员们。
2.2.这次大作业中,本来初衷只是做一个好玩有趣的游戏,所以想的是在原有小游戏基础上魔改一下,没想到花费了很多时间和经历,但也学到了不少,感谢团队每个成员的付出。
2.3.通过C语言大作业,我了解了除课本外更加广阔的编程天地,也认识到最基础的C语言也能编程出令自己满意的成果。
3·接下来是游戏的一些图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4·此处是一个借鉴的网站:3条消息) 【C语言】贪吃蛇游戏的实现(一)_includei的博客-CSDN博客_c语言贪吃蛇
https://blog.csdn.net/includei/article/details/85311707?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160906366216780308345510%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160906366216780308345510&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-85311707.pc_search_result_cache&utm_term=C%E8%AF%AD%E8%A8%80%E8%B4%AA%E5%90%83%E8%9B%87
5·下面是游戏的结构

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#define high 25
#define width 80
#define bullet_num 5
#define up 1
#define down 2
#define left 3
#define right 4
int pic[high][width]= {0}; //画面大小,0:空格,-3:子弹,-7,-8,-2:食物?,!,$,-1:边框#,100:自己蛇头@,>100为自己蛇身*,0<为敌人的蛇<100,镭射激光为-9,-10
int direction;//上,下,左,右为1,2,3,4
int food_x,food_y;//加一分
int food_x1,food_y1;//10%死亡,30%加5分,60%加2分
int food_x2,food_y2;
int laser;//激光
int laser_s;//是否吃到!
int score;//分数
int i,j;//用于循环
int sign;//判断自己蛇的子弹是否射出
int death;//死亡参数
int enemydeath;//杀敌数
typedef struct//子弹参数
{int x,y;//坐标int direction;//方向int exist;//是否存在
}Bullet;
Bullet bullet[bullet_num],bulletenemy[bullet_num];//定义自己子弹与AI蛇子弹
typedef struct//蛇
{int x,y;//蛇头int direction;//方向int CD;//子弹CDint snakespeed ;//蛇的速度int oldtail_x,oldtail_y;//蛇尾int color;//颜色
}Snake;
Snake my;//定义自己的蛇
typedef struct//蛇
{int x,y;//蛇头int ax[3],ay[3];//蛇身int direction;//方向int sign;//判断AI蛇的型号
}Snake1;
Snake1 enemy[2];//AI蛇
void explation();
void startup();//初始化
int color(int a);
void gotoxy(int x,int y);//光标移动到(x,y)位置
void HideCursor();//隐藏光标
void printsnake();
void show();//显示画面
void newsnake(Snake1 *enemy);//AI蛇的重置
void bulletmove();//自己蛇子弹的移动
void enemy_snakemove(Snake1 *enemy);//敌人蛇自动移动
void snakemove();//自己蛇自动移动
void bulletenemymove(Snake1 *enemy);//AI蛇子弹的移动
void updateWithInput();//与用户有关的更新
void updateWithoutInput();//与用户无关的更新
void welcometogame();
void reward();
void gold();
void less();
void random();
void choose();
void Lostdraw();
void endgame();//结束的东西

6.最后是游戏的所有代码

void startup()//初始化
{system("cls");enemydeath=0;laser_s=0;//是否射击laser=0;//激光不可发出sign=1;//子弹可以射出my.CD=8;//技能的CDfor(i=0;i<bullet_num;i++){bullet[i].exist=0;//自己蛇子弹的存在为0}enemy[0].sign=0;//0号AI蛇的特殊标志enemy[1].sign=1;//1号AI蛇的特殊标志enemy[1].x=high/5*4;enemy[1].y=width/4*3;enemy[0].x=high/5;enemy[0].y=width/4;//0,1号AI蛇的初始坐标my.snakespeed=2;//自己蛇的速度my.x=high/2;my.y=width/2;//自己蛇的坐标score=0;for(i=0; i<high; i++){pic[i][0]=-1;pic[i][width-1]=-1;}for(j=0; j<width; j++){pic[0][j]=-1;pic[high-1][j]=-1;}//定义边框pic[my.x][my.y]=100;pic[enemy[0].x][enemy[0].y]=1;pic[enemy[1].x][enemy[1].y]=11;//蛇头赋值for(j=1; j<4; j++){pic[my.x][my.y-j]=j+100;enemy[0].ax[j-1]=enemy[0].x;enemy[0].ay[j-1]=enemy[0].y-j;enemy[1].ax[j-1]=enemy[1].x;enemy[1].ay[j-1]=enemy[1].y+j;pic[enemy[0].ax[j-1]][enemy[0].ay[j-1]]=j+1;pic[enemy[1].ax[j-1]][enemy[1].ay[j-1]]=j+11;}//蛇身的二位数组的值my.direction=4;enemy[0].direction=4;enemy[1].direction=3;//方向srand((int)time(NULL));food_x=rand()%(high-5)+4;food_y=rand()%(width-5)+4;//随机生成食物pic[food_x][food_y]=-2;
}
int color(int a)//颜色函数
{HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole, a);    //更改文字颜色return 0;
}
void gotoxy(int x,int y)//光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}
void HideCursor()//隐藏光标
{CONSOLE_CURSOR_INFO cursor_info = {1,0}; //第二个0表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void printsnake()//首页字体
{printf("\n");printf("\n");printf("\n");color(3);
printf("                  ◆◆ ◆◆  ◆                               ◆     \n");
printf("                 ◆◆◆◆◆◆◆◆◆                             ◆◆◆◆◆◆◆◆◆◆\n");
printf("                   ◆ ◆◆  ◆                                ◆     \n");
printf("                ◆◆◆ ◆◆  ◆                                ◆      \n");
printf("                    ◆◆◆◆◆◆◆◆◆                        ◆◆◆◆◆◆◆◆◆◆◆\n");
printf("                    ◆ ◆◆  ◆         ◆◆◆◆◆◆       ◆   ◆   ◆ \n");
printf("                    ◆ ◆◆  ◆       ◆◆◆◆◆◆◆◆◆◆     ◆   ◆  ◆◆ \n");
printf("                  ◆◆◆◆◆  ◆     ◆◆◆ ◆◆  ◆◆◆   ◆   ◆  ◆◆ \n");
printf("                ◆◆◆◆◆◆◆◆◆◆◆ ◆◆◆ ◆◆◆   ◆◆   ◆◆◆◆◆◆◆◆◆ \n");
printf("                ◆◆  ◆◆◆◆◆◆◆ ◆◆ ◆◆◆    ◆◆           \n");
printf("                                       ◆◆◆◆◆◆    ◆◆\n");
printf("                                       ◆◆◆◆    ◆◆◆\n");
printf("                                         ◆◆◆    ◆◆◆ \n");
printf("                                                    ◆◆◆◆\n");
printf("                                                   ◆◆◆◆\n\n");
color(4);
printf("                                          贪      吃      蛇");
}
void reward()//抽奖函数
{int i,j = 1;int n,m;system("cls");color(15);gotoxy(44,3);printf("超级大乐透");color(2);for (i = 6; i <= 22; i++)   //输出上下边框==={for (j = 20; j <= 76; j++)  //输出左右边框||{gotoxy(j, i);if (i == 6 || i == 20) printf("=");else if (j == 20 || j == 75) printf("||");}}color(11);gotoxy(30,14);printf("非酋大转盘[写下你的幸运数字]: \b\b");color(14);scanf("%d", &n);srand((int)time(NULL));m=rand()%100+1;if(m>=1&&m<=5){system("cls");gold();startup();}if(m>20){system("cls");random();startup();}if(m<=20&&m>5){system("cls");less();startup();}
}
void gold()//金色传说
{system("cls");my.color=6;printf("\n");printf("\n");printf("\n");printf("\n");printf("              ◆◆◆◆◆      ◆◆◆◆◆◆     ◆◆  ◆◆      ◆◆ ◆◆  ◆◆\n");printf("        ◆◆◆◆  ◆◆◆◆   ◆◆◆  ◆◆     ◆◆◆◆◆◆◆◆◆   ◆◆◆ ◆ ◆◆ \n");printf("        ◆◆◆◆◆◆◆◆◆◆◆ ◆◆◆◆◆◆◆◆◆    ◆◆  ◆          ◆◆◆◆◆◆\n");printf("             ◆      ◆◆◆  ◆  ◆   ◆◆◆◆◆◆◆◆◆◆◆ ◆◆◆ ◆    ◆\n");printf("         ◆◆◆◆◆◆◆◆◆   ◆   ◆  ◆   ◆◆  ◆◆        ◆ ◆   ◆◆\n");printf("          ◆◆  ◆  ◆    ◆   ◆  ◆  ◆◆◆  ◆◆◆◆◆◆    ◆ ◆◆◆◆◆◆\n");printf("            ◆◆ ◆ ◆◆    ◆◆◆◆◆◆◆◆    ◆      ◆◆    ◆  ◆ ◆  \n");printf("            ◆◆ ◆ ◆◆    ◆       ◆   ◆  ◆◆◆◆◆     ◆◆◆◆ ◆ ◆\n");printf("        ◆◆◆◆◆◆◆◆◆◆   ◆◆     ◆◆   ◆   ◆◆◆      ◆◆◆◆ ◆◆◆\n");printf("                                  ◆◆◆◆◆◆◆◆◆   ◆     ◆◆      ◆◆  ◆◆◆\n");Sleep(1000);
}
void random()//普通
{system("cls");my.color=15;gotoxy(45,10);printf("普通\n");Sleep(1000);
}
void less()//稀有
{system("cls");my.color=5;printf("\n");printf("\n");printf("\n");printf("\n");printf("                 ◆◆ ◆   ◆          ◆       \n");printf("              ◆◆◆◆◆◆◆◆◆◆◆         ◆◆       \n");printf("                ◆    ◆◆◆◆    ◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");printf("                ◆  ◆◆◆◆◆◆◆      ◆◆◆      \n");printf("             ◆◆◆◆◆◆ ◆◆  ◆     ◆◆◆◆◆◆◆◆◆◆\n");printf("                ◆◆◆◆◆◆◆◆◆◆◆◆  ◆◆◆◆       ◆\n");printf("                ◆◆◆◆ ◆◆◆      ◆◆ ◆◆◆◆◆◆◆◆◆\n");printf("                ◆◆◆◆◆◆◆◆◆◆◆      ◆       ◆\n");printf("              ◆◆◆ ◆◆◆ ◆  ◆      ◆       ◆\n");printf("              ◆ ◆ ◆ ◆ ◆  ◆      ◆◆◆◆◆◆◆◆◆\n");printf("                  ◆   ◆ ◆  ◆      ◆       ◆\n");printf("                  ◆   ◆ ◆  ◆      ◆       ◆\n");printf("                  ◆   ◆ ◆ ◆◆      ◆    ◆◆◆◆\n");printf("                              ◆\n");Sleep(1000);
}
void Lostdraw()//分数结算界面
{system("cls");int pi;gotoxy(45,1);color(6);printf(" |-----|   ");		//匹诺曹的帽子gotoxy(45,2);color(6);printf(" |     |   ");gotoxy(43,3);color(6);printf("-------------");gotoxy(44,4);color(14);printf("(");gotoxy(47,4);color(15);printf(" > <");				//眼睛gotoxy(54,4);color(14);printf(")");gotoxy(17,5);color(11);printf("+------------------------");	//上边框gotoxy(35,5);color(14);printf("oOOo");gotoxy(39,5);color(11);printf("----------");					//上边框gotoxy(48,5);color(14);printf("| |");				//鼻子gotoxy(48,6);color(14);printf("|_|");gotoxy(51,5);color(11);printf("----------");					//上边框gotoxy(61,5);color(14);printf("oOOo");gotoxy(65,5);color(11);printf("-----------------+");			//上边框for(pi = 6;pi<=19;pi++)					//竖边框{gotoxy(17,pi);printf("|");gotoxy(82,pi);printf("|");}gotoxy(17,20);printf("+------------------------------------------");	//下边框gotoxy(60,20);color(11);printf("----------------------+");						//下边框}
void endgame()//结束函数
{gotoxy(0,0);if(death==1){Lostdraw();gotoxy(35,9);color(7);printf("小垃圾,你没了,玩得跟小菜儿似的!");}gotoxy(43,11);color(14);printf("您的杀敌数为 %d\n",enemydeath);gotoxy(43,12);printf("您的分数是 %d",score);gotoxy(43,14);printf("您的总得分是 %d",score+enemydeath*5);if(score+enemydeath*5 >= 100){color(10);gotoxy(33,16);printf("创纪录啦!最高分被你刷新啦,真棒!!!");}else{color(10);gotoxy(33,16);printf("继续努力吧~小菜鸡,嘿嘿嘿,哈哈哈 ");}choose();
}
void choose()//用户选择界面
{int n;gotoxy(30,23);color(12);printf("重玩一局 [1]");gotoxy(55,23);printf("溜了溜了 [2]");gotoxy(45,25);color(11);printf("选择:");scanf("%d", &n);switch (n){case 1:gotoxy(0,0);    //清屏score=0;//分数归零for(i=0;i<high;i++){for(j=0;j<width;j++)pic[i][j]=0;}system("cls");printsnake();           //返回欢迎界面welcometogame();break;case 2:exit(0);                //退出游戏break;default:gotoxy(35,27);color(12);printf("※※您的输入有误,自动退出※※");Sleep(500);exit(0);break;}}
void show()//显示画面
{int flag=0;//判断是否有食物存在int flag1=0;int flag2=0;gotoxy(0,0);//光标移动到原点pic[0][0]=-1;for(i=0; i<high; i++){for(j=0; j<width; j++){if(pic[i][j]==-2){color(6);printf("$");flag=1;}//食物else if(pic[i][j]==-1){color(9);printf("#");}//边界else if(pic[i][j]==0)printf(" ");else if(pic[i][j]==100){color(my.color);printf("@");}//自己蛇头else if(pic[i][j]==1||pic[i][j]==11){color(11);printf("&");}//AI蛇头else if((pic[i][j]>1&&pic[i][j]<100)&&pic[i][j]!=11){color(15);printf("*");}else if(pic[i][j]>100){color(my.color);printf("*");}//蛇身else if(pic[i][j]==-3){color(4);printf("|");}else if(pic[i][j]==-4){color(12);printf("-");}//子弹else if(pic[i][j]==-7){color(12);printf("?");flag1=1;}else if(pic[i][j]==-8){color(11);printf("!");flag2=1;laser=1;}//特殊物品else if(pic[i][j]==-9){color(9);printf("|");}else if(pic[i][j]==-10){color(9);printf("-");}//镭射激光}printf("\n");}//绘图if(!flag){srand((int)time(NULL));food_x=rand()%(high-5)+2;food_y=rand()%(width-5)+2;pic[food_x][food_y]=-2;flag=1;}//一开始会有两个食物if(score>=6&&!flag1&&score%3==0){food_x1=rand()%(high-5)+3;food_y1=rand()%(width-5)+3;pic[food_x1][food_y1]=-7;flag1=1;}if(score>=10&&!flag2&&score%5==0){srand((int)time(NULL));food_x2=rand()%(high-5)+4;food_y2=rand()%(width-5)+4;pic[food_x2][food_y2]=-8;flag2=1;}//食物的出现printf("得分为:%d\n",score);printf("杀敌数为:%d\n",enemydeath);color(11);gotoxy(82,6);printf("小心撞子弹,墙,AI蛇,和自己");color(14);gotoxy(82,8);printf("W.A.S.D控制蛇的移动,英文模式");color(11);gotoxy(82,10);printf("按空格键射击");color(14);gotoxy(82,12);printf("?为10%%死亡,30%%加5分,60%%加2分");color(11);gotoxy(82,14);printf("!可以有发射镭射激光一次");color(14);gotoxy(82,16);printf("$可以加一分,6分出现?,10分出现!");color(11);gotoxy(82,18);printf("普通为白色,精英为紫色,传说为金色");color(14);gotoxy(82,20);printf("镭射在边界边无效哦");//分数与游戏说明
}
void newsnake(Snake1 *enemy)//AI蛇的重置
{pic[enemy->x][enemy->y]=0;for(i=0; i<3; i++){pic[enemy->ax[i]][enemy->ay[i]]=0;}                                  //蛇头,蛇身值清零do{enemy->x=rand()%(high-5)+3;enemy->y=rand()%(width-10)+5;//随机生成蛇头}while(pic[enemy->x][enemy->y]!=0);//确保蛇头在空白处if(enemy->sign==0){enemy->direction=4;for(j=1; j<4; j++){enemy->ax[j-1]=enemy->x;enemy->ay[j-1]=enemy->y-j;}}//0号蛇方向初始为右else if(enemy->sign==1){enemy->direction=3;for(j=1; j<4; j++){enemy->ax[j-1]=enemy->x;enemy->ay[j-1]=enemy->y+j;}}//1号蛇方向初始为左
}
void bulletmove()//自己蛇子弹的移动
{for(i=0; i<bullet_num; i++){if(bullet[i].exist==1)//子弹已经存在{pic[bullet[i].x][bullet[i].y]=0;switch(bullet[i].direction)//判断方向{case up:if(bullet[i].x>1){bullet[i].x--;if(pic[bullet[i].x][bullet[i].y]==1){enemydeath++;newsnake(&enemy[0]);}else if(pic[bullet[i].x][bullet[i].y]==11){enemydeath++;newsnake(&enemy[1]);}//触到AI蛇重置else if(pic[bullet[i].x][bullet[i].y]==100){printf("游戏结束\n");system("pause");Sleep(1000);death=1;system("cls");endgame();system("cls");}//碰到自己蛇头游戏结束pic[bullet[i].x][bullet[i].y]=-3;}elsebullet[i].exist=0;//遇到边界消去子弹break;case down:if(bullet[i].x<high-2){bullet[i].x++;if(pic[bullet[i].x][bullet[i].y]==1){newsnake(&enemy[0]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==11){newsnake(&enemy[1]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==100){printf("游戏结束\n");system("pause");Sleep(1000);death=1;system("cls");endgame();system("cls");}pic[bullet[i].x][bullet[i].y]=-3;}elsebullet[i].exist=0;break;case left:if(bullet[i].y>1){bullet[i].y--;if(pic[bullet[i].x][bullet[i].y]==1){newsnake(&enemy[0]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==11){newsnake(&enemy[1]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bullet[i].x][bullet[i].y]=-4;}elsebullet[i].exist=0;break;case right:if(bullet[i].y<width-2){bullet[i].y++;if(pic[bullet[i].x][bullet[i].y]==1){newsnake(&enemy[0]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==11){newsnake(&enemy[1]);enemydeath++;}else if(pic[bullet[i].x][bullet[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bullet[i].x][bullet[i].y]=-4;}elsebullet[i].exist=0;break;}}}}
void enemy_snakemove(Snake1 *enemy)//敌人蛇自动移动
{int newdirection;//防止ai蛇会返回原来的方向pic[enemy->ax[2]][enemy->ay[2]]=0;//蛇尾清零for(i=1;i>=0;i--){enemy->ax[i+1]=enemy->ax[i];enemy->ay[i+1]=enemy->ay[i];}//蛇身对应向前enemy->ax[0]=enemy->x;enemy->ay[0]=enemy->y;int x,y;do{x=enemy->x,y=enemy->y;do{newdirection=rand()%4+1;//随机方向}while((enemy->direction==1&&newdirection==2)||(enemy->direction==2&&newdirection==1)||(enemy->direction==3&&newdirection==4)||(enemy->direction==4&&newdirection==3));//防止方向enemy->direction=newdirection;if(enemy->direction==1){x--;}if(enemy->direction==2){x++;}if(enemy->direction==3){y--;}if(enemy->direction==4){y++;}}while(pic[x][y]==-1);//防止触到边界enemy->x=x;enemy->y=y;//蛇头while(pic[enemy->x][enemy->y]==-3||pic[enemy->x][enemy->y]==-4||pic[enemy->x][enemy->y]>1||pic[enemy->x][enemy->y]==-9||pic[enemy->x][enemy->y]==-10){newsnake(enemy);}//重置蛇for(i=0;i<3;i++){pic[enemy->ax[i]][enemy->ay[i]]=i+2+enemy->sign*10;}//pic[enemy->x][enemy->y]=1+enemy->sign*10;//对蛇头,蛇身赋值(防止出现错误)}
void snakemove()//自己蛇自动移动
{int m;int max=100;//找蛇尾for(i=1;i<high-1;i++){for(j=1;j<width-1;j++){if(pic[i][j]>99)pic[i][j]++;}}//蛇头,蛇身值加1for(i=1;i<high-1;i++){for(j=1;j<width-1;j++){if(max<pic[i][j]){max=pic[i][j];my.oldtail_x=i;my.oldtail_y=j;}}}//蛇尾if(my.direction==1){my.x--;}if(my.direction==2){my.x++;}if(my.direction==3){my.y--;}if(my.direction==4){my.y++;}//根据方向改变蛇头if(pic[my.x][my.y]==-2)//碰到食物,此时蛇尾保留{score++;if(score%3==0&&my.snakespeed>3)my.snakespeed--;//速度加快}else if(pic[my.x][my.y]==-7)//碰到特殊物品?{srand((int)time(NULL));m=rand()%10+1;if(m==1){printf("游戏结束\n");system("pause");Sleep(500);exit(0);}if(m>1&&m<=4){score=score+5;}if(m>=5&&m<=10){score=score+2;}pic[my.oldtail_x][my.oldtail_y]=0;//蛇尾为0}else if(pic[my.x][my.y]==-8)//镭射{laser_s=1;pic[my.oldtail_x][my.oldtail_y]=0;}else{pic[my.oldtail_x][my.oldtail_y]=0;}//蛇尾清零if(pic[my.x][my.y]==-1||pic[my.x][my.y]>0||pic[my.x][my.y]==-3){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}else{pic[my.x][my.y]=100;//蛇头赋值}}
void bulletenemymove(Snake1 *enemy)//AI蛇子弹的移动
{int flag;//判断子弹是否打出for(i=0; i<5; i++){flag=0;if(bulletenemy[i].exist==0)//子弹未存在{bulletenemy[i].exist=1;//子弹存在flag=1;bulletenemy[i].direction=enemy->direction;//方向switch(bulletenemy[i].direction)//由方向决定子弹参数{case 1:if(enemy->x>2){bulletenemy[i].x=enemy->x-1;bulletenemy[i].y=enemy->y;}break;case 2:if(enemy->x<high-3){bulletenemy[i].x=enemy->x+1;bulletenemy[i].y=enemy->y;}break;case 3:if(enemy->y>2){bulletenemy[i].x=enemy->x;bulletenemy[i].y=enemy->y-1;}break;case 4:if(enemy->y<width-2){bulletenemy[i].x=enemy->x;bulletenemy[i].y=enemy->y+1;}break;}}if(flag)//射出子弹后退出break;}for(i=0; i<5; i++) //不超过五个子弹,子弹进行赋值并判断是否碰撞{if(bulletenemy[i].exist==1)//已经存在的子弹进行移动{pic[bulletenemy[i].x][bulletenemy[i].y]=0;switch(bulletenemy[i].direction){case up:if(bulletenemy[i].x>1){bulletenemy[i].x--;if(pic[bulletenemy[i].x][bulletenemy[i].y]==1){newsnake(&enemy[0]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==11){newsnake(&enemy[1]);}//碰到AI蛇重置else if(pic[bulletenemy[i].x][bulletenemy[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bulletenemy[i].x][bulletenemy[i].y]=-3;}elsebulletenemy[i].exist=0;break;case down:if(bulletenemy[i].x<high-2){bulletenemy[i].x++;if(pic[bulletenemy[i].x][bulletenemy[i].y]==1){newsnake(&enemy[0]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==11){newsnake(&enemy[1]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bulletenemy[i].x][bulletenemy[i].y]=-3;}elsebulletenemy[i].exist=0;break;case left:if(bulletenemy[i].y>1){bulletenemy[i].y--;if(pic[bulletenemy[i].x][bulletenemy[i].y]==1){newsnake(&enemy[0]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==11){newsnake(&enemy[1]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bulletenemy[i].x][bulletenemy[i].y]=-4;}elsebulletenemy[i].exist=0;break;case right:if(bulletenemy[i].y<width-2){bulletenemy[i].y++;if(pic[bulletenemy[i].x][bulletenemy[i].y]==1){newsnake(&enemy[0]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==11){newsnake(&enemy[1]);}else if(pic[bulletenemy[i].x][bulletenemy[i].y]==100){printf("游戏结束\n");system("pause");Sleep(500);death=1;system("cls");endgame();system("cls");}pic[bulletenemy[i].x][bulletenemy[i].y]=-4;}elsebulletenemy[i].exist=0;break;}}}
}
void updateWithoutInput()//与用户无关的更新
{static int speed=0,bullet_speed=0,enemymovespeed=0,enemybulletspeed=0;//静态变量来决定AI蛇,自己,子弹的速度if(enemybulletspeed<3)enemybulletspeed++;else{enemybulletspeed=0;bulletenemymove(&enemy[0]);bulletenemymove(&enemy[1]);}if(enemymovespeed<6){enemymovespeed++;}else{enemymovespeed=0;enemy_snakemove(&enemy[0]);enemy_snakemove(&enemy[1]);}if(bullet_speed<2)bullet_speed++;else{bullet_speed=0;bulletmove();}if(speed<my.snakespeed)speed++;else if(speed>=my.snakespeed){speed=0;snakemove();bulletmove();}if(sign==0){if(my.CD>0)my.CD--;else{my.CD=8;sign=1;}}//发射子弹CDif(laser){for(i=1; i<high-1; i++){for(j=1; j<width-1; j++){if(pic[i][j]==-9||pic[i][j]==-10)pic[i][j]=0;}}laser=0;}//若发射镭射后立即清除
}
void updateWithInput()//与用户有关的更新
{char input;if(kbhit())//判断是否输入{input=getch();if(input == 'w'&&my.direction!=down){my.direction=1;snakemove();}if(input == 's'&&my.direction!=up){my.direction=2;snakemove();}if(input == 'a'&&my.direction!=right){my.direction=3;snakemove();}if(input == 'd'&&my.direction!=left){my.direction=4;snakemove();}if(input == ' '&&sign==1){if(!laser_s)//正常子弹{int flag;for(i=0; i<bullet_num; i++){flag=0;if(bullet[i].exist==0){sign=0;bullet[i].exist=1;flag=1;bullet[i].direction=my.direction;switch(bullet[i].direction){case up:if(my.x>2){bullet[i].x=my.x-1;bullet[i].y=my.y;}break;case down:if(my.x<high-3){bullet[i].x=my.x+1;bullet[i].y=my.y;}break;case left:if(my.y>2){bullet[i].x=my.x;bullet[i].y=my.y-1;}break;case right:if(my.y<width-2){bullet[i].x=my.x;bullet[i].y=my.y+1;}break;}}if(flag)break;}}else//发射镭射激光{laser=1;laser_s=0;int x1=my.x-1,y1=my.y-1;int x2=my.x+1,y2=my.y+1;switch(my.direction){case up:if(my.x>2&&my.y>1&&my.y<width-2){for(j=y1; j<=y2; j++){for(i=1; i<x1; i++){if(i==enemy[0].x&&j==enemy[0].y){newsnake(&enemy[0]);score++;enemydeath++;}else if(i==enemy[1].x&&j==enemy[1].y){newsnake(&enemy[1]);score++;enemydeath++;}if(pic[i][j]<100){pic[i][j]=-9;}}}}break;case down:if(my.x<high-2&&my.y>1&&my.y<width-2){for(j=y1; j<=y2; j++){for(i=high-2; i>x2; i--){if(i==enemy[0].x&&j==enemy[0].y){score++;newsnake(&enemy[0]);enemydeath++;}else if( i==enemy[1].x&&j==enemy[1].y){score++;newsnake(&enemy[1]);enemydeath++;}if(pic[i][j]<100){pic[i][j]=-9;}}}}break;case left:if(my.y>2&&my.x>1&&my.x<high-2){for(i=x1; i<=x2; i++){for(j=1; j<y1; j++){if(i==enemy[0].x&&j==enemy[0].y){score++;newsnake(&enemy[0]);enemydeath++;}else if(i==enemy[1].x&&j==enemy[1].y){score++;newsnake(&enemy[1]);enemydeath++;}if(pic[i][j]<100){pic[i][j]=-10;}}}}break;case right:if(my.y>2&&my.x>1&&my.x<high-2){for(i=x1; i<=x2; i++){for(j=y2+1; j<width-1; j++){if(i==enemy[0].x&&j==enemy[0].y){score++;newsnake(&enemy[0]);enemydeath++;}else if(i==enemy[1].x&&j==enemy[1].y){score++;newsnake(&enemy[1]);enemydeath++;}if(pic[i][j]<100){pic[i][j]=-10;}}}}break;}}}}
}
void welcometogame()//欢迎界面
{int n;gotoxy(44,22);color(11);printf("蛇 射 舍 游 戏");color(10);gotoxy(31, 24);printf("1.开始游戏");gotoxy(43, 24);printf("2.游戏说明");gotoxy(55, 24);printf("3.退出游戏");gotoxy(30,26);color(3);printf("请选择[1 2 3]:[ ]\b\b");        //\b为退格,使得光标处于[]中间color(14);scanf("%d", &n);    		//输入选项switch (n){case 1:					//选择开始游戏gotoxy(0,0);reward();while(1)        //游戏循环{show();     //显示画面updateWithoutInput();//与用户无关的更新updateWithInput();//与用户有关的更新}case 2:					//选择游戏说明explation();break;case 3:					//选择退出游戏exit(0);     		//退出游戏break;default:				//输入非1~3之间的选项color(12);gotoxy(40,48);printf("请输入1~3之间的数!");getch();			//输入任意键system("cls");		//清屏printsnake();welcometogame();}
}
void explation()//游戏说明
{int i,j = 1;system("cls");color(15);gotoxy(44,3);printf("游戏说明");color(2);for (i = 6; i <= 22; i++)   //输出上下边框==={for (j = 20; j <= 76; j++)  //输出左右边框||{gotoxy(j, i);if (i == 6 || i == 22)printf("=");else if (j == 20 || j == 75)printf("||");}}color(11);gotoxy(23,8);printf("tip1: AI蛇只有头中弹才会死,身体中弹会自动恢复");color(14);gotoxy(23,10);printf("tip2: 自己头中弹才会死,身体中弹会短一截,分数减半");color(11);gotoxy(23,12);printf("tip3: 激光只能储存一个,并在AI蛇附近会扩大范围");color(14);gotoxy(23,14);printf("tip4: ?为0.1死亡,0.3加5分,0.6加2分");color(11);gotoxy(23,16);printf("tip5: 总分计算为:分数+杀敌数*10");color(14);gotoxy(23,18);printf("tip6: $可以加一分,6分出现?,10分出现!");color(11);gotoxy(23,20);printf("tip7: 任意键 :返回上一界面");getch();                //按任意键返回主界面system("cls");printsnake();welcometogame();
}
int main()//主函数
{HideCursor();//光标清除startup();//初始化printsnake();//打印界面图welcometogame();//游戏开始return 0;
}

http://www.ppmy.cn/news/599767.html

相关文章

PC版水果忍者不能运行的解决办法

水果忍者这款在苹果(Apple)以及安卓(Android)上风靡一时的游戏如今也推出了PC版。当你满心欢喜的下载完游戏后却发现游戏不能玩&#xff0c;出现如下3种错误中的某一种&#xff0c;这该怎么办呢&#xff1f; 这三种最常见的错误分别是&#xff1a; 1、无法启动此程序&#xff…

全新设计 水果忍者-穿靴子的猫官方中文版首发

2011年底一部动画片吸引了广大爱猫人士的眼球&#xff0c;那就是梦工厂推出的《穿靴子的猫》&#xff0c;这只桀骜不驯的猫咪在征服影视界的同时也成功进军游戏界&#xff0c;为众多手机游戏迷们带来了精彩刺激的最新游戏——《水果忍者&#xff1a;穿靴子的猫》&#xff01;这…

FL Studio水果中文版V20.8电脑系统配置要求

FL Studio 20.8版本起开始支持简体中文&#xff0c;但推荐使用windows 10系统安装&#xff0c;Windows 7系统设置FL Studio语言为中文时若出现乱码&#xff0c;可以将Win10系统中的“微软雅黑”字体复制并安装进Win7系统电脑中&#xff01; FL Studio 20.8在Windows和Mac OS两个…

FL Studio21官方版中文版水果音乐编曲制作软件下载

FL Studio21反响比较火热的&#xff0c;使用的也是最普遍的&#xff0c;因为其的整体设计功能还是可以满足大部分的音乐创作人的需求的。你有着满腔的音乐才华&#xff0c;想要自己在家里发片吗&#xff1f;还是听 MOBY 的电子舞曲不过瘾&#xff0c;要再帮他做做 REMIX&#x…

水果忍者腾讯版 v1.0.2 官方安卓版下载

水果忍者腾讯版 v1.0.2 官方安卓版 软件大小&#xff1a;20.8MB 软件语言&#xff1a;简体中文 软件性质&#xff1a;游戏下载 软件授权&#xff1a;免费版 更新时间&#xff1a;2013-12-06 应用平台&#xff1a;Android 水果忍者腾讯版 for 安卓版由FruitNinja的开发公司Halfb…

C语言水果忍者修改器(入门版)

2020年11月4日&#xff0c;大学开学一个月了吧 这所大学 学的c语言&#xff08;说实话已经好几年没用了忘得差不多了&#xff0c;这几天都在重现学起&#xff09; 总代码在最下边 准备详细介绍下昨天&#xff08;c&#xff09;做的水果忍者修改器&#xff08;新手完全听得懂&…

C++---虚函数(8)

多态 虚函数 虚函数就是在类的成员函数声明前加virtual&#xff0c;该成员函数就变成了虚函数。一旦一个类中有虚函数&#xff0c;编译器就会为该类生成虚函数表。 虚函数表中一个元素记录一个虚函数的地址&#xff0c;使用该类构造对象时&#xff0c;对象前4(8)个字节记录虚…

java 手机号码归属地查询

java 手机号码归属地查询 参考链接: https://www.cnblogs.com/yuyuchen/p/10417220.html 下面是利用第三方接口实现手机号码归属地查询 package com.test.yyc;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.n…

python查询手机号码归属地

简单的一个例子&#xff0c;主要使用phone模块,l利用循环对输入的手机号进行查询&#xff0c;并保存在.txt文件中。 一、phone模板 主要功能&#xff1a;查询手机号的所属省份、所属市区、邮 编、电话区号、运 营 商等 二、使用步骤 1.引入库 代码如下&#xff08;示例&…

Flutter 极简 Dio 组件二次封装文档

Flutter Dio 组件二次封装文档 前言一、添加依赖二、创建封装类三、使用封装类四、拦截器五、错误处理总结 前言 本文档介绍了如何通过二次封装 Flutter Dio 组件来简化网络请求的过程。通过封装&#xff0c;我们可以提高代码复用性&#xff0c;简化调用方式&#xff0c;并添加…

java/android查询手机固话归属地、GSM卡信息

Model.xml <?xml version"1.0" encoding"utf-8"?> <soap12:Envelope xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd"http://www.w3.org/2001/XMLSchema" xmlns:soap12"http://www.w3.org/2003/05/…

Java手机号码归属地查询

Java手机号码归属地查询 通过手机号码返回该号码对应的省、市及运营商 涉及的jar包或pom依赖 libphonenumbergeocodercarrierprefixmapper 代码清单如下&#xff1a; 代码涉及PhoneUtil、PhoneModel两个类&#xff1a; PhoneUtil&#xff1a;手机号码归属地查询工具类&#x…

android实现号码归属地,Android手机号码归属地的查询

一个简单的Demo&#xff0c;从聚合数据申请手机号码归属地数据接口&#xff1b; 在EditText中输入待查询号码&#xff0c;获取号码后在子线程中使用HttpUrlconnection获取JSON数据&#xff0c;之后进行解析&#xff1b; 数据获取完成后&#xff0c;在主线程中更新UI&#xff0c…

php判断号码归属,php手机号码归属地查询

今天一同行通过本站的联系 QQ 找到我问我使用 php 实现手机号码归属地查询是如何实现的&#xff0c;本以为这个百度一下&#xff0c;应该有很多相关代码的&#xff0c;鉴于本网站阅读者对本人的信赖&#xff0c;也将本站用php实现的手机号码归属地查询代码分享一下&#xff0c;…

使用libphonenumber格式化手机号以及归属地查询

使用libphonenumber格式化手机号以及归属地查询 问题&#xff1a; 需要根据用户输入的手机号 &#xff0c;格式化 输出 对应的国际标准手机号格式。比如&#xff1a;输入&#xff1a;18666666666 > 86 186 6666 6666 解决&#xff1a; 使用到了Google的一个号码解析库&a…

2016-中国。联通移动号码归属地查询(省市代码)

各级省份代码: switch (procodes){case "100": retS = "北京"; break;case "551": retS = "安徽"; break

java查询手机号码归属地_Java代码总结【1】_查询手机号码归属地

这段代码是查询指定手机号的代码归属地&#xff0c;输出格式为【省份运营商】 public static String checkMobilePlace(String mobilephone) throws IOException { //检测手机号码归属地 URL url new URL( "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel&q…

Android手机中获取手机号码和运营商信息

代码如下&#xff1a; package com.pei.activity;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;/*** class name&#xff1a…

安卓拨号界面查询*#代码大全(由于最近普通用户爱玩这些黑科技,于是在网上找了些)

Android手机可以通过以下命令查看到使用记录&#xff0c;痕迹&#xff1a; *#*#4636#*#*   显示手机资讯、电池资讯、电池记录、使用统计资料、WiFi 资讯   *#*#7780#*#*   重设为原厂设定&#xff0c;不会删除预设程式&#xff0c;及SD 卡档案。   *2767*3855#   重…