#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define High 28
#define Width 70
#define Long 4
int food_x, food_y; //食物位置
int snake1[High][Width] = { 0 }; //小蛇1与游戏区域大小
int snake2[High][Width] = { 0 }; //小蛇2与游戏区域大小
int movedirection1, movedirection2; //小蛇的移动方向
void menu()
{
printf("************************\n");
printf("***** 1.开始游戏 *****\n");
printf("***** 0.退出游戏 *****\n");
printf("************************\n");
}
void color(int x) //改变输出颜色
{
if (x >= 0 && x <= 15) //参数在0-15的范围颜色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数x,改变字体颜色
}
else//默认的颜色白色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
}
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 startup() //数据初始化
{
int i = 0, j = 0;
for (i = 0; i < High; i++)
{
for (j = 0; j < Width; j++)
{
snake1[i][j] = 0;
snake2[i][j] = 0;
}
}
for (i = 0; i < High; i++)
{
snake1[i][0] = snake1[i][Width - 1] = -1;
snake2[i][0] = snake2[i][Width - 1] = -1;
}
for (i = 0; i < Width; i++)
{
snake1[0][i] = snake1[High-1][i] = -1;
snake2[0][i] = snake2[High-1][i] = -1;
}
snake1[High / 2+3][Width / 2] = 1;
snake2[High / 2-3][Width / 2] = 1;
for (i = 1; i <= Long-1; i++)
{
snake1[High / 2+3][Width / 2 - i] = i + 1;
snake2[High / 2-3][Width / 2 - i] = i + 1;
}
movedirection1 = 1;
movedirection2 = 2;
food_x = rand() % (High - 5) + 2;
food_y = rand() % (Width - 5) + 2;
snake2[food_x][food_y] = snake1[food_x][food_y] = -2;
}
void sna1() //显示画面
{
gotoxy(0, 0); //光标移动到原点,以下重画清屏
int i = 0, j = 0;
for (i = 0; i < High; i++)
{
for (j = 0; j < Width; j++)
{
if (snake1[i][j] == -2)
printf("F");
else if (snake1[i][j] == 0)
printf(" ");
else if (snake1[i][j] == 1)
printf("@");
else if (snake1[i][j] > 1)
printf("*");
else if (snake1[i][j] == -1)
{
printf("#");
}
}
printf("\n");
}
}
void sna2() //显示画面
{
gotoxy(0, 0); //光标移动到原点,以下重画清屏
int i = 0, j = 0;
for (i = 0; i < High; i++)
{
for (j = 0; j < Width; j++)
{
if (snake2[i][j] == -2)
printf("F");
else if (snake2[i][j] == 0)
printf(" ");
else if (snake2[i][j] == 1)
printf("@");
else if (snake2[i][j] > 1)
printf("*");
else if (snake2[i][j] == -1)
{
printf("#");
}
}
printf("\n");
}
}
void game()
{
void updatewithoutinput();
void updatewithinput();
startup(); //数据初始化
while (1)
{
sna1(); //显示画面
sna2();
updatewithoutinput(); //与用户输入无关的更新
updatewithinput(); //与用户输入有关的更新
Sleep(300);
}
}
void movesnake() //蛇的移动
{
int i = 0, j = 0;
for (i = 1; i < High - 1; i++)
for (j = 1; j < Width - 1; j++)
{
if (snake1[i][j] > 0)
snake1[i][j]++;
if (snake2[i][j] > 0)
snake2[i][j]++;
}
int oldT_i1, oldT_j1, oldH_i1, oldH_j1;
int oldT_i2, oldT_j2, oldH_i2, oldH_j2;
int max1 = 0, max2 = 0;
for (i = 1; i < High - 1; i++)
for (j = 1; j < Width - 1; j++)
{
if (snake1[i][j] > 0)
{
if (max1 < snake1[i][j])
{
max1 = snake1[i][j];
oldT_i1 = i;
oldT_j1 = j;
}
if (snake1[i][j] == 2)
{
oldH_i1 = i;
oldH_j1 = j;
}
}
if (snake2[i][j] > 0)
{
if (max2 < snake2[i][j])
{
max2 = snake2[i][j];
oldT_i2 = i;
oldT_j2 = j;
}
if (snake2[i][j] == 2)
{
oldH_i2 = i;
oldH_j2 = j;
}
}
}
int newH_i1 = 0, newH_j1 = 0;
int newH_i2 = 0, newH_j2 = 0;
if (movedirection1 == 1)
{
newH_i1 = oldH_i1 - 1;
newH_j1 = oldH_j1;
}
if (movedirection1 == 2)
{
newH_i1 = oldH_i1 + 1;
newH_j1 = oldH_j1;
}
if (movedirection1 == 3)
{
newH_i1 = oldH_i1;
newH_j1 = oldH_j1 - 1;
}
if (movedirection1 == 4)
{
newH_i1 = oldH_i1;
newH_j1 = oldH_j1 + 1;
}
if (movedirection2 == 1)
{
newH_i2 = oldH_i2 - 1;
newH_j2 = oldH_j2;
}
if (movedirection2 == 2)
{
newH_i2 = oldH_i2 + 1;
newH_j2 = oldH_j2;
}
if (movedirection2 == 3)
{
newH_i2 = oldH_i2;
newH_j2 = oldH_j2 - 1;
}
if (movedirection2 == 4)
{
newH_i2 = oldH_i2;
newH_j2 = oldH_j2 + 1;
}
if (snake1[newH_i1][newH_j1] == -2)
{
snake2[food_x][food_y] = snake1[food_x][food_y] = 0; //更新食物
food_x = rand() % (High - 5) + 2;
food_y = rand() % (Width - 5) + 2;
snake2[food_x][food_y] = snake1[food_x][food_y] = -2;
}
else
snake1[oldT_i1][oldT_j1] = 0;
if (snake2[newH_i2][newH_j2] == -2)
{
snake2[food_x][food_y] = snake1[food_x][food_y] = 0; //更新食物
food_x = rand() % (High - 5) + 2;
food_y = rand() % (Width - 5) + 2;
snake2[food_x][food_y] = snake1[food_x][food_y] = -2;
}
else
snake2[oldT_i2][oldT_j2] = 0;
if (snake1[newH_i1][newH_j1] > 0 || snake1[newH_i1][newH_j1] == -1|| snake2[newH_i2][newH_j2] > 0 || snake2[newH_i2][newH_j2] == -1)
{
printf("游戏结束!\n");
Sleep(1000);
int a = 0;
do //选择是否继续游戏
{
menu(); //游戏菜单
printf("请选择");
scanf("%d", &a);
switch (a)
{
case 1:
system("cls"); //清空屏幕
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择");
break;
}
} while (a);
exit(0);
}
else
snake1[newH_i1][newH_j1] = snake2[newH_i2][newH_j2] = 1;
}
void updatewithoutinput() //与用户输入无关的更新
{
movesnake();
}
void updatewithinput() //与用户输入有关的更新
{
if (_kbhit())
{
switch( _getch())
{
case 0xE0:switch (_getch())
{
case 72:if (movedirection2 != 2)
movedirection2 = 1;
break;
case 80:if (movedirection2 != 1)
movedirection2 = 2;
break;
case 75:if (movedirection2 != 4)
movedirection2 = 3;
break;
case 77:if (movedirection2 != 3)
movedirection2 = 4;
break;
}break;
case'a':
case'A':if ( movedirection1 != 4)
{
movedirection1 = 3;
movesnake();
break;
}
case'D':
case'd' :if (movedirection1 != 3)
{
movedirection1 = 4;
movesnake();
break;
}
case'W':
case'w' :if( movedirection1 != 2)
{
movedirection1 = 1;
movesnake();
break;
}
case'S':
case's':if (movedirection1 != 1)
{
movedirection1 = 2;
movesnake();
break;
}
default:break;
}
}
}
int main()
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
int a = 0;
do
{
menu(); //游戏菜单
printf("请选择");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择");
break;
}
} while (a);
return 0;
}
贪吃蛇双人版
最新推荐文章于 2025-05-19 19:10:17 发布