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

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

想必很多大一新生在刚学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;//子弹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;
}


  • 38
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值