#進擊的貪吃蛇-----將貪吃蛇,飛機大戰,坦克大戰功能融合形成新的游戲,
想必很多大一新生在剛學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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241431.html
標籤:其他
下一篇:xdoj五星題172 構造運算式
