【C语言】都玩过三子棋游戏把,但你知道怎么用C语言实现三子棋游戏吗?让我来手把手教你。

news2025/1/15 12:52:07

三子棋游戏

  • 1.前言
  • 2.功能分析
    • 2.1主函数设计及菜单设计
    • 2.2打印棋盘与棋盘初始化
    • 2.3玩家下棋
    • 2.4电脑下棋
    • 2.5判断输赢
  • 3.game.h头文件展示
  • 4.text.c源文件文件展示
  • 5.game.c源文件文件展示

所属专栏:C语言
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!

1.前言

在写三子棋这个程序的时候我们不妨会用到很多的函数,我们之前也讲过了,当我们在设计一个比较复杂的程序的时候或者需要很多函数链接成的一个程序的时候,我们都会使用多个文件来编写,而每个文件的功能都是不一样的。以我们写的这个程序为例子。

  • text.c文件是我们的测试文件。
  • game.c文件是我们的函数实现文件。
  • game.h文件是我们的函数声明文件。

2.功能分析

2.1主函数设计及菜单设计

凡是我们写一个C程序,主函数是必不可少的,主函数就相当于我们程序的入口一样。
我们玩游戏肯定==不止就玩一次,而是想玩完一把再玩一把,这个时候我们就可以用到我们之前学的do……while循环,这个循环的特点是至少会循环一次,==刚好符合我们的需求。而我们选择是否玩游戏可用到我们的switch……case语句,输入1玩游戏,输入0退出游戏,输入出这两个数以外的数就重新输入。于是我们就可以这样设计:

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://选择1就就进入game玩游戏。
			printf("开始游戏\n\n");
			game();
			break;
		case 0://选择0就退出游戏
			printf("退出游戏\n");
			break;
			printf("选择错误,请重新选择:>");
		default:
			break;
		}
	} while (input);
	return 0;
}

既然我们要玩游戏,我们的游戏界面肯定不能少,有了界面玩家才知道怎么开始怎么结束游戏。
所以这里我们就简单的设计一个界面,里面包含了开始信息和结束信息。

void menu()
{
	printf("***********************\n");
	printf("******** 1.play *******\n");
	printf("******** 0.exit *******\n");
	printf("***********************\n");
}

效果展示:
在这里插入图片描述

2.2打印棋盘与棋盘初始化

我们三子棋又称井字棋,顾名思义他的棋盘像一个井字,所以我们不妨就设计出一个井字棋盘。
所以我们想办法设计出这样的棋盘:
在这里插入图片描述
这里我们看到了我们设计出的棋盘有三行三列,也就是说我们需要创建一个二维数组。
但是如果我们直接写成char board[3][3] = { 0 };的话,如果我们想玩的是四子棋的话,在用到二维数组的地方我们都要改数组的大小,于是我们就想到了用宏定义

#define ROW 3
#define COL 3

这样子如果我们想要玩的是四子棋,只需要改宏定义里面的数字就行了。
比如:
在这里插入图片描述

这里我们看到刚开始每个格子上都是空白的,也就是说我们棋盘刚开始初始化的是空格,毕竟空格是看不到的。
所以我们就知道了,我们的棋盘都初始化成空格。

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//全部都初始化成空格。
		}
	}
}

在打印我们的棋盘的时候我们可以把我们的棋盘分解一下,有助于我们更好的打印出我们棋盘。
我们观察一下我们的棋盘我们可以将其拆分成:
在这里插入图片描述
在这里插入图片描述
拆分成数据区和划分区:

  • 第一个区域就是我们后面要下棋的地方,而我们的第二个区域是用来分割我们的棋盘的。
  • 而我们仔细观察到我们的(|)总是比我们的棋盘的列少一,也就是说我们的棋盘是三列但是我们的(|)只有2个。
  • 而我们的(—)是有多少列就有多少个,但是我们的的(—)却总是比少一行于是我们就把井字棋划分一下打印:
    在这里插入图片描述
    一个框一个循环,而每个循环里面又套一个循环,这就是我们经典的双循环结构:
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//判断(|)比列少一列
				printf("|");
		}
		printf("\n");
		if (i < row - 1) //比行少一行
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");//判断(---);
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}

2.3玩家下棋

我们玩家下棋就只需要数组我么想要下棋的地方的坐标就行了。
但是我们要注意的三点点就是:

  1. 在我们的编程中我们数组的下标是从0开始的,但是在我们的日常生活中我们都是认为下标是从1开始的所以我们这里就要注意了。
  2. 还有就是我们下棋的地方必须是下在空格处,不能再已经下过棋子的地方再次下棋,同时我们给定下标也不能是超出棋盘范围的数。
  3. 如果我们输入了相同的坐标即输入的坐标已经下子了我们就要重新输入,所以还用设计一个循环结构。

同时我们给定玩家下的棋子是 ‘*’。

void PlayMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1) //这里用来一个while循环用来循环输入了相同的坐标后重新输入
	{
		printf("请输入坐标,中间以空格隔开:");
		scanf("%d %d", &x, &y);
		//判断是否超出棋盘的范围
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')//我们输入的坐标都是比数组下标大1的所以这里我么们要减去。
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用,请重新输入\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}

2.4电脑下棋

电脑下棋的话我们要分析的主要有三点:

  1. 就是生成随机坐标。
  2. 生成随即坐标不能是相同的而且生成的坐标要是棋盘范围内的。
  3. 如果生成了相同的随机坐标即生成的随机坐标已经有子了就要重新生成随机坐标,这里也需要一个循环结构。
  • 而生成随机坐标我们之前也学过了,用生成随值函数rand(),而rand总是与srand搭配的。
  • 而我们的数组的下标是0-row和0-col,所以我们只需要用rand()%row和rand()%col就可以得到我们想要的下标范围了。

根据我们的分析我们就要可以写出一下代码:

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)//循环防止生成相同的随机坐标
	{
		//生成随机坐标
		x = rand() % ROW;
		y = rand() % COL;
		//判断是空格就下子
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

2.5判断输赢

判断谁赢了的方式有三种:

  1. 有一行都是一方的棋子。
  2. 有一列都是一方的棋子。
  3. 有一对角线都是一方的棋子。

而我们棋盘的状态有四种:

  1. 玩家赢了,结束。
  2. 电脑赢了,结束。
  3. 谁都还没赢,继续。
  4. 谁都没赢但是棋盘布满了,平局。

这是种状态我们分别用不同的返回值判断:

  1. 玩家赢了,结束,返回 ‘*’。
  2. 电脑赢了,结束,返回 ‘#’。
  3. 谁都还没赢,继续,返回 ‘C’。
  4. 谁都没赢但是棋盘布满了,平局,返回 ‘Q’。

所以我们就可以这样写:

int IsFull(char board[ROW][COL])
{
	int i = 0,j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
charWhoIsWin(char board[ROW][COL])
{
	int i = 0;
	for (i = 0; i < ROW; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//行
		{
			return board[i][0];
		}
	}
	for (i = 0; i < COL; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//列
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//对边
		return board[0][0];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//对边
		return board[0][2];
	if (IsFull(board) == 1)
		return 'Q';
	return 'C';
}

这里我们注意的是上述代码中我们并没有明摆着返回 ’ * ’ 或者 ‘#’ 而是返回的数组的值,这里其实用到了一点小技巧,就是我们以来就是说

玩家赢了返回 ’ * ’ 电脑赢了返回 ‘#’ 而刚好我们玩家下的棋子也是 ’*‘ 电脑下的棋子也是 ’#‘ 所以我们只需要返回数组的元素就行了。

但是这样写也有局限性,那就是当我们玩的不是三子棋的时候而是玩当四子棋的时候这个就不适用了,所以我们可以将我们的代码升级一下,如以下代码:

char WhoIsWin(char board[ROW][COL], int row, int col)
{
	char ret = 0;
	//判断行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int flag = 0;
		int j = 0;
		for (j = 0; j < col-1; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			return board[i][j];
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		int flag = 0;
		int j = 0;
		for (j = 0; j < row-1; j++)
		{
			if (board[j][i] == board[j + 1][i] && board[j][i] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			return board[j][i];
		}
	}

	//判断对角
	int flag = 0;
	for (i = 0; i < row-1; i++)
	{
		if (board[i][i] == board[i+1][i+1] && board[i][i] != ' ')
		{
			flag = 1;
		}
		else
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
		return board[i][i];

	for (i = 0; i < row-1; i++)
	{
		if (board[i][col - 1 - i] == board[i + 1][col - 1 - (i + 1)] && board[i][col - 1 - i] != ' ')
		{
			flag = 1;
		}
		else
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
		return board[i][col - 1 - i];

	//判断是否布满
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				flag = 1;
				break;
			}
		}
	}
	if (flag == 0)
		return 'Q';
	return 'C';
}

试玩展示:
在这里插入图片描述

3.game.h头文件展示

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char WhoIsWin(char board[ROW][COL], int row, int col);

4.text.c源文件文件展示

void menu()
{
	printf("***********************\n");
	printf("******** 1.play *******\n");
	printf("******** 0.exit *******\n");
	printf("***********************\n");
}
void game()
{
	char ret = 0;
	//初始化棋盘
	char board[ROW][COL] = { 0 };
	InitBoard(board,ROW,COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret=WhoIsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = WhoIsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");

}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
			printf("选择错误,请重新选择:>");
		default:
			break;
		}
	} while (input);
	return 0;
}

5.game.c源文件文件展示

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//棋盘初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}

//玩家下棋
void PlayMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标,中间以空格隔开:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用,请重新输入\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % ROW;
		y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断输赢
char WhoIsWin(char board[ROW][COL], int row, int col)
{
	char ret = 0;
	//判断行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int flag = 0;
		int j = 0;
		for (j = 0; j < col-1; j++)
		{
			if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			return board[i][j];
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		int flag = 0;
		int j = 0;
		for (j = 0; j < row-1; j++)
		{
			if (board[j][i] == board[j + 1][i] && board[j][i] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			return board[j][i];
		}
	}

	//判断对角
	int flag = 0;
	for (i = 0; i < row-1; i++)
	{
		if (board[i][i] == board[i+1][i+1] && board[i][i] != ' ')
		{
			flag = 1;
		}
		else
		{
			flag = 0;
			break;
		}
	}
		{
	if (flag == 1)
		return board[i][i];

	for (i = 0; i < row-1; i++)
	{
		if (board[i][col - 1 - i] == board[i + 1][col - 1 - (i + 1)] && board[i][col - 1 - i] != ' ')
		{
			flag = 1;
		}
		else
			flag = 0;
			break;
		}
	}
	if (flag == 1)
		return board[i][col - 1 - i];

	//判断是否布满
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				flag = 1;
				break;
			}
		}
	}
	if (flag == 0)
		return 'Q';
	return 'C';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 开发中高阶函数的 10 个实例

Android 开发中高阶函数的 10 个实例 Kotlin 是一种现代编程语言&#xff0c;由于其表现力、简洁性和多功能性而变得越来越流行。它的关键特性之一是支持高阶函数&#xff0c;这使您可以编写更简洁、更灵活的代码。高阶函数是一种将一个或多个函数作为参数或返回一个函数作为结…

python+java+nodejs基于vue的企业人事工资管理系统

根据系统功能需求分析&#xff0c;对系统功能的进行设计和分解。功能分解的过程就是一个由抽象到具体的过程。 作为人事数据库系统&#xff0c;其主要实现的功能应包括以下几个模块&#xff1a; 1.登录模块 登录模块是由管理员、员工2种不同身份进行登录。 2.系统管理模块 用户…

工具抓包Charles配置HTTPS步骤

charles抓取HTTPS设置&#xff0c;详细踩坑版 写这篇文章的背景就是&#xff0c;每次我在一台新电脑上用charles抓包时&#xff0c;总是因为各种原因无法抓到https请求&#xff0c;每个百度出来的回答又不是那么详细&#xff0c;需要通过几篇回答才能解决过程中的各种问题&…

C++程序员的职业前景怎么样?来谈谈我自己的想法

我之前提到了程序员在二线城市的大概待遇。今天&#xff0c;我要说一下普通程序员的职业前景。因为最初阶段的工资可能比较高&#xff0c;但如果没有可持续性&#xff0c;这就不是一个特别好的工作。 从我自身的经验来看&#xff0c;我们公司的程序员主要有两条路线。一条是纯…

【存储数据恢复】NetApp存储WAFL文件系统数据恢复案例

存储数据恢复环境&#xff1a; NetApp存储设备&#xff0c;WAFL文件系统&#xff0c;底层是由多块硬盘组建的raid磁盘阵列。 存储故障&#xff1a; 工作人员误操作导致NetApp存储内部分重要数据被删除。 存储数据恢复过程&#xff1a; 1、将存储设备的所有磁盘编号后取出&…

软考A计划-常用公式复习

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

使用Nginx做反向代理

使用Nginx做反向代理 文章目录 使用Nginx做反向代理代理HTTP请求代理HTTPS请求举个大栗子 代理HTTP请求 按照以下步骤使用Nginx做反向代理&#xff1a; 编辑 Nginx 的配置文件。默认情况下&#xff0c;Nginx 的配置文件位于 /etc/nginx/nginx.conf。 sudo nano /etc/nginx/ngi…

1703_LibreOffice常用功能使用体验

全部学习汇总&#xff1a; GreyZhang/windows_skills: some skills when using windows system. (github.com) 首先需要说明的是我不是一个重度Office用户&#xff0c;甚至算不上一个重度的Office用户。我使用的Office软件最多的功能就是文档编辑&#xff0c;绝大多数时候还是文…

【什么是苹果推信?什么是苹果推?】通过苹果手机Imessage进行信息推送的方式;

如今不少人都在利用苹果手机&#xff0c;重要是装备高端&#xff0c;很少呈现卡机的征象&#xff0c;并且星移斗换快&#xff0c;紧跟互联网期间成长的脚步。苹果手机是火了&#xff0c;谁又能想到另有比它更火的事变出现呢&#xff0c;便是苹果推信。苹果推信主要上风是推信群…

晋商银行“沧海”数据资产管理系统

案例名称 晋商银行“沧海”数据资产管理系统 案例简介 晋商银行“沧海”数据资产管理系统&#xff0c;取自“海纳百川、沧海一粟”之意&#xff0c;即数据如茫茫大海&#xff0c;其价值不可估量。该系统贯穿数据的全生命周期&#xff0c;包括数据多维度描述、数据…

期末复习自用--python

前言 python的优点&#xff1a; 简洁&#xff0c;语法优美&#xff0c;简单易学&#xff0c;开源&#xff0c;可移植性好&#xff0c;拓展性好&#xff0c;类库丰富&#xff0c;通用灵活&#xff0c;模式多样&#xff0c;良好的中文支持。 python的缺点&#xff1a; 执行效率不…

1.信息的表示和处理

基础 进制转换 字数据大小 寻址和字节顺序&#xff08;大小端&#xff09; 01 23 45 67 大端法&#xff1a;最高有效字节&#xff08;01&#xff09;在最前面&#xff08;相当于正序&#xff09; 小端法&#xff1a;最低有效字节&#xff08;67&#xff09;在最前面&#xff0…

Ceph入门到精通-CrushMap算法概述

下面是伪代码object到osd的伪代码 locator =object_name obj_hash =hash(locator) pg =obj_hash %num_pg OSDs_for_pg =crush(pg) # returns a list of OSDs primary =osds_for_pg[0] replicas =osds_for_pg[1:] defcrush(pg): all_osds=[osd.0,osd.1,osd.2,...] resu…

【Linux内核解析-linux-5.14.10-内核源码注释】内核常用链表宏解释

1、list_for_each_entry_safe 这段代码是一个宏定义&#xff0c;用于遍历一个链表中所有的元素&#xff0c;并且在遍历过程中可以安全地删除元素。具体来说&#xff0c;这个宏定义的功能是&#xff1a; 遍历链表中所有的元素&#xff0c;从头节点开始&#xff0c;直到尾节点结束…

读SQL进阶教程笔记15_SQL编程思维

1. 还原论 1.1. 认为可以把高级现象还原为低级基本现象的学说 1.2. 将复杂的东西看成是由简单单元组合而成的 1.2.1. 以赋值、条件分支、循环等作为基本处理单元&#xff0c;并将系统整体分割成很多这样的单元的思维方式 1.2.2. 文件系统也是将大量的数据分割成记录这样的小…

DOM事件(中)

常见的事件分类&#xff08;了解&#xff09; ●我们在写页面的时候经常用到的一些事件 ●大致分为几类&#xff0c;浏览器事件 / 鼠标事件 / 键盘事件 / 表单事件 / 触摸事件 ●不需要都记住&#xff0c;但是大概要知道 鼠标事件 ●click &#xff1a;点击事件 ●dblclick &a…

Python小姿势 - # 如何使用Python爬取网页数据

如何使用Python爬取网页数据 今天我们来学习一下如何使用Python来爬取网页数据。 首先&#xff0c;我们需要准备一个空白的文件&#xff0c;在文件中输入以下代码&#xff1a; import requests url http://www.baidu.com r requests.get(url) print(r.text) 上面的代码中&…

宝宝腹泻怎么办?儿科医生分享小儿腹泻的辩证和处理方法

小儿腹泻病是婴幼儿时期的常见病。面对腹泻&#xff0c;很多父母往往不知所措&#xff0c;甚至不知道该怎么处理&#xff0c;只能带宝宝去医院治疗。由于腹泻具有反复性&#xff0c;稍有护理不当&#xff0c;甚至会加重病情。那么&#xff0c;小儿腹泻药如何处理呢&#xff1f;…

微服务---Redis实用篇-黑马头条项目-登录功能(短信验证缓存,用户信息缓存)

黑马头条项目-登录功能(短信验证缓存,用户信息缓存) 1、短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开t…

Android之WindowManager介绍

WindowManager android中真正展示给用户的是window和view. activity在android中所其的作用主要是处理一些逻辑问题&#xff0c;比如生命周期的管理、建立窗口等。 在android中&#xff0c;窗口的管理还是比较重要的一块&#xff0c;因为他直接负责把内容展示给用户&#xff…