【C语言】之实现2048简易字符界面游戏_如何实现2048字符版-程序员宅基地

技术标签: C/C++  C语言  实现2048游戏  

使用介绍:

本次工程项目总共有三个文件:main.c、2048game.h 和 2048game.c 需要放到一起编译


1、main.c


/**************************************
 * 文件名:main.c
 * 文件描述:实验简易的字符界面2048游戏
 * 编辑人:王廷云
 * 编辑日期:2017-10-21
 * 修改日期:2018-2-10
**************************************/

#include <stdio.h>
#include "2048game.h"

int main(void)
{
    
    int gameData[NR][NR];	// 游戏数据
    int isGameOver = 0;		// 游戏结束标志位
    int key;				// 用户的按键输入

    /* 初始化游戏 */
    initGame(gameData);

    /* 显示游戏 */
    showGame(gameData);

    /* 进入游戏 */
    while (1)
    {
    
        /* 获取用户输入 */
		key = getInput();
		switch (key)
		{
    
		    case UP    : moveUp(gameData);    break;
		    case DOWN  : moveDown(gameData);  break;
    	    case LEFT  : moveLeft(gameData);  break;
		    case RIGHT : moveRight(gameData); break;
		    case EXIT  : exitGame();          break;
		    case UNKNOW: continue;
		}
		showGame(gameData);  // 每操作一次就显示结果

		/* 判断游戏是否结束 */
		isGameOver = checkGameOver(gameData);
		if (isGameOver == 1)
		{
    
		    fprintf(stdout, "\033[6;10H\033[31mGame Over!\033[0m");
		    exitGame();		 // 游戏满足结束条件-退出游戏
		}
    }
	
    return 0;
}


2、2048game.h


/****************************************
 * 文件名:2048game.h
 * 文件描述:该文件为2048游戏项目的头文件
 *   包含所用到的函数声明、宏定义,枚举等
 * 编辑人:王廷云
 * 编辑日期:2017-10-21
 * 修改日期:2018-2-10
*****************************************/

#ifndef _2048GAME_H_
#define _2048GAME_H_

#define   NR    4   // 游戏的维数

/* 按键输入枚举 */
enum KEY {
    
    UP,			// 上
    DOWN,		// 下
    LEFT,		// 左
    RIGHT,		// 右
    EXIT,		// 退出
    UNKNOW,		// 其它键
};

/*
 * 函数名:initGame
 * 功能:初始化2048游戏,该函数会对游戏界面数据进行初始化
 *       并产生两个随机数
 * 参数:需要初始化的游戏数据
 * 返回值:无
*/
void initGame(int data[NR][NR]);

/*
 * 函数名:showGame
 * 功能:显示游戏界面
 * 参数:需要显示的游戏数据
 * 返回值:无
*/
void showGame(int data[NR][NR]);

/*
 * 函数名:moveUp
 * 功能:把游戏数据上移
 * 参数:需要上移的游戏数据
 * 返回值:无
*/
void moveUp(int data[NR][NR]);

/*
 * 函数名:moveDown
 * 功能:把游戏数据下移
 * 参数:需要下移的游戏数据
 * 返回值:无
*/
void moveDown(int data[NR][NR]);

/*
 * 函数名:moveLeft
 * 功能:把游戏数据左移
 * 参数:需要左移的游戏数据
 * 返回值:无
*/
void moveLeft(int data[NR][NR]);

/*
 * 函数名:moveRight
 * 功能:把游戏数据右移
 * 参数:需要右移的游戏数据
 * 返回值:无
*/
void moveRight(int data[NR][NR]);

/*
 * 函数名:maxScore
 * 功能:获取游戏最高分
 * 参数:需要获取最高分的游戏数据
 * 返回值:返回游戏数据中的最大值
*/
int maxScore(int data[NR][NR]);

/*
 * 函数名:exitGame
 * 功能:游戏退出函数,直接退出当前游戏
 * 参数:无
 * 返回值:无
*/
void exitGame(void);

/*
 * 函数名:checkGameOver
 * 功能:检查游戏是否结束
 * 参数:需要检查的游戏数据
 * 返回值:游戏结束返回1,没有结束返回0
*/
int checkGameOver(int data[NR][NR]);

/*
 * 函数名:getInput
 * 功能:获取用户按键输入
 * 参数:无
 * 返回值:返回用户输入的对应按键
*/
int getInput(void);

/*
 * 函数名:getRand
 * 功能:在游戏数据中产生一个随机数,2的概率为80%,4的概率为20%
 * 参数:需要产生随机数的游戏数据
 * 返回值:无
*/
void getRand(int data[NR][NR]);

#endif  // _2048GAME_H_

3、2048game.c


/********************************************
 * 文件名:2048game.c
 * 文件描述: 2048游戏项目里所有功能函数的实现
 * 编辑人:王廷云
 * 编辑日期:2017-10-21
 * 修改日期:2018-2-14
********************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "2048game.h"

/*
 * 函数名:initGame
 * 功能:初始化2048游戏,该函数会对游戏界面数据进行初始化
 *       并产生两个随机数
 * 参数:需要初始化的游戏数据
 * 返回值:无
*/
void initGame(int data[NR][NR])
{
    
    int x, y;

    /* 配置终端显示设置 */
	printf("\033[2J");			 // 清屏
    system("stty -icanon");      // 关闭缓冲
    system("stty -echo");        // 关闭回显
    fprintf(stdout,"\033[?25l"); // 隐藏光标
	fflush(stdout);				 // 刷新

    /* 初始化游戏数据 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = 0; x < NR; x++)
		{
    
		    data[y][x] = 0;		 // 所有数据清零
		}
    }

    /* 游戏上随机产生两个数 */
    srand(time(NULL));           // 设置随机数种子
    getRand(data);
    getRand(data);
}

/*
 * 函数名:showGame
 * 功能:显示游戏界面
 * 参数:需要显示的游戏数据
 * 返回值:无
*/
void showGame(int data[NR][NR])
{
    
    int x, y;

	/* 打印游戏提示信息 */
	fprintf(stdout, "\033[1;1H");	// 定位到第一行第一列
    fprintf(stdout, "欢迎来到\033[32m2048\033[0m游戏!");
    fprintf(stdout, "(\033[33m按'q'退出游戏)\033[0m\n");

	/* 打印所有数据 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = 0; x < NR; x++)
		{
    
	    	if (data[y][x] == 0)
	    	{
    
	        	fprintf(stdout, "%5d", data[y][x]);
	    	}
	    	else
	    	{
    
				switch (data[y][x])	// 根据不同数字打印不同颜色
				{
    
				case 2   : fprintf(stdout, "\033[32m%5d\033[0m", \
				    		       data[y][x]); break;
				case 4   : fprintf(stdout, "\033[32m%5d\033[0m", \
				    		       data[y][x]); break;
				case 8   : fprintf(stdout, "\033[32m%5d\033[0m", \
				    		       data[y][x]); break;
				case 16  : fprintf(stdout, "\033[35m%5d\033[0m", \
				    		       data[y][x]); break;
				case 32  : fprintf(stdout, "\033[35m%5d\033[0m", \
				    		       data[y][x]); break;
				case 64  : fprintf(stdout, "\033[33m%5d\033[0m", \
				    		       data[y][x]); break;
				case 128 : fprintf(stdout, "\033[33m%5d\033[0m", \
				    		       data[y][x]); break;
				case 256 : fprintf(stdout, "\033[34m%5d\033[0m", \
				    		       data[y][x]); break;
				case 512 : fprintf(stdout, "\033[34m%5d\033[0m", \
				    		       data[y][x]); break;
				case 1024: fprintf(stdout, "\033[34m%5d\033[0m", \
				    		       data[y][x]); break;
				case 2048: fprintf(stdout, "\033[36m%5d\033[0m", \
							       data[y][x]); break;
				}
	    	}
		}
		fputc('\n', stdout);
    }

    /* 打印游戏结果 */
	fprintf(stdout, "当前最高纪录:\033[1;35m%d\033[0m", maxScore(data));
    fflush(stdout);
}

/*
 * 函数名:moveUp
 * 功能:把游戏数据上移
 * 参数:需要上移的游戏数据
 * 返回值:无
*/
void moveUp(int data[NR][NR])
{
    
    int x, y;
    int idx;
    int isChange = 0;	// 可移动标记位

    /* 先累加 */
    for (x = 0; x <= NR-1; x++)
    {
    
        for (y = 0; y < NR-1; y++)
		{
    
		    if (data[y][x] == 0)
		    {
    
		        continue;
		    }
		    /* 查找是否可加,能加则加 */
		    for (idx = y+1; idx <= NR-1; idx++)
		    {
    
		        if (data[idx][x] == 0)
				{
    
				    continue;
				}
				else if (data[idx][x] != data[y][x])
				{
    
				    break;
				}
				else
				{
    
				    data[y][x]  += data[idx][x];
				    data[idx][x] = 0;
				    isChange = 1;
				    break;
				}
		    }
		}
    }

    /* 累加完后移动 */
    for (x = 0; x <= NR-1; x++)
    {
    
        for (y = 1; y <= NR-1; y++)
		{
    
		    if (data[y][x] == 0)
		    {
    
		        continue;
		    }

		    /* 寻找移动点 */
    	    idx = y-1;
		    while (data[idx][x] == 0 && idx >= 0)
		    {
    
		        idx--;
		    }

    	    if (data[idx+1][x] == 0)
		    {
    
		        data[idx+1][x] = data[y][x];
		        data[y][x] = 0;
		        isChange = 1;
		    }
		}
    }

	/* 成功移动之后需要随即产生一个数 */
    if (isChange == 1)
    {
    
        getRand(data);
    }
}

/*
 * 函数名:moveDown
 * 功能:把游戏数据下移
 * 参数:需要下移的游戏数据
 * 返回值:无
*/
void moveDown(int data[NR][NR])
{
    
    int x, y;
    int idx;
    int isChange = 0;   // 可移动标记位

    /* 先累加 */
    for (x = 0; x <= NR-1; x++)
    {
    
        for (y = NR-1; y >= 1; y--)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 查找是否可加,能加则加 */
    	    for (idx = y-1; idx >= 0; idx--)
    	    {
    
    	        if (data[idx][x] == 0)
        		{
    
        		    continue;
        		}
        		else if (data[idx][x] != data[y][x])
        		{
    
        		    break;
        		}
        		else
        		{
    
        		    data[y][x]  += data[idx][x];
        		    data[idx][x] = 0;
        		    isChange = 1;
        		    break;
        		}
    	    }
    	}
    }
    /* 累加完后移动 */
    for (x = 0; x <= NR-1; x++)
    {
    
        for (y = NR-2; y >= 0; y--)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 寻找移动点 */
    	    idx = y+1;
    	    while (data[idx][x] == 0 && idx <= NR-1)
    	    {
    
    	        idx++;
    	    }

    	    if (data[idx-1][x] == 0)
    	    {
    
        		data[idx-1][x] = data[y][x];
        		data[y][x] = 0;
        		isChange = 1;
    	    }
    	}
    }

    /* 成功移动之后需要随即产生一个数 */
    if (isChange == 1)
    {
    
        getRand(data);
    }
}

/*
 * 函数名:moveRight
 * 功能:把游戏数据右移
 * 参数:需要右移的游戏数据
 * 返回值:无
*/
void moveRight(int data[NR][NR])
{
    
    int x, y;
    int idx;
    int isChange = 0;   // 可移动标记位

    /* 先累加 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = NR-1; x >= 0; x--)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 查找是否可加,能加则加 */
    	    for (idx = x-1; idx >= 0; idx--)
    	    {
    
    	        if (data[y][idx] == 0)
        		{
    
        		    continue;
        		}
        		else if (data[y][idx] != data[y][x])
        		{
    
        		    break;
        		}
        		else
        		{
    
        		    data[y][x]  += data[y][x];
        		    data[y][idx] = 0;
        		    isChange = 1;
        		    break;
        		}
    	    }
    	}
    }
    /* 累加完后移动 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = NR-2; x >= 0; x--)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 寻找移动点 */
    	    idx = x+1;
    	    while (data[y][idx] == 0 && idx <= NR-1)
    	    {
    
    	        idx++;
    	    }

      	    if (data[y][idx-1] == 0)
    	    {
    
    	        data[y][idx-1] = data[y][x];
    	        data[y][x] = 0;
    	        isChange = 1;
    	    }
    	}
    }

    /* 成功移动之后需要随即产生一个数 */
    if (isChange == 1)
    {
    
        getRand(data);
    }
}

/*
 * 函数名:moveLeft
 * 功能:把游戏数据左移
 * 参数:需要左移的游戏数据
 * 返回值:无
*/
void moveLeft(int data[NR][NR])
{
    
    int x, y;
    int idx;
    int isChange = 0;   // 可移动标记位

    /* 先累加 */
    for (y = 0; y <= NR-1; y++)
    {
    
        for (x = 0; x < NR-1; x++)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 查看是否可加,能加则加 */
    	    for (idx = x+1; idx <= NR-1; idx++)
    	    {
    
    	        if (data[y][idx] == 0)
        		{
    
        		    continue;
        		}
        		else if (data[y][idx] != data[y][x])
        		{
    
        		    break;
        		}
        		else
        		{
    
        		    data[y][x]  += data[y][idx];
        		    data[y][idx] = 0;
        		    isChange = 1;
        		    break;
        		}
    	    }
    	}
    }
    /* 累加完后移动 */
    for (y = 0; y <= NR-1; y++)
    {
    
        for (x = 1; x <= NR-1; x++)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        continue;
    	    }
    	    /* 寻找移动点 */
    	    idx = x-1;
    	    while (data[y][idx] == 0 && idx >= 0)
    	    {
    
    	        idx--;
    	    }

    	    if (data[y][idx+1] == 0)
    	    {
    
    	        data[y][idx+1] = data[y][x];
    	        data[y][x] = 0;
    	        isChange = 1;
    	    }
    	}
    }

    /* 成功移动之后需要随即产生一个数 */
    if (isChange == 1)
    {
    
        getRand(data);
    }
}
/*
 * 函数名:checkGameOver
 * 功能:检查游戏是否结束
 * 参数:需要检查的游戏数据
 * 返回值:游戏结束返回1,没有结束返回0
*/
int checkGameOver(int data[NR][NR])
{
    
    int x, y;

    /* 判断有无空位0 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = 0; x < NR; x++)
    	{
    
    	    if (data[y][x] == 0)
    	    {
    
    	        return 0;
    	    }
    	}
    }
    /* 判断各行是否可加 */
    for (y = 0; y < NR; y++)
    {
    
        for (x = 0; x < NR-1; x++)
    	{
    
    	    if (data[y][x] == data[y][x+1])
    	    {
    
    	        return 0;
    	    }
    	}
    }
    /* 判断各列是否可加 */
    for (x = 0; x < NR; x++)
    {
    
        for (y = 0; y < NR-1; y++)
    	{
    
    	    if (data[y][x] == data[y+1][x])
    	    {
    
    	       return 0;
    	    }
    	}
    }
    /* 游戏结束 */
    return 1;
}

/*
 * 函数名:getInput
 * 功能:获取用户按键输入
 * 参数:无
 * 返回值:返回用户输入的对应按键
*/
int getInput(void)
{
    
    char ch;
    int key;

    ch = fgetc(stdin);

    if (ch == '\033' && fgetc(stdin) == '[')    // 方向键
    {
    
        ch = fgetc(stdin);
    	switch (ch)
    	{
    
    	    case 'A': key = UP;     break;
    	    case 'B': key = DOWN;   break;
    	    case 'C': key = RIGHT;  break;
    	    case 'D': key = LEFT;   break;
    	}
    }
    else if (ch == 'q') // 退出键
	   key = EXIT;
    else                // 其它键
	   key = UNKNOW;

    return key;
}

/*
 * 函数名:getRand
 * 功能:在游戏数据中产生一个随机数,2的概率为80%,4的概率为20%
 * 参数:需要产生随机数的游戏数据
 * 返回值:无
*/
void getRand(int data[NR][NR])
{
    
    int x, y;
    int idx;  /* 随机种子索引 */
    int seedLib[] = {
    2,2,2,4,2,2,2,4,2,2};

    /* 全局查找是否有空位产生随机数 */
    while (1)
    {
    
        /* 随即定位 */
        x = rand() % NR;
        y = rand() % NR;

        /* 定位的位置有数了 */
        if (data[y][x] != 0)
    	    continue;

        /* 空白位置产生数 */
        idx = rand() % 10;
    	data[y][x] = seedLib[idx];

        return;
    }
}

/*
 * 函数名:maxScore
 * 功能:获取游戏最高分
 * 参数:需要获取最高分的游戏数据
 * 返回值:返回游戏数据中的最大值
*/
int maxScore(int data[NR][NR])
{
    
    int x, y;
    int maxValue = 0;

    for (y = 0; y < NR; y++)
    {
    
        for (x = 0; x < NR; x++)
    	{
    
    	    if (maxValue < data[y][x])
    	    {
    
    	        maxValue = data[y][x];
    	    }
    	}
    }

    return maxValue;
}

/*
 * 函数名:exitGame
 * 功能:配置退出游戏前的一些终端配置
 * 参数:无
 * 返回值:无
*/
void exitGame(void)
{
    
    system("stty icanon");          // 恢复缓冲
    system("stty echo");            // 恢复回显
    fprintf(stdout, "\033[?25h");   // 显示鼠标
    fputc('\n', stdout);            // 让终端提示符下一行显示
    exit(0);                        // 退出游戏
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aiwangtingyun/article/details/79654242

智能推荐

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

iOS逆向之三-authorized_keys ssh登录越狱手机免验证设置_ios ssh每次都输密码-程序员宅基地

文章浏览阅读932次。iOS逆向之三-authorized_keys ssh登录越狱手机免验证设置默认情况下使用ssh登录到iPhone每次都是需要输入密码的,比较繁琐,可以配置ios的authorized_keys和电脑端的一致来简化这个步骤电脑配置删除 ~/.ssh/known_hosts文件的配置known_hosts 的文件如下➜ .ssh cat known_hosts 192.168.8.2_ios ssh每次都输密码

[WebUI Forge]ForgeUI的安装与使用 | 相比较于Auto1111 webui 6G显存速度提升60-75%-程序员宅基地

文章浏览阅读2.7k次,点赞40次,收藏37次。Stable Diffusion WebUI Forge 是一个基于(基于)的平台,可简化开发、优化资源管理并加快推理速度。“Forge”这个名字的灵感来自于“Minecraft Forge”。该项目旨在成为 SD WebUI 的 Forge。与原始 WebUI(针对 1024 像素的 SDXL 推理)相比,您可以期待以下加速:如果您使用常见的 GPU(如 8GB vram),您可以预期推理速度(it/s)会。_webui forge

SMS:网格编辑工作流程_sms打复杂网格-程序员宅基地

文章浏览阅读1.6k次。SMS:网格编辑工作流程跳转到导航跳转到搜索要在SMS中编辑网格,请使用以下步骤:坍方1.检查网格质量。 坍方1.使用轮廓显示选项。 关闭“点和三角形”,然后在“显示选项”对话框的“散布”选项卡中打开“轮廓”。 在“轮廓”选项卡中设置轮廓选项。为此,建议使用“颜色填充”选项。 查找不一致的点(值比其邻居或不存在数据点的区域高/低得多的点)。 验证要建模的区域是否被高程/深度数据覆盖并且..._sms打复杂网格

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签