字符游戏-智能蛇

2023-11-10

字符游戏-智能蛇

一、VT 100 终端标准

这里按照老师的课件要求,体验一下VT 100 输入输出功能以及清屏操作,代码直接复制课件中代码,这里就不再放一次了,直接给出运行效果:

 gcc sin-demo.c -osin.out -lm
 ./sin.out
  • 运行后不断输出波浪形字符
    在这里插入图片描述

二、kbhit()

我们还是按照课件要求,体验一检测tty输入的程序,将我们之前的snake的代码放入对应位置,运行后查看结果:

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>


static struct termios ori_attr, cur_attr;

static __inline 
int tty_reset(void)
{
        if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)
                return -1;

        return 0;
}


static __inline
int tty_set(void)
{
        
        if ( tcgetattr(STDIN_FILENO, &ori_attr) )
                return -1;
        
        memcpy(&cur_attr, &ori_attr, sizeof(cur_attr) );
        cur_attr.c_lflag &= ~ICANON;
//        cur_attr.c_lflag |= ECHO;
        cur_attr.c_lflag &= ~ECHO;
        cur_attr.c_cc[VMIN] = 1;
        cur_attr.c_cc[VTIME] = 0;

        if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)
                return -1;

        return 0;
}

static __inline
int kbhit(void) 
{
                   
        fd_set rfds;
        struct timeval tv;
        int retval;

        /* Watch stdin (fd 0) to see when it has input. */
        FD_ZERO(&rfds);
        FD_SET(0, &rfds);
        /* Wait up to five seconds. */
        tv.tv_sec  = 0;
        tv.tv_usec = 0;

        retval = select(1, &rfds, NULL, NULL, &tv);
        /* Don't rely on the value of tv now! */

        if (retval == -1) {
                perror("select()");
                return 0;
        } else if (retval)
                return 1;
        /* FD_ISSET(0, &rfds) will be true. */
        else
                return 0;
        return 0;
}

//将你的 snake 代码放在这里
#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define WALL_CELL '*'
#define SNAKE_FOOD '$'

//  -1表示向上(dy)或者向左(dy)  +1表示向下(dy)或者向右(dx)
void snakeMove(int, int);
//随机投放食物 
void put_money(void);
//输出二维数组图形 
void output(void);
//游戏结束 
void gameover(void);
//吃食物
int eat_money(int dx, int dy);

char map[12][12] =
{ "***********",
"*XXXXH    *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"***********" };
int snakeX[SNAKE_MAX_LENGTH] = { 1,2,3,4,5 };
int snakeY[SNAKE_MAX_LENGTH] = { 1,1,1,1,1 };
int moneyX, moneyY;
int snakeLength = 5;
int continuegame = 1;

int main()
{	
	put_money();                               //  首先投放食物 
	output();
        //设置终端进入非缓冲状态
        int tty_set_flag;
        tty_set_flag = tty_set();
	int key;
        while(continuegame == 1) {

		if( kbhit() ) {
                        key = getchar();
                        if(key == 'w' || key == 'W'){
				snakeMove(0, -1);
			}
			if(key == 's' || key == 'S'){
				snakeMove(0, 1);
			}
			if(key == 'a' || key == 'A'){
				snakeMove(-1, 0);
			}
			if(key == 'd' || key == 'D'){
				snakeMove(1, 0);
			}
		system("clear");//对于 VT100 终端, printf("\033[2J"); 也可以实现清屏。
		output();
		gameover();
                } 
        }

        //恢复终端设置
        if(tty_set_flag == 0) 
                tty_reset();
        return 0;
}

void snakeMove(int dx, int dy) {
	int i;
	//判断是否吃到食物
	if (eat_money(dx, dy));
	else {
		map[snakeY[0]][snakeX[0]] = BLANK_CELL;
		//  如果不是,那么以前的最后一节变成空白
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_BODY;
		//  以前的头变成身子
		for (i = 0; i < snakeLength - 1; i++) {
			//  以前所有的坐标都向前移动
			snakeX[i] = snakeX[i + 1];
			snakeY[i] = snakeY[i + 1];
		}
		snakeX[snakeLength - 1] += dx;
		snakeY[snakeLength - 1] += dy;
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_HEAD;
		//  新的头
	}
}

void put_money(void) {
	int i;
	srand(time(NULL));
	moneyX = rand() % 9 + 1;
	srand(time(NULL));
	moneyY = rand() % 9 + 1;
	for (i = 0; i < snakeLength; i++) {
		while (moneyX == snakeX[i] && moneyY == snakeY[i]) {
			srand(time(NULL));
			moneyX = rand() % 9 + 1;
			srand(time(NULL));
			moneyY = rand() % 9 + 1;
			i = -1;
		}
	}
	map[moneyY][moneyX] = '$';
}

void output(void) {
	int i, j; 
	for (i = 0; i < 12; ++i) {
		for (j = 0; j < 12; ++j) {
			printf("%c", map[i][j]);
		}
		putchar('\n');
	}
}

void gameover(void) {
	if (snakeX[snakeLength - 1] == 0 || snakeX[snakeLength - 1] == 10
		|| snakeY[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 10) {
		continuegame = 0;
		printf("撞到墙了!") ; 
	}
	int i;
	for (i = 0; i < snakeLength - 1; i++) {
		//  以前所有的坐标都向前移动
		if (snakeX[i] == snakeX[snakeLength - 1] &&
			snakeY[i] == snakeY[snakeLength - 1]) {
			printf("咬到自己了!") ; 
			continuegame = 0;
			}
	}
	if (SNAKE_MAX_LENGTH == snakeLength) {
		continuegame = 0;
		printf("congratulations!\twin!\n");
	}
}

int eat_money(int dx, int dy) {
	if (snakeX[snakeLength - 1] + dx == moneyX && snakeY[snakeLength - 1] + dy == moneyY) {
		snakeLength++;
		snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;
		snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;
		map[snakeY[0]][snakeX[0]] = SNAKE_BODY;
		map[snakeY[snakeLength - 2]][snakeX[snakeLength - 2]] = SNAKE_BODY;
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_HEAD;
		put_money();
		return 1;
	}
	else return 0;
}
  • 之后我们编译运行,并查看结果:
gcc kihib.c -oihib.out -lm
./kihib.out
  • 可以观察看我们的程序变成了检测键盘输入,而不会在终端上出现我们输入的wasd等操作了,体验到了tty输入的优势
    在这里插入图片描述

三、实现智能蛇

所谓的智能蛇,也就是我们要用程序来为我们的snake选择下一步行走的道路,而取代我们的键盘输入,所以整体逻辑和我们原本的snack是相同的,我们要做的是增加一个选择函数,来代替我们的键盘输入来为snake选择路线

  • 我们首先增加对于路径选择函数的定义:
//自动寻找
char wheregonext(int hx, int hy, int fx, int fy);
  • 之后我们要在检测键盘输入的位置,将字符读取更换为使用我们的函数
	while (continuegame == 1) {                   //  每次循环都要判断是否游戏已经结束
		ch = wheregonext(snakeX[snakeLength - 1], snakeY[snakeLength - 1], moneyX, moneyY);
		printf("\033[2J");
		switch (ch) {
  • 最后是我们的函数部分:
    • 整体思路按照老师给出的伪代码来实现:
    • 伪代码如下
      在这里插入图片描述

实现代码如下:

//用数组distance[4]={0,0,0,0} 记录离食物的距离
char wheregonext(int hx, int hy, int fx, int fy) {// Hx,Hy: 头的位置
	// Fx,Fy:食物的位置
	char p = 0;
	int min = 9999;
	int distance[4];
	distance[0] = abs(fx - (hx - 1)) + abs(fy - hy);
	distance[1] = abs(fx - (hx + 1)) + abs(fy - hy);
	distance[2] = abs(fx - hx) + abs(fy - (hy - 1));
	distance[3] = abs(fx - hx) + abs(fy - (hy + 1));
	// 分别计算蛇头周边四个位置到食物的距离。H头的位置,F食物位置
	if (distance[0] <= min && (map[hy][hx - 1] == ' ' || map[hy][hx - 1] == '$')) {
		min = distance[0];
		p = 'a';
	}
	if (distance[1] <= min && (map[hy][hx + 1] == ' ' || map[hy][hx + 1] == '$')) {
		min = distance[1];
		p = 'd';
	}
	if (distance[2] <= min && (map[hy - 1][hx] == ' ' || map[hy - 1][hx] == '$')) {
		min = distance[2];
		p = 'w';
	}
	if (distance[3] <= min && (map[hy + 1][hx] == ' ' || map[hy + 1][hx] == '$')) {
		min = distance[3];
		p = 's';
	}
	// 选择distance中存最小距离的下标p,最小距离不能是9999
	return p;

}

运行结果:

在这里插入图片描述

  • 完整代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>


#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define WALL_CELL '*'
#define SNAKE_FOOD '$'

//  -1表示向上(dy)或者向左(dy)  +1表示向下(dy)或者向右(dx)
void snakeMove(int, int);
//随机投放食物 
void put_money(void);
//输出二维数组图形 
void output(void);
//游戏结束 
void gameover(void);
//吃食物
int eat_money(int dx, int dy);
//自动寻找
char wheregonext(int hx, int hy, int fx, int fy);

char map[12][12] =
{ "***********",
"*XXXXH    *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"*         *",
"***********" };
int snakeX[SNAKE_MAX_LENGTH] = { 1,2,3,4,5 };
int snakeY[SNAKE_MAX_LENGTH] = { 1,1,1,1,1 };
int moneyX, moneyY;
int snakeLength = 5;
int continuegame = 1;


int main() {
	char ch = 0;
	put_money();                               //  首先投放食物 
	output();
	while (continuegame == 1) {                   //  每次循环都要判断是否游戏已经结束
		ch = wheregonext(snakeX[snakeLength - 1], snakeY[snakeLength - 1], moneyX, moneyY);
		printf("\033[2J");
		switch (ch) {
		case 'A':
		case 'a':
			snakeMove(-1, 0);		//  向左移动 
			break;
		case 'D':
		case 'd':
			snakeMove(1, 0);		//  向右移动 
			break;
		case 'W':
		case 'w':
			snakeMove(0, -1);		//  向上移动 
			break;
		case 'S':
		case 's':
			snakeMove(0, 1);		//  向下移动 
			break;
		default: break;
		}
		output();
		gameover();
		sleep(1);
	}
	printf("Game Over");
}

void snakeMove(int dx, int dy) {
	int i;
	//判断是否吃到食物
	if (eat_money(dx, dy));
	else {
		map[snakeY[0]][snakeX[0]] = BLANK_CELL;
		//  如果不是,那么以前的最后一节变成空白
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_BODY;
		//  以前的头变成身子
		for (i = 0; i < snakeLength - 1; i++) {
			//  以前所有的坐标都向前移动
			snakeX[i] = snakeX[i + 1];
			snakeY[i] = snakeY[i + 1];
		}
		snakeX[snakeLength - 1] += dx;
		snakeY[snakeLength - 1] += dy;
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_HEAD;
		//  新的头
	}
}

void put_money(void) {
	int i;
	srand(time(NULL));
	moneyX = rand() % 9 + 1;
	//  钱的横纵坐标随机产生
	srand(time(NULL));
	moneyY = rand() % 9 + 1;
	//  如果钱砸身子上了,就换
	for (i = 0; i < snakeLength; i++) {
		while (moneyX == snakeX[i] && moneyY == snakeY[i]) {
			srand(time(NULL));
			moneyX = rand() % 9 + 1;
			srand(time(NULL));
			moneyY = rand() % 9 + 1;
			i = -1;
		}
	}
	map[moneyY][moneyX] = '$';
}

void output(void) {
	int i, j;
	for (i = 0; i < 12; ++i) {
		for (j = 0; j < 12; ++j) {
			printf("%c", map[i][j]);
		}
		putchar('\n');
	}
}

void gameover(void) {
	if (snakeX[snakeLength - 1] == 0 || snakeX[snakeLength - 1] == 10
		|| snakeY[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 10) {
		continuegame = 0;
		printf("撞到墙了!");
	}
	int i;
	for (i = 0; i < snakeLength - 1; i++) {
		//  以前所有的坐标都向前移动
		if (snakeX[i] == snakeX[snakeLength - 1] &&
			snakeY[i] == snakeY[snakeLength - 1]) {
			printf("咬到自己了!");
			continuegame = 0;
		}
	}
	if (SNAKE_MAX_LENGTH == snakeLength) {
		continuegame = 0;
		printf("congratulations!\twin!\n");
	}
}

int eat_money(int dx, int dy) {
	if (snakeX[snakeLength - 1] + dx == moneyX && snakeY[snakeLength - 1] + dy == moneyY) {
		//  判断是否吃到了money,即两者坐标是否完全相等
		snakeLength++;
		//  如果是,长度加 1
		snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;
		//  头坐标向前移动,表示头向前走了一步
		snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;
		map[snakeY[0]][snakeX[0]] = SNAKE_BODY;
		//  因为新生了一节,所以以前的最后一节依然是SNAKE_BODY
		map[snakeY[snakeLength - 2]][snakeX[snakeLength - 2]] = SNAKE_BODY;
		//  以前的头变成了身子
		map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = SNAKE_HEAD;
		//  现在的头
		put_money();
		//  再生一个'$'
		return 1;
	}
	else return 0;
}
//用数组distance[4]={0,0,0,0} 记录离食物的距离
char wheregonext(int hx, int hy, int fx, int fy) {// Hx,Hy: 头的位置
	// Fx,Fy:食物的位置
	char p = 0;
	int min = 9999;
	int distance[4];
	distance[0] = abs(fx - (hx - 1)) + abs(fy - hy);
	distance[1] = abs(fx - (hx + 1)) + abs(fy - hy);
	distance[2] = abs(fx - hx) + abs(fy - (hy - 1));
	distance[3] = abs(fx - hx) + abs(fy - (hy + 1));
	// 分别计算蛇头周边四个位置到食物的距离。H头的位置,F食物位置
	if (distance[0] <= min && (map[hy][hx - 1] == ' ' || map[hy][hx - 1] == '$')) {
		min = distance[0];
		p = 'a';
	}
	if (distance[1] <= min && (map[hy][hx + 1] == ' ' || map[hy][hx + 1] == '$')) {
		min = distance[1];
		p = 'd';
	}
	if (distance[2] <= min && (map[hy - 1][hx] == ' ' || map[hy - 1][hx] == '$')) {
		min = distance[2];
		p = 'w';
	}
	if (distance[3] <= min && (map[hy + 1][hx] == ' ' || map[hy + 1][hx] == '$')) {
		min = distance[3];
		p = 's';
	}
	// 选择distance中存最小距离的下标p,最小距离不能是9999
	return p;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符游戏-智能蛇 的相关文章

  • python 使用前馈神经网络处理IrIs数据集(BP)

    本文章包含以下内容 数据 lris数据集 模型 前馈神经网络 激活函数 Logistic 损失函数 交叉嫡损失 优化器 梯度下降法 评价指标 准确率 输出层使用了Softmax分类 通过使用前馈神经网络实现BP学习算法 进一步理解前馈神经网
  • Java基础 --- 注解 Annotation

    Java基础 注解 Annotation Java注解 Java自带的标准注解 自定义注解 Java注解 Java注解它提供了一种安全的类似注释的机制 用来将任何的信息或元数据 metadata 与程序元素 类 方法 成员变量等 进行关联
  • Pytest-UnitTest

    2023暑期学习 Pytest Pytest pytest是python的一种单元测试框架 与python自带的unittest测试框架类似 但是比unittest框架使用起来更简洁 效率更高 pip install pytest pyte
  • JavaScript的三大组成部分(收藏)

    JavaScript是一种属于网络的脚本语言 已经被广泛用于Web应用开发 常用来为网页添加各式各样的动态功能 为用户提供更流畅美观的浏览效果 通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的 各位小伙伴在进阶的时候总会
  • 放个手机在单位自动打卡_几步神奇操作让你的钉钉自动打卡

    这款叫做 FreeDing 的 Android 应用 是一个钉钉自动打卡工具 只需要把手机放在办公室 就能实现每天自动定时打卡了 Appinn 这是一个程序员一不爽就造轮子的故事 diy0504 同学所在公司打卡要求越来越严格 忘记打卡不准
  • 实用mysql命令

    1 显示表中所有列的详细信息 show full columns table name 2 查看服务器版本 show version 3 查看当前登录用户 select current user 4 显示表的详细信息 show table
  • 聊聊 Docker 和 Dockerfile

    目录 一 前言 二 了解Dockerfile 三 Dockerfile 指令 四 多阶段构建 五 Dockerfile 高级用法 六 小结 一 前言 对于开发人员来说 会Docker而不知道Dockerfile等于不会Docker 上一篇文
  • This beta version of Typora is expired, please download and install a newer version.

    一 问题 打开typora软件提示如下图 翻译过来就是 此测试版Typora已过期 请下载并安装新版本 二 解决办法 1 win R调用运行窗口 输入regeedit 打开注册表 2 在注册表数据输入 计算机 HKEY CURRENT US
  • javaScript基础面试题 ---call、apply、bind三者的异同 - 改变this的方法,apply和call最初设计的时候为什么要设计这两个,为什么apply参数是数组call不是

    call apply bind三者的异同 call方法 apply方法 bind方法 call apply bind三者的异同 改变this的方法 apply和call最初设计的时候为什么要设计这两个 为什么apply参数是数组call不是
  • 如何使用JLINK在ADS1.2环境下调试硬件?

    注 虽然文章是对LPC2148而写的 但是对三星的44B0芯片同样适用 只需要在选择时将相应的CPU选择的S3C44B0就可以了 JLINK在ADS下调试心得 前两天一个客户用jlink 在ADS来调试LPC2148总报错 这个错误我之前在
  • 对象有多个字段新增日志执行的方法却只有几个?

    我以上代码 AssetCard对象有多个字段 最后执行新增却只有几个字段 我之前开发的项目都是公司自己开发的框架 是解决了字段可以包含下划线的 然后这次客户需要我写个插件 我就自己搭建了一个项目 让后发现字段包含下划线底层sql就会缺少字段
  • 根据地理位置多语言切换(3)-多语言切换

    在手机应用的实现中经常会遇到需要语言切换用于满足用户环境的多样性 可以根据所处地理位置信息进行经纬度及国家 城市 地区的获取 可以根据此内容进行多语言情况的推荐及切换 完成上述的想法需要进行几个功能的开发 需要通过手机进行地理位置信息获取
  • 【无监督】6、SimSiam

    文章目录 一 背景 二 方法 三 效果 论文 Exploring Simple Siamese Representation Learning 出处 FAIR 何恺明大佬 本文作者抛出了两个爆炸 性结论 结论一 基于孪生网络的对比的学习的成
  • 外盘国际期货招商

    100万在各省市能生活多久 按照去年人均消费支出计算 上海100万能花不到22年 西藏能花近63年 2021年我国居民人均预期寿命 78 2岁 2022年我国各省市人均消费支出 365日 西藏43 5 日 62年11个月 2022年我国各省
  • M ySql基础3

    一 MySql存储过程和函数 概念 好处 存储过程和函数的区别 创建存储过程 调用存储过程 查看存储过程 删除存储过程 存储过程语法 二 MySql触发器 创建触发器 查看触发器 删除触发器 触发器的总结 三 MySQL事务 事物的概念 未
  • 可重入函数与线程安全

    指令乱序和线程安全 先来看什么是指令乱序问题以及为什么有指令乱序 程序的代码执行顺序有可能被编译器或CPU根据某种策略打乱指令执行顺序 目的是提升程序的执行性能 让程序的执行尽可能并行 这就是所谓指令乱序问题 理解指令乱序的策略是很重要的
  • 开手游要选用怎么样的服务器

    想要让玩家的游戏体验感好不仅需要好的游戏策划 画风 内容 更需要一款好的服务器来进行支撑 服务器就好比基石 而策划内存等等就是框架 如果基石不稳定 再好的游戏也很难给玩家良好的体验感 那么如何来选择一款好的服务器来作为游戏的基石呢 首先根据
  • webpack:代码分割

    webpack中文文档地址 https www webpackjs com 从webpack4开始官方移除了commonchunk插件 改用了optimization属性进行更加灵活的配置 配置项 注意 webpack4及以上才支持opti
  • df.corr和df.describe()

    1 df corr df corr 函数的作用是返回列与列之间的相关系数 corr matrix df corr sns heatmap corr matrix annot True cmap coolwarm 2 df describe

随机推荐

  • javascript 定时器

    本文转载自 JavaScript定时器详解及实例
  • Pycharm的破解安装

    Pycharm的卸载 参考 转载 1 程序文件目录 所有的相关文件都保存在解压缩的目录中 即 opt pycharm community 2018 1 4 目录下 2 配置文件目录 启动PyCharm后 会在用户家目录下建立一个 PyCha
  • 数据仓库和非结构化数据。

    数据仓库包含标准化数据 还包含 外部数据 非结构化数据 如果外部数据 量小 可以保持数据库内部或者专用服务器 如果量大 只能记住地址 在etl 加载 当然也有需求 是实时数据 比如股票 汇率 拿只能etl过程处理 非结构化数据 包含图片 视
  • 软考中级软件设计师 2009-2022年真题

    整理了2009年到2022年 软考中级软件设计师的题目与参考答案 百度网盘分享 链接 https pan baidu com s 1f4Hfuw7lzgM4IZa g1Wepg pwd 50c1 提取码 50c1 成绩出来啦 大家加油吼
  • 安装webpack及使用less-loader出现的错误

    webpack安装 使用less loader报错 Module build failed TypeError loaderContext getResolve is not a function webpack是一个前端模块打包工具 与g
  • Ceph集群中指定OSD 创建 pool

    导读 如何利用crush来对不同数据指定不同设备的osd存储 这边我是用虚拟机演示 所以都是hdd 这边假设osd0 2 4为ssd设备 osd 1 3 5为sata设备 背景 在我们的ceph集群中 可能不只有sata盘或者ssd盘 有些
  • 7、Shiro+SpringMVC+oracle+maven整合

    本章节主要介绍Shiro SpringMVC oracle maven整合 并实现shiro的身份验证和授权 建表并插入数据 1 用户表 CREATETABLEusers Table user id number 10 primarykey
  • leetcode-找出数组中的重复数字

    我们让最终的nums序列其索引号与数值相等 即0号索引位置上的数值是0 1号索引位置上的数值是1 当前nums i 没有放到正确的坑上 并且那个正确的坑上的数与那个坑是不匹配的 那么就要不停地交换 交换到不能交换的时候 就要判断一下 是不是
  • springboot毕设项目《C语言程序设计》题库管理系统39b5j(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目 C语言程序设计 题库管理系统39b5j java VUE Mybatis Maven Mysql 项目运行 环境配置 Jdk1 8 Tomcat8 5 Mysql HBuilderX Webstorm也行 Ec
  • C# 获取任务栏托盘通知区域中某个程序小图标位置

    一个小项目中需要用刀点击任务栏右下角通知区域的小图标 从而触发事件 其中比较容易出问题的地方是 public bool FindNotifyIcon IntPtr hTrayWnd ref Rect rectNotify UInt32 tr
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    学习目标 了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用
  • 安装liunx双系统总结

    安装liunx双系统总结 参考文章 安装liunx详尽文章 https www cnblogs com masbay p 10844857 html 首先将硬盘分好区 我是双硬盘 在win10安装的硬盘内 C盘里压缩出200MB的空间 另一
  • 真机安装Linux Centos7

    准备工具 8G左右U盘 最新版UltraISO CentOS7光盘镜像 操作步骤 下载镜像 地址 http isoredirect centos org centos 7 isos x86 64 安装刻录工具UltraISO 刻录镜像到U盘
  • (React入门)组件通信

    1 父组件向子组件通信 props 父组件直接通过props向子组件传递需要的信息 import React Component from react 子组件 class Child extends Component render con
  • 怎么搭建微服务架构?

    我要何时使用微服务架构 又如何将应用程序分解为微服务 分解后 要如何去搭建微服务架构 同时 在微服务架构中 因为会涉及到多个组件 那么这些组件又可以使用什么技术来实现呢 接下来的几个小节中 我们将对这些问题进行详细的讲解 微服务的拆分 对于
  • Jenkins

    Jenkins jenkins定义 jenkins功能 tomcat项目部署 jenkins安装 安装后的jenkins的配置 Jenkins jenkins定义 jenkins tomcat 部署 安装 jenkins 是一个开源软件项目
  • 栈的概念和基本使用

    栈 Stack 是一种线性序列结构 其操作仅限于逻辑上特定的一端 即新元素只能从栈的一端插入 也只能从栈的一端弹出 允许操作的一端叫做栈顶 禁止操作的一端叫做栈底 插入元素称为入栈 弹出元素称为出栈 栈中各个元素的操作次序遵循所谓的后进先出
  • 涅普2021训练营-MIsc(部分)

    bin txt 打开附件发现是一大串的二进制字符串 使用python直接转换成16进制 最好别用网页转换 字符串太长了 也不需要创建什么函数 直接进制转换 参考格式 hex int 字符串 2 将得到的16进制吗复制到文本 将0x删除后复制
  • git 服务端钩子做代码检查

    需求分析 在代码修改后可以对代码进行检查 比如代码规范检查 代码构建 单元测试等 我们需要禁止成员推送不符合规范的代码到服务端 Git 钩子能在特定的重要动作发生时触发自定义脚本 钩子分为客户端和服务器端两类 使用客服端钩子可以在commi
  • 字符游戏-智能蛇

    字符游戏 智能蛇 一 VT 100 终端标准 这里按照老师的课件要求 体验一下VT 100 输入输出功能以及清屏操作 代码直接复制课件中代码 这里就不再放一次了 直接给出运行效果 gcc sin demo c osin out lm sin