贪吃蛇双人版

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值