手敲最基础C语言代码----“贪吃蛇”

C语言创作游戏----第二弹----贪吃蛇(无限吃)


 主函数系列:

        创建引入头文件----方便查看代码!!

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<graphics.h>
#include"贪吃蛇.h"

int main()
{
	//设置cmd窗口的名字!
	system("title 无限吃!");

	//生成随机数种子!
	srand((size_t)time(NULL));

/**************************  光标的清除   *************************************/
	CONSOLE_CURSOR_INFO cursor;						 //定义光标信息的结构体变量
	cursor.dwSize = sizeof(cursor);				   	 //检测光标大小
	cursor.bVisible = FALSE;						 //将光标设置为不可见
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台信息
	SetConsoleCursorInfo(handle, &cursor);			 //设置光标信息
/******************************************************************************/
					
						/*******************************/
						/****	主函数列表:		    ****/
	Init_wall();		/****		初始化界面		****/
	Init_food();		/****		食物的初始化	    ****/
	Init_snake();		/****		蛇的定义		    ****/
	Play_game();		/****		游戏基本操作	    ****/
	system("cls");		/*******************************/
	printf(">>>>	持续优化中....	<<<<\n");
	printf(">>>>	敬请期待....	<<<<\n");


	return 0;
}

 定义全局变量:
            设置蛇所有定义:            
                    1*身体坐标        (X-Y)  
                     2*身体长度        (size) 
                     3*身体大小范围  (60*20)  
           图形界面:                   
                    高 x 长:20 x 60        
           定义食物:(二维数组)      
                    food[0]== X 坐标;
                    food[1]== Y 坐标;   

struct Body
{
	int x;
	int y;
};
struct Snake
{
	int size;
	struct Body body[60 * 20];
}snake;
void Init_snake()
{
	//蛇头
	snake.body[0].x = 30;
	snake.body[0].y = 10;
	//蛇身子
	snake.size = 2;
	snake.body[1].x = 29;
	snake.body[1].y = 10;
}	

int food[2] = { 0 };
//int scoure = 0;-----分数定义为全局变量

void Init_food()
{
	food[0] = rand() % 56 + 2;
	food[1] = rand() % 14 + 2;
}
//************		定义蛇的移动增量----1 / -1
int dx = 0;
int dy = 0;
//*************		定义尾巴坐标为空——方便蛇移动的同时,坐标之间的转换!!!
int px = 0;
int py = 0;

 对于图标信息的显示:

        px/py:全局变量中提前定义为空-----方便蛇身增长时,身体坐标的转变!!!

        Set Console Cursor Position:设置 控制台 光标 位置(合成词)


//************		显示图标信息界面!!!
void Show_UI()
{
	COORD coord;
	coord.X = px;
	coord.Y = py;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	printf("  ");
	for (int i = 0; i < snake.size; i++)
	{
		coord.X = snake.body[i].x;
		coord.Y = snake.body[i].y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		if (i == 0)
			printf("蛇"); //********	打印蛇头
		else
			printf("口"); //********	打印蛇身
	}
	coord.X = food[0];
	coord.Y = food[1];
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	printf("▲");
}

 墙体的打印设置:

        一个中文字会占两个字符!

//***********		打印墙体!!!
void Init_wall()
{
	int map[20][30] = { 0 };
	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			if (i == 0 || i == 21)
			{
				printf("墙");
			}
			else if (j == 0 || j == 31)
			{
				printf("墙");
			}
			else
			{
				printf("  ");//两个字符!
			}
		}
		printf("\n");
	}
}

 游戏的操作设置:
        蛇的移动:        
                1*获取持续移动操作! 
                2*坐标增减量实现对坐标方向的转换 

//***********		玩游戏操作!!!
void Play_game()
{		/*********************		处于有效界面内操作		*****************/
	char move = 'd';
	while (snake.body[0].x > 1 && snake.body[0].x < 60
		&& snake.body[0].y > 0 && snake.body[0].y < 21)
	{
		/*********************			显示界面			*******************/
		Show_UI();

		while (_kbhit())
		{
			move = _getch();
		}
		switch (move)
		{
		case'w':	dx = 0; dy = -1;	break;
		case'a':	dx = -1; dy = 0;	break;
		case's':	dx = 0; dy = 1;		break;
		case'd':	dx = 1; dy = 0;		break;

		default:
			break;
		}
		/*********************	 判断蛇头是否会咬自己身子!	*****************/
		for (int i = 1; i < snake.size; i++)
		{
			if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y)
			{
				return;
			}
		}
		/*********************		 当蛇吃到食物时!		*****************/
		if (snake.body[0].x == food[0] && snake.body[0].y == food[1])
		{
			snake.size++;
			Init_food();
			//scoure += 10;-----分数增加的位置!!!!
		}
		/*********************		 蛇的身体增长		*****************/
		px = snake.body[snake.size - 1].x;
		py = snake.body[snake.size - 1].y;

		for (int i = snake.size - 1; i > 0; i--)
		{//*************    snake.size 初始值为 2;body[0] + body[1]
			snake.body[i].x = snake.body[i - 1].x;
			snake.body[i].y = snake.body[i - 1].y;
		}
		snake.body[0].x += dx;
		snake.body[0].y += dy;

		//*********   设置蛇的速度!
		Sleep(100);
	}
}

头文件系列汇总:

        坐标体系/地图大小/蛇身大小限制-----可自由定义!!!

#pragma once
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<graphics.h>

/***********************************************************************/
/*****************	 设置蛇所有定义:					    ****************/
/*****************	 		1*身体坐标		(X-Y)		****************/
/*****************	 		2*身体长度		(size)	    ****************/
/*****************	 		3*身体大小范围  (60*20)	    ****************/
/*****************	 图形界面:							****************/
/*****************			高 x 长:20 x 60			    ****************/
/*****************	 定义食物:(二维数组)				    ****************/
/*****************			food[0]== X 坐标;			****************/
/*****************			food[1]== Y 坐标;			****************/
/***********************************************************************/

struct Body
{
	int x;
	int y;
};
struct Snake
{
	int size;
	struct Body body[60 * 20];
}snake;
void Init_snake()
{
	//蛇头
	snake.body[0].x = 30;
	snake.body[0].y = 10;
	//蛇身子
	snake.size = 2;
	snake.body[1].x = 29;
	snake.body[1].y = 10;
}	

int food[2] = { 0 };
//int scoure = 0;-----分数定义为全局变量

void Init_food()
{
	food[0] = rand() % 56 + 2;
	food[1] = rand() % 14 + 2;
}
//************		定义蛇的移动增量----1 / -1
int dx = 0;
int dy = 0;
//*************		定义尾巴坐标为空——方便蛇移动的同时,坐标之间的转换!!!
int px = 0;
int py = 0;

//************		显示图标信息界面!!!
void Show_UI()
{
	COORD coord;
	coord.X = px;
	coord.Y = py;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	printf("  ");
	for (int i = 0; i < snake.size; i++)
	{
		coord.X = snake.body[i].x;
		coord.Y = snake.body[i].y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		if (i == 0)
			printf("蛇"); //********	打印蛇头
		else
			printf("口"); //********	打印蛇身
	}
	coord.X = food[0];
	coord.Y = food[1];
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	printf("▲");
}

//***********		打印墙体!!!
void Init_wall()
{
	int map[20][30] = { 0 };
	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 32; j++)
		{
			if (i == 0 || i == 21)
			{
				printf("墙");
			}
			else if (j == 0 || j == 31)
			{
				printf("墙");
			}
			else
			{
				printf("  ");//两个字符!
			}
		}
		printf("\n");
	}
}

//***********		玩游戏操作!!!
void Play_game()
{		/*********************		处于有效界面内操作		*****************/
	char move = 'd';
	while (snake.body[0].x > 1 && snake.body[0].x < 60
		&& snake.body[0].y > 0 && snake.body[0].y < 21)
	{
		/*********************			显示界面			*******************/
		Show_UI();

		/*******************************************************************/
		/***************  蛇的移动:				            ****************/
		/***************	  1*获取持续移动操作!	            ****************/
		/***************      2*坐标增减量实现对坐标方向的转换  ****************/
		/******************************************************************/
		while (_kbhit())
		{
			move = _getch();
		}
		switch (move)
		{
		case'w':	dx = 0; dy = -1;	break;
		case'a':	dx = -1; dy = 0;	break;
		case's':	dx = 0; dy = 1;		break;
		case'd':	dx = 1; dy = 0;		break;

		default:
			break;
		}
		/*********************	 判断蛇头是否会咬自己身子!	*****************/
		for (int i = 1; i < snake.size; i++)
		{
			if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y)
			{
				return;
			}
		}
		/*********************		 当蛇吃到食物时!		*****************/
		if (snake.body[0].x == food[0] && snake.body[0].y == food[1])
		{
			snake.size++;
			Init_food();
			//scoure += 10;-----分数增加的位置!!!!
		}
		/*********************		 蛇的身体增长		*****************/
		px = snake.body[snake.size - 1].x;
		py = snake.body[snake.size - 1].y;

		for (int i = snake.size - 1; i > 0; i--)
		{//*************    snake.size 初始值为 2;body[0] + body[1]
			snake.body[i].x = snake.body[i - 1].x;
			snake.body[i].y = snake.body[i - 1].y;
		}
		snake.body[0].x += dx;
		snake.body[0].y += dy;

		//*********   设置蛇的速度!
		Sleep(100);
	}
}


        以上就是贪吃蛇内核代码!

        具体优化方式:

                利用工具---Easyx 图形库

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-King.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值