精华内容
下载资源
问答
  • 62套C语言小游戏源码

    2018-12-31 19:35:15
    这是楼主珍藏的62套C语言小游戏源码,包含吃豆人、俄罗斯方块、别踩白块等诸多经典小游戏。感兴趣的朋友可以下载下来研究。
  • C语言小游戏

    2018-03-22 14:46:14
    个人自主制作的C语言小游戏
  • 贪吃蛇游戏源代码,codeblocks写的c语言小游戏源代码,可以运行。
  • c语言小游戏合集

    热门讨论 2013-03-04 22:45:47
    这是我用c语言写的程序,我在大三上学期的劳动成果展示。我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有数据结构,window编程。我也在学c语言,每当我写完一个程序,我都会免费发上来。
  • C语言小游戏

    2012-10-26 06:08:59
    C语言小游戏,有地图编辑,有游戏逻辑设计,经过测试的,完全可以运行,在VS2008上开发的,希望您能喜欢。
  • 教你如何用c语言自制一个打砖块的游戏,包含思路,算法,和源代码。
  • C语言小游戏源程序,C语言小游戏源程序,游戏代码,c语言代码
  • 几个C语言小游戏源码

    2010-02-24 17:44:11
    几个C语言小游戏源码,很好用的,是学习c语言的好范例。喜欢能斑竹到大家。 第一:录制脚本 第二:脚本回放 第三:脚本优化 插入事物 插入集合点 设置参数 检查点 在事物之后添加一个log 日志输出函数 lr_log_...
  • 几个C语言小游戏源代码

    热门讨论 2011-03-26 20:59:25
    几个C语言小游戏源代码,如俄罗斯方块、贪吃蛇、五子棋等的源代码
  • C语言小游戏------贪吃蛇----小白专用

    万次阅读 多人点赞 2020-10-06 21:29:39
    C语言贪吃蛇小游戏 个人小白,后期也做了一些改进,附原视频地址(点击即可) 废话在后面直接上程序 该程序在VS2019上可完美运行。 #include<stdio.h> #include<stdlib.h> #include<Windows.h> #...

    C语言贪吃蛇小游戏

    视频正在随缘策划中。。。。

    废话在后面直接上程序

    该程序在VS2019上可完美运行。
    在这里插入图片描述

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    #include<time.h>
    #include<conio.h>
    constexpr auto maphigh = 28, mapwide = 84;
    struct virus
    {
    	int x;
    	int y;
    }virus;
    unsigned short snakesize = 50, speed = 300, len = 4;
    struct snake
    {
    	int x[50];
    	int y[50];
    	int len;//蛇的长度
    	int speed;//蛇的速度
    }snake;
    int key = 'w';//初始化方向
    void gotoxy(int x, int y);
    void drawmap();
    void keydown();
    void creatvirus();
    int snakestatus();
    void startgame();
    int menuselect();
    void goodbye();
    void introduce();
    void edition();
    int setup();
    void respect();
    int setup1();
    int modifydiffculty();
    void diffculty();
    int customize();
    void customize1();
    int main()
    {
    	for (;;)
    	{
    		system("cls");//清屏
    		switch (menuselect())
    		{
    		case 1://开始游戏
    			startgame();
    			break;
    		case 2://介绍
    			introduce();
    			break;
    		case 3://版本
    			edition();
    			break;
    		case 4://设置
    			setup1();
    			break;
    		case 5:
    			goodbye();
    			return 0;
    		default:
    			break;
    		}
    	}
    }
    void drawmap()//1.画地图
    {
    	//⊙:病毒    █:蛇身(占用两个字符)
    	srand((unsigned int)time(NULL));//随机病毒出现的位置
    	int i, k;
    	for (i = 0; i <= maphigh; i++)
    	{
    		gotoxy(0, i);
    		printf("█");//打印左边框
    		gotoxy(mapwide, i);
    		printf("█");//打印右边框
    	}
    	for (i = 0; i <= mapwide; i += 2)//+=2因为 █占两个字节
    	{
    		gotoxy(i, 0);
    		printf("█");//打印下边框
    		gotoxy(i, maphigh);
    		printf("█");//打印上边框
    	}
    	//画蛇
    	snake.len = len;
    	snake.speed = speed;
    	//初始化蛇的位置
    	snake.x[0] = mapwide / 2;
    	snake.y[0] = maphigh / 2;//[0]为蛇头的位置
    	//画蛇头
    	gotoxy(snake.x[0], snake.y[0]);
    	printf("█");
    	//画蛇身
    	for (k = 1; k < snake.len; k++)
    	{
    		snake.x[k] = snake.x[k - 1] + 2;
    		snake.y[k] = snake.y[k - 1];
    		gotoxy(snake.x[k], snake.y[k]);
    		printf("█");
    	}
    	while (1)
    	{
    		virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个
    		virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
    		if (virus.x % 2 == 0)
    			break;
    	}
    	gotoxy(virus.x, virus.y);
    	printf("⊙");
    	gotoxy(mapwide + 4, maphigh);
    	printf("⊙:%d", snakesize - snake.len);
    }
    void creatvirus()//2.产生病毒
    {
    	if (snake.x[0] == virus.x && snake.y[0] == virus.y)
    	{
    		//printf("\a");//声音
    		snake.len++;
    		srand((unsigned)time(NULL));
    		while (1)
    		{
    			int flag = 1;
    			virus.x = rand() % (mapwide - 4) + 2;//+2,+1这个与█所占的字符有关,长占两个字符宽1个
    			virus.y = rand() % (maphigh - 2) + 1;//画个图,显而易见
    		//产生的病毒不能在蛇的身上
    			for (int k = 0; k < snake.len; k++)
    			{
    				if (snake.x[k] == virus.x && snake.y[k] == virus.y)
    				{
    					flag = 0;//virus不合适的标志
    					break;
    				}
    			}
    			if (flag == 1 && virus.x % 2 == 0)//病毒位置合法且x坐标为偶数
    			{//x左右是以两个字节为单位运动的,若virus的x坐标为奇数,就不存在snake.x[k] == virus.x
    				break;
    			}
    		}
    	}
    	gotoxy(virus.x, virus.y);
    	printf("⊙");
    	gotoxy(mapwide + 8, 0);//将光标移走
    	printf("W");
    	gotoxy(mapwide + 6, 1);
    	printf("A S D \t进行控制");
    	gotoxy(mapwide + 4, maphigh);
    	printf("⊙:%d", snakesize - snake.len);
    }
    void keydown()//3.按键
    {
    	int i, temp;
    	if (_kbhit()) //kbhit函数检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
    	{
    		fflush(stdin);// 清空输入缓冲区,通常是为了确保不影响后面的数据读取
    		temp = _getch();//getch:从控制台读取一个字符,但不显示在屏幕上
    		if ((temp == 'a' || temp == 'A') && (key != 'D' && key != 'd'))//解决了按反方向键蛇自杀的问题
    		{
    			key = temp;
    		}
    		if ((temp == 'w' || temp == 'W') && (key != 's' && key != 'S'))
    		{
    			key = temp;
    		}
    		if ((temp == 's' || temp == 'S') && (key != 'W' && key != 'w'))
    		{
    			key = temp;
    		}
    		if ((temp == 'D' || temp == 'd') && (key != 'a' && key != 'A'))
    		{
    			key = temp;
    		}
    	}
    	//擦除最后一节
    	gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
    	printf("  ");
    	for (i = snake.len - 1; i > 0; i--)
    	{
    		snake.x[i] = snake.x[i - 1];//以前1的位置现在变成了2,0变成了1
    		snake.y[i] = snake.y[i - 1];
    	}
    	switch (key)//最后一节已经擦出,前移后0,1位置重合,左上角坐标为0,0
    	{
    	case'w':
    	case'W':
    		snake.y[0]--;
    		break;
    	case's':
    	case'S':
    		snake.y[0]++;
    		break;
    	case'a':
    	case'A':
    		snake.x[0] -= 2;
    		break;
    	case'd':
    	case'D':
    		snake.x[0] += 2;
    		break;
    	}
    	gotoxy(snake.x[0], snake.y[0]);
    	printf("█");
    	gotoxy(mapwide + 2, 0);//将光标移走
    }
    int snakestatus()//4.蛇的状态
    {
    	if ((snake.x[0] == 0 || snake.x[0] == mapwide) || (snake.y[0] == 0 || snake.y[0] == maphigh))
    		return 0;
    	for (int k = 1; k < snake.len; k++)
    	{
    		if (snake.x[0] == snake.x[k] && snake.y[0] == snake.y[k])
    			return 0;
    	}
    	return 1;
    }
    void gotoxy(int x, int y)
    {//1.找到控制台这个窗口
    	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    	/*HANDLE为句柄  ↑得到(输出窗口的)句柄。
    	Windows是一个以虚拟内存为基础的操作系统,很多时候,
    	进程的代码和数据并不全部装入内存,进程的某一段装入内存后,
    	还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。
    	也就是说,同一对象在内存中的地址会变化。那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。
    	数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;
    	作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。*/
    	//2.设置光标
    	COORD coord;
    	/*COORD 为Windows.h中自带函数原型大体为struct _coord{short x;short y;}coord;*/
    	coord.X = x;
    	coord.Y = y;
    	//4.同步到控制台SetConsoleCursorPosition
    	SetConsoleCursorPosition(handle, coord);//定位到handle这个窗口,把光标打在coord坐标
    }
    void startgame()
    {
    	system("cls");
    	drawmap();
    	while (1)
    	{
    		creatvirus();
    		keydown();
    		Sleep(snake.speed);//void sleep(int seconds)自带函数参数 seconds 为要暂停的毫秒数。
    		if (!snakestatus())//判断死亡时snakestaus为0,
    		{
    			gotoxy(mapwide / 2, maphigh / 2);
    			printf("Game Over");
    			getchar();
    			getchar();
    			break;
    		}
    		if (snake.len == snakesize)
    		{
    			gotoxy(mapwide / 3, maphigh / 2);
    			printf("恭喜您消灭了全部病毒,胜利(^-^)V");
    			getchar();
    			respect();
    			break;
    		}
    	}
    }
    int menuselect()
    {
    	char number;
    	int a;
    	printf("\n\n\t\t\t\t\t\t1.开始游戏\n");
    	printf("\n\t\t\t\t\t\t2.游戏介绍\n");
    	printf("\n\t\t\t\t\t\t3.游戏版本\n");
    	printf("\n\t\t\t\t\t\t4.设置\n");
    	printf("\n\t\t\t\t\t\t5.退出游戏\n");
    	printf("\n\t\t\t\t\t\t请选择(数字)");
    	while (1)
    	{
    		number = getchar();
    		a = (int)number - 48;
    		if (number <= '5' && number >= '1')
    			return a;
    		printf("\n\t\t\t\t\t\t\t      ");
    	}
    }
    void goodbye()
    {
    	system("cls");
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
    	gotoxy(0, 12);
    	printf("\t\t\t\t\t\t谢谢使用!再见!\n");
    	getchar();
    	getchar();
    }
    void respect()
    {
    	system("cls");
    	gotoxy(0, 4);
    	printf("\t\t*在此向全国的医护人员表示敬意*\n\n");
    	Sleep(1000);
    	printf("\t\t*感谢他们的默默付出*\n\n");
    	Sleep(1000);
    	printf("\t\t*感谢他们对抗击疫情做出的贡献*\n\n");
    	Sleep(1000);
    	printf("\t\t*此致*\n\n");
    	printf("\t\t*                      敬礼 *\n\n");
    	Sleep(2000);
    	getchar();
    }
    void introduce()
    {
    	system("cls");
    	gotoxy(0, 4);
    	printf("\t\t\t\t        游戏规则           \n\n");
    	printf("\t\t\t\t2020年新冠病毒肆虐,威胁着人类\n\n");
    	printf("\t\t\t\t玩家将控制蛇消灭随机出现的病毒⊙\n\n");
    	printf("\t\t\t\t消灭所有病毒即可获得胜利。\n\n");
    	printf("\n\n\n\n\n");
    	printf("\t\t\t\t\tEnter返回主菜单");
    	getchar();
    	getchar();
    }
    void edition()
    {
    	system("cls");
    	gotoxy(0, 4);
    	printf("\t\t\t\t*********************************************\n\n");
    	printf("\t\t\t\t*               欢         迎               *\n\n");
    	printf("\t\t\t\t*                版本号: 1.2               *\n\n");
    	printf("\t\t\t\t*        更新:1.修复了反方向自杀的问题     *\n\n");
    	printf("\t\t\t\t*              2.修复了蛇吃墙的问题         *\n\n");
    	printf("\t\t\t\t*              3.新增了菜单与设置功能       *\n\n");
    	printf("\t\t\t\t*              4.修改了部分整形变量节省空间 *\n\n");
    	printf("\t\t\t\t*********************************************\n\n");
    	printf("\t\t\t\t\tEnter返回主菜单");
    	getchar();
    	getchar();
    }
    int setup()
    {
    	//system("color 6f"); //第一个为背景色,第二个为字体颜色
       /*0 = 黑色       8 = 灰色
    	1 = 蓝色       9 = 淡蓝色
    	2 = 绿色       A = 淡绿色
    	3 = 湖蓝色     B = 淡浅绿色
    	4 = 红色       C = 淡红色
    	5 = 紫色       D = 淡紫色
    	6 = 黄色       E = 淡黄色
    	7 = 白色       F = 亮白色*/
    	char s;
    	int a;
    	system("cls");
    	printf("\n\n\t\t\t\t\t\t1.修改难度\n");
    	printf("\n\t\t\t\t\t\t2.自义定设置\n");
    	printf("\n\t\t\t\t\t\t3.颜色设置\n");
    	printf("\n\t\t\t\t\t\t4.音效设置\n");
    	printf("\n\t\t\t\t\t\t5.返回\n");
    	printf("\n\t\t\t\t\t\t请选择(数字)");
    	while (1)
    	{
    		s = getchar();
    		a = (int)s - 48;
    		if (s <= '5' && s >= '1')
    			return a;
    		printf("\n\t\t\t\t\t\t\t      ");
    	}
    }
    int setup1()
    {
    	switch (setup())
    	{
    	case 1:
    		diffculty();
    		break;
    	case 2:
    		customize1();
    		break;
    	default:
    		break;
    	}
    	return 0;
    }
    int modifydiffculty()
    {
    	char s;
    	int a;
    	system("cls");
    	printf("\n\n\t\t\t\t\t\t1.简单\n");
    	printf("\n\t\t\t\t\t\t2.普通\n");
    	printf("\n\t\t\t\t\t\t3.困难\n");
    	printf("\n\t\t\t\t\t\t4.修罗地狱\n");
    	printf("\n\t\t\t\t\t\t请选择(数字)");
    	while (1)
    	{
    		s = getchar();
    		a = (int)s - 48;
    		if (s <= '4' && s >= '1')
    			return a;
    		printf("\n\t\t\t\t\t\t\t      ");
    	}
    }
    void diffculty()
    {
    	switch (modifydiffculty())
    	{
    	case 1:
    		len = 4;
    		speed = 500;
    		snakesize = 10;
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t\t\t 修改成功!\n");
    		printf("\t\t\t\t\t\t \n");
    		system("pause");
    		break;
    	case 2:
    		len = 4;
    		speed = 300;
    		snakesize = 25;
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t\t\t 修改成功!\n");
    		printf("\t\t\t\t\t\t \n");
    		system("pause");
    		break;
    	case 3:
    		len = 4;
    		speed = 70;
    		snakesize = 50;
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t\t\t 修改成功!\n");
    		printf("\t\t\t\t\t\t \n");
    		system("pause");
    		break;
    	case 4:
    		len = 4;
    		speed = 25;
    		snakesize = 70;
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t\t\t 修改成功!\n");
    		printf("\t\t\t\t\t\t \n");
    		system("pause");
    		break;
    	default:
    		break;
    	}
    }
    int customize()
    {
    	char s;
    	int a;
    	system("cls");
    	printf("\n\n\t\t\t\t\t\t1.自定义速度\n");
    	printf("\n\t\t\t\t\t\t2.自定义初始长度\n");
    	printf("\n\t\t\t\t\t\t请选择(数字)");
    	while (1)
    	{
    		s = getchar();
    		a = (int)s - 48;
    		if (s <= '2' && s >= '1')
    			return a;
    		printf("\n\t\t\t\t\t\t\t      ");
    	}
    }
    void customize1()
    {
    	int s;
    	switch (customize())
    	{
    	case 1://自定义速度
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t请输入速度(1-999)");
    		scanf_s("%d", &s);
    		speed = (1000 - s);
    		break;
    	case 2:
    		system("cls");
    		gotoxy(8, 8);
    		printf("\t\t\t\t请输入初始长度:");
    		scanf_s("%d", &s);
    		len = s;
    		break;
    	default:
    		break;
    	}
    }
    

    对于刚学完C语言的初学者,直接做这种小游戏也是一件非常困难的事情,中间还有很大的鸿沟。老师上课讲授的知识非常有限,大部分知识还需要同学们自己去探索。
    如果你用的时vs2010,那估计以上程序一定会报错,两个版本在scanf函数上有所不同,在2019中必须要求使用scanf_s.

    vs2010vs2019
    scanfscanf_s

    其次,2019允许在程序运行时定义变量
    例如:

    for(int i=1;i<3;i++)
    

    而在2010中是不允许这样书写的。
    除上述两点外,2010和2019还有很多小地方不同,当然我们不需要特意记住这些不同,在2019都会给予相应的提示。
    个人没有把自定义函数和main函数分开,毕竟只是自己写着玩。
    程序的写法也有很多很多种,不必拘于一种,也期待各位写出更加简练高效的程序。
    个人小白,如有错误也希望各位大佬能够指出。

    展开全文
  • C语言小游戏开发实例

    2011-05-06 13:35:16
    适合学了一定基础,想是编游戏的朋友!C语言开发实例小游戏教程。CHM格式。
  • C语言小游戏记忆训练

    2017-01-23 21:20:39
    C语言,使用easyx图形库编写,记忆训练小游戏
  • 200个小游戏C语言源代码,和大家分享,喜欢的就下载吧!
  • 你可能不知道,C语言编程也可以开发小游戏项目哦! 本课程为黄强老师为学习C语言编程的童鞋带来的游戏趣味编程项目实战课程,通过对五子棋游戏的一步一步开发, 帮学员们巩固C语言编程,课程中老师通过细心的讲解...
  • c语言控制台小游戏,支持游戏数据储存和读取,内置三种小游戏和金钱系统
  • 源代码 c语言 雷霆战机 vc及codeblocks均成功运行,有ege图形库实现的版本,请去我的其他资源寻找。
  • 我从网上搜了一些几个C语言小游戏源码,觉得不错,分享给大家,供大家参考!
  • C语言实现的最简单的 打飞机小游戏
  • c语言小游戏代码

    2012-01-03 01:08:29
    c语言小游戏代码,好几个
  • 扫雷代码,用C语言写的小游戏,适用于初学者
  • c语言小游戏俄罗斯方块,深入学习c语言的材料,增加学习c语言的乐趣。给您展现c语言的奇妙世界
  • c语言小游戏_C语言_控制台_游戏_源码.zip.zip
  • 非常强大的C语言 写的很多程序,带有注释,也含有几个C语言 小游戏,很棒
  • 源代码以及exe文件。 c语言 雷霆战机 vc成功运行,有不添加ege图形库实现的版本,请去我的其他资源寻找。(vc++6.0欲调试需安装ege图形库)
  • C语言小游戏源代码

    2014-11-13 16:53:59
    C语言小游戏:C游戏编程从入门到精通;C语言~~自制-拼图游戏;C语言扫雷游戏源代码;C语言图形五子棋课程设计报告;俄罗斯方块游戏(C语言);贪吃蛇C语言
  • c语言小游戏.chm

    2009-06-03 09:50:59
    一些用c语言编写的小游戏,对于初学c语言的人来说是一个不错的选择
  • c语言编程的小游戏

    2018-12-13 12:09:01
    c语言做的一个简单的小游戏,玩法简单
  • C语言小游戏源代码《贪吃蛇》,很经典的原始小游戏
  • C语言游戏代码大全

    2018-02-18 11:29:44
    双人贪吃蛇,别踩白方块,玫瑰花,矿井逃生等多种C语言游戏代码等你来实践!
  • C语言小游戏之贪吃蛇程序代码》

    万次阅读 多人点赞 2018-05-19 10:46:37
    //为广大编程游戏爱好者提供一个参考的游戏源代码#include&lt;stdio.h&gt;#include&lt;conio.h&gt;#include&lt;windows.h&gt;#include&lt;time.h&gt;#define framex 5#define ...

    //为广大编程游戏爱好者提供一个参考的游戏源代码


    #include<stdio.h>

    #include<conio.h>
    #include<windows.h>
    #include<time.h>
    #define framex 5
    #define framey 5
    #define wide 20
    #define high 20
    int i,j,a[2];
    //将光标移动到指定位置 
    void gotoxy(HANDLE hout,int x,int y){
        //COORD是WindowsAPI中定义的一种结构,表示一个字符在控制台屏幕上的坐标
        COORD pos;
        pos.X=x;
        pos.Y=y;
        //SetConsoleCursorPosition是API中定位光标位置的函数。
        SetConsoleCursorPosition(hout,pos);
    }
    //游戏封面
    void cover (HANDLE hout){
        gotoxy(hout,framex+wide,framey);
        printf("snake——贪吃蛇游戏");
        gotoxy(hout,framex+wide,framey+5);
        printf("开始游戏前请关闭中文输入法");
        gotoxy(hout,framex+wide*2,framey+20);
        printf( "游戏制作者:Joe"); 
        gotoxy(hout,framex+wide*2,framey+22);
        
        char a;
        a=getchar();
        system("cls");

    //定义蛇的结构体 
    struct  Snake{
        int x[100];
        int y[100];
        int speed;
        int length;
        int count;
    };
    //定义食物的结构体 
    struct Food{
        int x;
        int y;
    };
    //制作框架 
    void makeframe(struct Snake snake){
        //定义显示器变量句柄 
        HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
        gotoxy(hout,framex+wide*2+5,framey);
        printf( "   贪吃蛇游戏"); 
        gotoxy(hout,framex+wide*2+5,framey+3);
        printf("使用方向键或wasd移动");
        gotoxy(hout,framex+wide*2+5,framey+5);
        printf("长按方向键可加速");
        gotoxy(hout,framex+wide*2+5,framey+7);
        printf("按任意键暂停,方向键继续");
        //打印上边框 
        for(i=0;i<wide*2+1;i++){
            gotoxy(hout,framex+i,framey);
            printf("*");
        }
        //打印下边框 
        for(i=0;i<wide*2+2;i++){
            gotoxy(hout,framex+i,framey+high);
            printf("*");
        }
        //打印左边框 
        for(i=0;i<high;i++){
            gotoxy(hout,framex,framey+i);
            printf("■");
        }
        //打印右边框 
        for(i=0;i<high;i++){
            gotoxy(hout,framex+wide*2+1,framey+i);
            printf("■");
        }
    }
    //游戏信息
    void infor(HANDLE hout,struct Snake* snake){
        gotoxy(hout,framex+wide*2+5,framey+15);
        printf("当前速度:%d",-snake->speed+500);
        gotoxy(hout,framex+wide*2+5,framey+17);
        printf("当前得分:%d",snake->count);
        gotoxy(hout,framex+wide*2+5,framey+19);
        printf("当前长度:%d",snake->length);

    //初始化蛇 
    void initsnake(struct Snake *snake){
        snake->x[0]=framex+2;
        snake->y[0]=framey+high/2;
        snake->count=0;
        snake->length=3;
        snake->speed=400;
        //初始化由蛇尾至蛇头的坐标 
        for(i=1;i<snake->length;i++){
            snake->x[i]=snake->x[i-1]+1;
            snake->y[i]=snake->y[i-1];
        }
    }
    //打印蛇 
    void printsnake(HANDLE hout ,struct Snake *snake){
        for(i=0;i<snake->length;i++){
            gotoxy(hout,snake->x[i],snake->y[i]);
            if(i==snake->length-1) 
                printf("■");
            else if(i==0)
                printf("■");
            else 
                printf("■"); 
        }
    }
    //移动蛇 
    void movesnake(HANDLE hout,struct Snake *snake){
        gotoxy(hout,snake->x[0],snake->y[0]);
        //清除蛇尾 
        printf("  ");
        //蛇的后一节坐标变成前一节的坐标 
        for(i=1;i<snake->length;i++){
            snake->x[i-1]=snake->x[i];
            snake->y[i-1]=snake->y[i];
        }
    }
    //打印食物 
    void printfood (HANDLE hout,struct Snake *snake,struct Food* food){
        //用计算机时间获取随机值 
        srand((unsigned)time(NULL));
        while(1){
            //将食物的横纵坐标的大小限定在窗口大小内 
            food->x=rand()%(wide-2)+1;
            food->y=rand()%(high-2)+1;
            //避免食物出现在边框上 
            if(food->x==0&&food->y==0)
                continue;
            //将食物的坐标放置在窗口内 
            food->x=2*food->x+framex;
            food->y+=framey;
            //如果食物出现在蛇上,重新产生食物 
            for(i=0;i<snake->length;i++){
                if(food->x==snake->x[i]&&food->y==snake->y[i])
                    break;
            }
            //食物不在蛇上,打印食物,结束循环 
            if(i==snake->length){
                gotoxy(hout,food->x,food->y);
                printf("●");
                break;  
            }
        }


    }
    //吃食物 
    void eatfood(HANDLE hout,struct Snake * snake,struct Food *food){
        //如果蛇头的坐标等于食物的坐标 
        if(snake->x[snake->length-1]==food->x&&snake->y[snake->length-1]==food->y){
            //蛇长加一 
            snake->length++;
            //蛇身(不包括蛇尾)整体像前移动一格 
            for(i=snake->length-1;i>0;i--){
                snake->x[i]=snake->x[i-1];
                snake->y[i]=snake->y[i-1];
            }
            //得到蛇尾的坐标(即蛇移动前的蛇尾坐标) 
            snake->x[0]=a[0];      
            snake->y[0]=a[1];
            printfood(hout,snake,food);
            snake->count++;
            if(snake->count%3==0)
                snake->speed-=50;
        }
    }
    //死亡判断 
    int ifdead(struct Snake* snake){
        //如果碰到左边界 返回0;
        if(snake->x[snake->length-1]==framex)
            return 0;
        //如果碰到右边界 返回0;
        if(snake->x[snake->length-1]==framex+wide*2)
            return 0;
        //如果碰到上边界 返回0;
        if(snake->y[snake->length-1]==framey)
            return 0;
        //如果碰到下边界 返回0;
        if(snake->y[snake->length-1]==framey+high)
            return 0;
        //如果碰到自己身体 返回0; 
        for(i=0; i<snake->length-1; i++) 
            if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] ) 
                return 0;
        //否则返回1; 
        return 1;
    }
    //开始游戏 
    int main(){
        unsigned char ch =77;
        //定义显示器句柄 
        HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
        cover(hout);
        struct Snake s, *snake=&s;
        struct Food  f,  *food=&f;
        makeframe(*snake);
        initsnake(snake);
        printfood(hout,snake,food);
        Sleep(500);
        while(1){
            infor(hout,snake);
            //保存蛇尾横纵坐标 
            a[0]=snake->x[0];
            a[1]=snake->y[0];
            j=0;
            //如果用户敲击键盘
            if(kbhit()){ 
                //用ch接收输入 ,注意是getch(),不需敲击回车
                ch=getch();
                if(kbhit()){
                //长按时间
                    Sleep(20);
                    j=1;
                }
            }
            switch(ch){
                //向上移动 
                case'W':
                case 'w' :
                case 72:{
                    movesnake(hout,snake);
                    //蛇头纵坐标减一 
                    snake->y[snake->length-1]-=1;
                    break;
                }
                //向下移动 
                case'S':
                case 's':
                case 80:{
                    movesnake(hout,snake);
                    //蛇头纵坐标加一 
                    snake->y[snake->length-1]+=1;
                    break;
                }
                //向左移动 
                case'A':
                case 'a':
                case 75:{
                    movesnake(hout,snake);
                    //蛇头横坐标减二 
                    snake->x[snake->length-1]-=2;
                    break;
                }
                //向右移动 
                case'D':
                case 'd':
                case 77:{
                    movesnake(hout,snake);
                    //蛇头横坐标加二 
                    snake->x[snake->length-1]+=2;
                    break;
                }
            }


            eatfood(hout,snake,food);
            printsnake(hout,snake);
            //如果判断蛇死亡,跳出循环 
            if(ifdead(snake)==0||ch==27||snake->speed==0){
                gotoxy(hout,framex+wide/2,framey-2);
                if(snake->speed==0)
                    printf("恭喜你通关了!!!");
                else
                    printf("糟糕 T_T");
                break;
            }


            if(j==0)
            //如果没有长按,蛇滞留的时间为 
                Sleep(snake->speed);
            //如果长按,蛇滞留的时间为 20ms,即加速 
            else 
                Sleep(20);
        }
        //跳出循环时 ,滞留死亡场景一段时间
        Sleep(3000);
        //清屏 
        system("cls");
        //显示结束界面 
        if(snake->speed==0) 
            printf("\n\n\n\n\n\t\t\t哈哈,你赢了\n\n\t\t\t你得到了满分:24\n\n\n");
        else 
            printf("\n\n\n\n\n\t\t\t哈哈,你输了\n\n\t\t\t你的最终得分是:%d\n\n\n",snake->count); 
        Sleep(3000);
        return 0; 
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,124
精华内容 24,849
关键字:

c语言小游戏

c语言 订阅