ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言在二维数组基础上实现贪吃蛇

2022-03-21 22:06:16  阅读:297  来源: 互联网

标签:newH int movedirection canvas C语言 Width 二维 贪吃蛇 printf


欢迎在此基础上创新


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define High  20
#define Width 30
int food_x, food_y;												    //食物位置
int canvas[High][Width] = { 0 };								    //游戏区域的大小			
int movedirection;  									            //小蛇的移动方向,1向上,2向下,3向左,4向右
void menu()                                                         //游戏菜单
{
	printf("************************\n");
	printf("*****  1.开始游戏  *****\n");
	printf("*****  0.退出游戏  *****\n");
	printf("*****[wsad控制方向]*****\n");
}


void gotoxy(int x, int y)										    //将光标移动到(x,y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord;
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(handle,coord);
}


void startup()													    //数据初始化
{
	int i = 0, j = 0;                                               //将数组初始化,以循环进行游戏 
	for(i = 0; i < High; i++)
	{
		for (j = 0; j < Width; j++)
		{
			canvas[i][j] = 0;
		}

	}

	for(i = 0; i < High; i++)                                       //设置边框
	{
		canvas[i][0] = -1;
		canvas[i][Width - 1] = -1;
	}
	for(i = 0; i < Width; i++)                                      //设置边框
	{
		canvas[0][i] = -1;
		canvas[High - 1][i] = -1;
	}
	canvas[High / 2][Width / 2] = 1;                                 //设置蛇头
	for(i = 1; i < 5; i++)                                          //设置蛇身
	{
		canvas[High / 2][Width / 2 - i] = i + 1;
	}
	movedirection = 1;                                               //初始蛇向上走
	srand((unsigned)time(NULL));                                     //随机数
	food_x = rand() % (High - 5) + 2;                                //设置食物
	food_y = rand() % (Width - 5) + 2;
	canvas[food_x][food_y] = -2;
}

void show()													    	 //显示画面
{
	gotoxy(0, 0);											         //光标移动到原点,以下重画清屏
	int i = 0, j = 0;
	for(i = 0; i < High; i++)
	{	for(j = 0; j < Width; j++)
		{
			if(canvas[i][j] == 0)
				printf(" ");
			else if(canvas[i][j] == -1)
				printf("#");                                          //输出边框 
			else if(canvas[i][j] == 1)
				printf("@");                                          //输出蛇头  
			else if(canvas[i][j] > 1)
				printf("*");                                          //输出蛇身  
			else if(canvas[i][j] == -2)
				printf("$");                                          //输出食物
		}
	printf("\n");
	}
Sleep(150);                                                           //可以更改游戏速度
}

void game()
{
	void updatewithoutinput();
	void updatewithinput();
	while (1)
	{
		show();												         //显示画面
		updatewithoutinput();								         //与用户输入无关的更新
		updatewithinput();									         //与用户输入有关的更新
	}
}

void movesnake()												     //蛇的移动
{
	int i = 0, j = 0;
	for(i = 1; i < High - 1; i++)
		for(j = 1; j < Width - 1; j++)
			if(canvas[i][j] > 0)
			   canvas[i][j]++;


	int oldT_i, oldT_j, oldH_i, oldH_j;
	int max = 0;

	for(i = 1; i < High - 1; i++)
		for(j = 1; j < Width - 1; j++)
			if(canvas[i][j] > 0)
			{
				if(max < canvas[i][j])
				{
					max = canvas[i][j];
					oldT_i = i;
					oldT_j = j;
				}
				if(canvas[i][j] == 2)
				{
					oldH_i = i;
					oldH_j = j;
				}
			}


	int newH_i = 0, newH_j = 0;
	if(movedirection == 1)                                          //蛇向上移  
	{
		newH_i = oldH_i - 1;
		newH_j = oldH_j;
	}
	if(movedirection == 2)                                          //蛇向下移
	{
		newH_i = oldH_i + 1;
		newH_j = oldH_j;
	}
	if(movedirection == 3)                                          //蛇向左移
	{
		newH_i = oldH_i;
		newH_j = oldH_j - 1;
	}
	if(movedirection == 4)                                          //蛇向右移
	{
		newH_i = oldH_i;
		newH_j = oldH_j + 1;
	}
	if(canvas[newH_i][newH_j] == -2)                                //重置食物
	{
		canvas[food_x][food_y] = 0;
		food_x = rand() % (High - 5) + 2;
		food_y = rand() % (Width - 5) + 2;
		canvas[food_x][food_y] = -2;
	}
	else
		canvas[oldT_i][oldT_j] = 0;

	if(canvas[newH_i][newH_j] > 0 || canvas[newH_i][newH_j] == -1)  //判断游戏是否结束
	{
		printf("游戏结束!\n");
		Sleep(1000);

		int a = 0;
		do														     //选择是否继续游戏
		{
			menu();												     //游戏菜单
			printf("请选择");
			scanf("%d", &a);
			switch (a)
			{
			case 1:
				system("cls");									     //清空屏幕		
				startup();										     //数据初始化
				game();
				break;
			case 0:
				printf("退出游戏");
				break;
			default:
				printf("选择错误,请重新选择");
				break;
			}
		} while (a);
		exit(0);
	}
	else
		canvas[newH_i][newH_j] = 1;

}



void updatewithoutinput()									         //与用户输入无关的更新
{
	movesnake();
}

void updatewithinput()										         //与用户输入有关的更新
{
	char input;

	if(_kbhit())
	{
		input = _getch();
		if(input == 'a'&&movedirection!=4)                                           //蛇向左移 
		{
			movedirection = 3;
			movesnake();
		}
		else if(input == 'd'&&movedirection != 3)                                      //蛇向右移
		{
			movedirection = 4;
			movesnake();
		}
		else if(input == 'w'&&movedirection != 2)                                      //蛇向上移
		{
			movedirection = 1;
			movesnake();
		}
		else if(input == 's'&&movedirection != 1)                                      //蛇向下移
		{
			movedirection = 2;
			movesnake();
		}
	}
}

int main()
{
	int a = 0;
	do
	{
		menu();												         //游戏菜单
		printf("请选择");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			startup();										         //数据初始化
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (a);

	return 0;
}

标签:newH,int,movedirection,canvas,C语言,Width,二维,贪吃蛇,printf
来源: https://blog.csdn.net/qq_64825311/article/details/123647425

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有