zoukankan      html  css  js  c++  java
  • 【C语言项目】贪吃蛇游戏(上)

    00. 目录

    01. 开发背景

    ​ 贪吃蛇起源于西方,来自于蛇骗夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开发出了贪吃蛇游戏。本公开课使用C语言开发一个贪吃蛇游戏。

    ​ 贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。

    通过本公开课的学习,大家可以学到:

    • Visual Studio 2017开发环境

    • C语言中的三大结构和函数

    • C语言中动态内存申请和释放

    • C语言中文件基本操作

    • C语言中的简单单向链表

    • 控制终端基本设置和监听按键

    • C语言简单游戏开发流程

    • C语言简单游戏开发调试技巧

    02. 功能介绍

    ​ 贪吃蛇的游戏规则也很简单,具体为:蛇出现在封闭的空间中,同时在地图上会随机出现食物,玩家通过键盘上的上下左右方向键来控制蛇的前进方向。蛇头撞到食物,则食物消失,表示被蛇吃掉了,蛇身增加一节,增加玩家的得分。接着又随机出现一个食物,等待蛇来吃。如果蛇在前进的过程中撞到墙或者咬到蛇身或者玩家按下ESC键,则游戏退出。

    项目演示

    03. 欢迎界面设计

    欢迎界面如下

    3.1 常用终端控制函数

    SetConsoleTextAttribute函数介绍

    BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);
    功能:设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND
    

    SetConsoleTextAttribute官方文档介绍

    参考示例:

    HANDLE hOut;
    
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);    		/* 获取标注输出句柄 */
    SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 设置控制台颜色,前景色为蓝色*/
    SetConsoleTextAttribute(hOut, BACKGROUND_RED);  /* 背景色为红色 */
    

    SetConsoleCursorPosition函数介绍

    BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition);
    功能:设置控制台光标坐标
    

    SetConsoleCursorPosition官方文档介绍

    参考示例:

    COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
    HANDLE hOut;
    
    hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
    SetConsoleCursorPosition(hOut,pos);     /* 设置控制台光标坐标(设备句柄, 光标坐标) */
    

    3.2 设置文本颜色函数

    //设置终端字体颜色
    int setColor(int c)
    {
    	//GetStdHandle: 获取指定的标准设备的句柄
    	//STD_OUTPUT_HANDLE 标准输出句柄
        //c 颜色值
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
    
    	return 0;
    }
    

    十进制颜色对照表

    3.3 设置光标位置函数

    //设置光标的坐标
    int gotoXY(int x, int y)
    {
    	COORD c;
    	//设置横坐标
    	c.X = x;
    	//设置纵坐标
    	c.Y = y;
    
    	//设置光标的位置
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
    
    	return 0;
    }
    

    3.4 绘制字符画(蛇)

    参考代码:

    //绘制字符画 --蛇
    int printSnake(void)
    {
        //清屏
    	system("cls");
    
    	gotoXY(35, 1);
    	setColor(6);
    	printf("/^\/^\");      //蛇眼睛
    
    	gotoXY(34, 2);
    	printf("|__|  O|");      //蛇眼睛
    
    	gotoXY(33, 2);
    	setColor(2);
    	printf("_");
    
    	gotoXY(25, 3);
    	setColor(12);
    	printf("\/");      	//蛇信
    
    	gotoXY(31, 3);
    	setColor(2);
    	printf("/");
    
    	gotoXY(37, 3);
    	setColor(6);
    	printf(" \_/");     	//蛇眼睛
    
    	gotoXY(41, 3);
    	setColor(10);
    	printf(" \");
    
    	gotoXY(26, 4);
    	setColor(12);
    	printf("\____");   	//舌头
    
    	gotoXY(32, 4);
    	printf("_________/");
    
    	gotoXY(31, 4);
    	setColor(2);
    	printf("|");
    
    	gotoXY(43, 4);
    	setColor(10);
    	printf("\");
    
    	gotoXY(32, 5);
    	setColor(2);
    	printf("\_______");    //蛇嘴
    
    	gotoXY(44, 5);
    	setColor(10);
    	printf("\");
    
    	gotoXY(39, 6);
    	printf("|     |                  \");  //下面都是画蛇身
    
    	gotoXY(38, 7);
    	printf("/      /                   \");
    
    	gotoXY(37, 8);
    	printf("/      /                    \ \");
    
    	gotoXY(35, 9);
    	printf("/      /                       \ \");
    
    	gotoXY(34, 10);
    	printf("/     /                          \  \");
    
    	gotoXY(33, 11);
    	printf("/     /             _----_         \   \");
    
    	gotoXY(32, 12);
    	printf("/     /           _-~      ~-_         |  |");
    
    	gotoXY(31, 13);
    	printf("(      (        _-~    _--_    ~-_     _/  |");
    
    	gotoXY(32, 14);
    	printf("\     ~-____-~    _-~    ~-_    ~-_-~    /");
    
    	gotoXY(33, 15);
    	printf("~-_           _-~          ~-_       _-~");
    
    	gotoXY(35, 16);
    	printf("~--______-~                ~-___-~");
    
    	return 0;
    }
    

    测试代码如下:

    int main()
    {
    
    	//设置控制台的宽高
    	system("mode con cols=100 lines=30");
    
    	printSnake();
    
    	system("pause");
    	return 0;
    }
    

    测试效果如下:

    3.5 欢迎界面函数

    界面设计分析

    参考代码:

    //欢迎界面
    int welcomGame(void)
    {
    	int i;
    	int j;
    
    	int n = 0;
    
    	//绘制字符画蛇
    	printSnake();
    
    	//输出文字
    	setColor(11);
    	gotoXY(45, 18);
    	printf("贪吃蛇游戏");
    
    	setColor(14);
    
    	//边框范围20--26行  27--74列
    	for (i = 20; i <= 26; i++)
    	{
    		for (j = 27; j <= 74; j++)
    		{
    			gotoXY(j, i);
    			if (i == 20 || i == 26)
    			{
    				printf("-");
    			}
    			else if (j == 27 || j == 74)
    			{
    				printf("|");
    			}
    		}
    	}
    
    	setColor(12);
    	gotoXY(35, 22);
    	printf("1. 开始游戏");
    
    	gotoXY(55, 22);
    	printf("2. 游戏说明");
    
    	gotoXY(35, 24);
    	printf("3. 退出游戏");
    
    	gotoXY(27, 27);
    	printf("请选择[1 2 3]: ");
    
    	scanf("%d", &n);
    	//清空换行符
    	getchar();
    	
    	return n;
    }
    

    主函数参考代码如下:

    int main()
    {
    	int choice;
    
    	//设置控制台的宽高
    	system("mode con cols=100 lines=30");
    
    	while (1)
    	{
    		choice = welcomGame();
    
    		switch (choice)
    		{
    			//开始游戏
    		case 1:
    			printf("开始游戏");
    			break;
    
    			//游戏说明
    		case 2:
    			printf("游戏说明");
    			break;
    
    			//退出游戏
    		case 3:
    			break;
    		default:
    			setColor(12);
    			gotoXY(45, 28);
    			printf("请做出有效选择[1~3]");
    			//输入任意键
    			getchar();
    		}
    	}
    
    	system("pause");
    	return 0;
    }
    

    04. 游戏帮助界面设计

    游戏说明模块如下:

    游戏帮助界面参考代码

    //游戏帮助界面
    int aboutGame(void)
    {
    	int i = 0;
    	int j = 0;
    
    	//清屏
    	system("cls");
    
    	setColor(13);
    	gotoXY(44, 3);
    	printf("游戏说明");
    
    	setColor(2);
    	//画出边框
    	//6~22行   20~75列
    	for (i = 6; i <= 22; i++)
    	{
    		for (j = 20; j <= 75; j++)
    		{
    			gotoXY(j, i);
    			//画上下边框
    			if (i == 6 || i == 22)
    			{
    				printf("=");
    			}
    			else if (j == 20 || j == 75)
    			{
    				printf("||");
    			}
    		}
    	}
    
    	setColor(3);
    	gotoXY(30, 8);
    	printf("★ 1.不能撞到墙壁,不能咬到自己");
    
    	setColor(5);
    	gotoXY(30, 11);
    	printf("★ 2.F1加速前进,F2减速前进");
    
    	setColor(11);
    	gotoXY(30, 14);
    	printf("★ 3.使用空格暂停游戏和继续游戏");
    
    	setColor(13);
    	gotoXY(30, 17);
    	printf("★ 4.使用方向键控制前进的方向");
    
    	setColor(14);
    	gotoXY(30, 20);
    	printf("★ 5.按下ESC键退出游戏");
    
    	setColor(12);
    	gotoXY(22, 24);
    	printf("按下回车键返回主界面...");
    
    	getchar();
    
    	return 0;
    }
    

    主函数代码修改如下:

    int main()
    {
    	int choice;
    
    	//设置控制台的宽高
    	system("mode con cols=100 lines=30");
    
    	while (1)
    	{
    		choice = welcomGame();
    
    		switch (choice)
    		{
    			//开始游戏
    		case 1:
    			printf("开始游戏");
    			break;
    
    			//游戏说明
    		case 2:
    			aboutGame();
    			break;
    
    			//退出游戏
    		case 3:
    			break;
    		default:
    			setColor(12);
    			gotoXY(45, 28);
    			printf("请做出有效选择[1~3]");
    			//输入任意键
    			getchar();
    		}
    	}
    
    	system("pause");
    	return 0;
    }
    

    05. 退出游戏实现

    在主菜单中, 当用户选择3的时候,直接退出游戏

    在主函数case 3中添加如下代码:

    //退出游戏
    case 3:
    	exit(0);
    	break;
    

    大学生C/C++开发交流群

  • 相关阅读:
    弧长的参方程表示形式
    selenium实例
    中英文混合分词
    准确率(Precision)、召回率(Recall)以及F值(F-Measure)
    安装zeromq以及zeromq的python示例
    uwsgi安装过程中遇到的问题
    安装python-devel 在升级到python2.7之后
    更新yum源
    yum mysql on centos 7
    vue--子组件主动获取父组件的数据和方法
  • 原文地址:https://www.cnblogs.com/szitcast/p/11081773.html
Copyright © 2011-2022 走看看