贪吃蛇游戏

C语言实现经典游戏贪吃蛇
吃到果实蛇的长度会变大,如果碰到墙壁或者果实就会gameover
windows平台下实现

代码如下:
gmae.h:

#pragma once
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

void HideCursor();
void gotoxy(int x, int y);
void DataInit();
void Show();
void UpdateWithoutInput();
void UpdateWithInput();
void MoveSnakeByDirection();

#define HIGH 20
#define WIDTH 30

test.cpp:

#include "game.h"

int canvas[HIGH][WIDTH] = { 0 };
int score;
int MoveDirection;
int food_x, food_y;

int main()
{
	HideCursor();   //隐藏光标
	DataInit();     //数据初始化
	while (1)
	{
		Show();         //显示画面
		UpdateWithoutInput();     //与用户无关的数据更新
		UpdateWithInput();        //与用户有关的数据更新
	}
	return 0;
}

game.cpp:

#include "game.h"

extern int canvas[HIGH][WIDTH];
extern int score;
extern int MoveDirection;
extern int food_x, food_y;

void DataInit()
{
	int i = 0, j = 0;

	for (i = 0; i < HIGH; i++)//初始化边框
	{
		for (j = 0; j < WIDTH; j++)
		{
			canvas[i][j] = 0;
			canvas[0][j] = -1;
			canvas[HIGH - 1][j] = -1;
			canvas[i][0] = -1;
			canvas[i][WIDTH - 1] = -1;
		}
	}

	canvas[HIGH / 2][WIDTH / 2] = 1;//初始化蛇头

	for (i = 1; i <= 4; i++)//初始化蛇身
	{
		canvas[HIGH / 2][WIDTH / 2 - i] = i + 1;
	}

	MoveDirection = 4;

	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] == -1)
			{
				printf("#");
			}
			else 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] == -2)
			{
				printf("F");
			}
		}
		printf("\n");
	}
	Sleep(100);
}

void UpdateWithoutInput()
{
	MoveSnakeByDirection();
}

void UpdateWithInput()
{
	char input;

	if (_kbhit())
	{
		input = _getch();
		if (input == 'w')
		{
			MoveDirection = 1;
			MoveSnakeByDirection();
		}
		if (input == 's')
		{
			MoveDirection = 2;
			MoveSnakeByDirection();
		}
		if (input == 'a')
		{
			MoveDirection = 3;
			MoveSnakeByDirection();
		}
		if (input == 'd')
		{
			MoveDirection = 4;
			MoveSnakeByDirection();
		}
	}
}

void MoveSnakeByDirection()
{
	int i = 0, j = 0;

	for (i = 1; i < HIGH - 1; i++)
	{
		for (j = 0; j < WIDTH - 1; j++)
		{
			if (canvas[i][j] >= 1)
			{
				canvas[i][j]++;
			}
		}
	}

	int OldTail_i, OldTail_j, OldHead_i, OldHead_j;
	int max = 0;

	for (i = 1; i < HIGH - 1; i++)
	{
		for (j = 0; j < WIDTH - 1; j++)
		{
			if (max < canvas[i][j])
			{
				max = canvas[i][j];
				OldTail_i = i;
				OldTail_j = j;
			}

			if (canvas[i][j] == 2)
			{
				OldHead_i = i;
				OldHead_j = j;
			}
		}
	}

	int newHead_i = 0,newHead_j = 0;
	if (MoveDirection == 1)
	{
		newHead_i = OldHead_i - 1;
		newHead_j = OldHead_j;
	}
	if (MoveDirection == 2)
	{
		newHead_i = OldHead_i + 1;
		newHead_j = OldHead_j;
	}
	if (MoveDirection == 3)
	{
		newHead_i = OldHead_i;
		newHead_j = OldHead_j - 1;
	}
	if (MoveDirection == 4)
	{
		newHead_i = OldHead_i;
		newHead_j = OldHead_j + 1;
	}

	if (canvas[newHead_i][newHead_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[OldTail_i][OldTail_j] = 0;
	}

	if (canvas[newHead_i][newHead_j] > 0 || canvas[newHead_i][newHead_j] == -1)
	{
		printf("WASTED!!!\n");
		Sleep(2000);
		system("pause");
		exit(0);
	}
	else
	{
		canvas[newHead_i][newHead_j] = 1;
	}

}

fix.cpp:
主要用来修复闪屏和隐藏光标,可以用cls来代替

#include "game.h"
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值