#进击的贪吃蛇-----将贪吃蛇,飞机大战,坦克大战功能融合形成新的游戏。
想必很多大一新生在刚学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
#include
#include
#include
#include
#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;//子弹CD
int 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;//技能的CD
for(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;
}
else
bullet[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;
}
else
bullet[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;
}
else
bullet[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;
}
else
bullet[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]++;
}
}//蛇头,蛇身值加1
for(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;
}
else
bulletenemy[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;
}
else
bulletenemy[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;
}
else
bulletenemy[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;
}
else
bulletenemy[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;
}
}//发射子弹CD
if(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;
}