#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
typedef struct snake
{
int x, y;//坐标
int direction;//移动方向 上1 左2 下3 右4
snake * next;
}*Msnake;
struct food
{
int x, y;
}F;
struct food2
{
int x, y;
}F2;
struct food1
{
int x, y;
}F1[800];
struct food3
{
int x, y;
}F12[800];
int ai=0,k=0,ai2=0,k2=0,a=1,b=1;
int level; //等级
int lengt = 4;//蛇长度
int lengt2 = 4;//蛇2长度
int t;//用于计时
int score = 0; //获得成绩
int score2 = 0; //2获得成绩
int l;// 用于记录不同等级的速度
int n = 0;//吃到食物个数
int n2 = 0;//2吃到食物个数
snake * creat();//初始话蛇的位置及长度
snake * creat2();//初始话蛇2的位置及长度
void showMain();//画出终端的大小及命名 画出游戏界面(边框,提示,基本成绩etc)
void gotoxy(int x, int y); //光标的移动
void c(int k); //颜色选择
int time(); //用来计时
void ycgb(int k); //隐藏光标
void game(); //具体游戏运行
void draw(snake * head); //真正画蛇
void newfood(snake * head);// //随机产生食物并保证食物不与蛇的坐标重合
void newfood2(snake * head);// //随机产生食物并保证食物不与蛇2的坐标重合
void newfood1(snake * head); //随机产生障碍并保证障碍不与蛇的坐标重合
void newfood3(snake * head); //随机产生障碍并保证障碍不与蛇2的坐标重合
int random(); //用来输出随机值
int direc(char ch);//方向键设置
int direc2(char ch);//方向键设置
void key(snake * head,snake*head1, snake * p,char ch); //改变蛇的方向功能的实现
void key2(snake * head,snake*head1, snake * p2,char ch); //改变蛇2的方向功能的实现
void pause(snake * head,snake*head1, snake * p,char ch); //暂停功能的实现
void cls();//清屏
void cls2();//清屏 2
int judge(int a,int b);//进行哪一方失败判断
int main()
{
ycgb(0);
showMain();
game();
while (1)
{
cls();
gotoxy(32,10);
c(10);
printf("按回车可重新开始游戏!");
gotoxy(34,11);
printf("按Esc可离开游戏!");
cls2();
gotoxy(114,10);
printf("按回车可重新开始游戏!");
gotoxy(116,11);
printf("按Esc可离开游戏!");
char ch;
ch = getch();
while (ch != 13 && ch != 27)
{
ch = getch();
}
if (ch == 13)
{
showMain();
game();
}
else break;
}
return 0;
}
int direc(char ch)//方向键设置
{
if (ch == 119) return 1;
if (ch == 97) return 2;
if (ch == 115) return 3;
if (ch == 100) return 4;
return 0;
}
int direc2(char ch)//2方向键设置
{
ch = getch();
if (ch == 72) return 1;
if (ch == 80) return 3;
if (ch == 75) return 2;
if (ch == 77) return 4;
return 0;
}
snake * creat() // 初始话蛇的位置及长度
{
snake *head, *p, *q;
head = (snake *) malloc (sizeof(snake));
head->x = 28;
head->y = 10;
head->direction = 4;
head->next = NULL;
p = head;
for (int i = 0; i < 3; i++)
{
q = (snake *) malloc (sizeof(snake));
p->next = q;
q->next = NULL;
q->x = p->x + 2;
q->y = p->y;
q->direction = p->direction;
p = q;
}
return head;
}
snake * creat2() // 初始话蛇2的位置及长度
{
snake *head2, *p, *q;
head2 = (snake *) malloc (sizeof(snake));
head2->x = 110;
head2->y = 10;
head2->direction = 4;
head2->next = NULL;
p = head2;
for (int i = 0; i < 3; i++)
{
q = (snake *) malloc (sizeof(snake));
p->next = q;
q->next = NULL;
q->x = p->x + 2;
q->y = p->y;
q->direction = p->direction;
p = q;
}
return head2;
}
void showMain()//画出终端的大小及命名 画出游戏界面(边框,提示,基本成绩etc)
{
int i;
system("title 贪吃蛇.生死局双人");
system("mode con cols=162 lines=35");
gotoxy(28, 10);
c(10);
printf("欢迎进入贪吃蛇的世界!!");
gotoxy(108, 10);
c(10);
printf("欢迎进入贪吃蛇的世界!!");
gotoxy(0, 0);
c(3);
for (i = 0; i < 40; i++)
{
printf("▇");
Sleep(30);
}
for (i = 1; i < 25; i++)
{
gotoxy(78, i);
printf("▇");
Sleep(30);
}
for (i = 39; i >= 0; i--)
{
gotoxy(2*i, 25);
printf("▇");
Sleep(30);
}
for (i = 24; i >= 1; i--)
{
gotoxy(0, i);
printf("▇");
Sleep(30);
}
gotoxy(82, 0);
c(3);
for (i = 0; i < 40; i++)
{
printf("▇");
Sleep(30);
}
for (i = 1; i < 25; i++)
{
gotoxy(160, i);
printf("▇");
Sleep(30);
}
for (i = 39; i >= 0; i--)
{
gotoxy(2*i+82, 25);
printf("▇");
Sleep(30);
}
for (i = 24; i >= 1; i--)
{
gotoxy(82, i);
printf("▇");
Sleep(30);
}
c(10);
gotoxy(30, 11);
printf("请选择难度(0~6):");
scanf("%d", &level);
switch(level)
{
case 1: l = 600;break;
case 2: l = 400;break;
case 3: l = 200;break;
case 4: l = 150;break;
case 5: l = 100;break;
case 6: l = 60;break;
default: l = 2333; break;
}
cls();
cls2();
c(15);
gotoxy(4, 26);
printf("等级: %d", level);
gotoxy(20, 26);
printf("分数: %d", score);
gotoxy(4, 27);
printf("当前长度: %d", lengt);
gotoxy(20, 27);
printf("已吃食物个数: %d", n);
gotoxy(45, 26);
printf("移动:↑↓←→");
gotoxy(45, 27);
printf("暂停or继续:空格");
c(13);
gotoxy(86, 26);
printf("等级: %d", level);
gotoxy(106, 26);
printf("分数: %d", score);
gotoxy(86, 27);
printf("当前长度: %d", lengt);
gotoxy(106, 27);
printf("已吃食物个数: %d", n);
gotoxy(127, 26);
printf("移动:↑↓←→");
gotoxy(127, 27);
printf("暂停or继续:空格");
gotoxy(64,30);
c(10);
printf("触碰绿色球游戏结束!黄色球能让你的小可爱生长!");
gotoxy(74,31);
printf("生长到一定长度会升级哦!");
gotoxy(150, 33);
printf("制作:秋志");
}
void key(snake * head,snake* head1, snake * p,char ch)//改变蛇1的方向的实现
{
int i, j;
i = direc(ch);
j = p->direction;
if ((i==1&&j==3)||(i==2&&j==4)||(i==3&&j==1)||(i==4&&j==2));//判断是否与原有方向相冲突
else
p->direction = i;
}
void pause(snake * head,snake*head1, snake * p2,char ch)//暂停功能的实现
{
int i;
if(a==1)
{
cls();
gotoxy(36,10);
printf("暂停中");
}
if(b==1)
{
cls2();
gotoxy(118,10);
printf("暂停中");
}
while (1)
{
if (kbhit() && getch() == 32)
{
if(a==1)
{
gotoxy(36,10);
printf(" ");
draw(head);
gotoxy(F.x, F.y);
c(12);
printf("●");
for(i=0;i<ai;i++)
{
gotoxy(F1[i].x,F1[i].y);
c(10);
printf("●");
}
}
if(b==1)
{
gotoxy(118,10);
printf(" ");
draw(head1);
gotoxy(F2.x, F2.y);
c(12);
printf("●");
for(i=0;i<ai2;i++)
{
gotoxy(F12[i].x,F12[i].y);
c(10);
printf("●");
}
}
break;
}
}
}
void key2(snake * head,snake*head1, snake * p2,char ch)//改变蛇2的方向与暂停功能的实现
{
int i,j;
i = direc2(ch);
j = p2->direction;
if ((i==1&&j==3)||(i==2&&j==4)||(i==3&&j==1)||(i==4&&j==2));//判断是否与原有方向相冲突