贪吃蛇——C语言(附源码)

2023-11-12

文件在github下gh-pages分支

考虑到实验要求为10*10地图,下两程序不对地图做修改。

会动的蛇snake_move

贪吃蛇snake_eat

游戏设计及算法

分解问题:

首先贴上游戏玩法以及表示:

1、玩法

贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。百度百科

2、游戏表示

给定一个10 * 10的字符矩阵表示蛇的生存空间,其中有一条长度5的蛇 (HXXXX), “ H ”表示蛇头,“ X ”表示蛇身体。空间中可能有食物(“ $ ”表示)和障碍物(“ * ”表示)

你可以使用“ADWS”按键分别控制蛇的前进方向“左右上下”, 当蛇头碰到自己的身体或走出边界,游戏结束,否则蛇按你指定方向前进一步。

分清游戏要素:(初步)

游戏对象主体是蛇,其次是墙、食物。另外,我们还需模块化设计出,移动、判断是否自食或撞墙、··· 的函数。

细化问题:

体现自顶向上的设计思维,逐步求精

首先是main()的窗口设计:

(注意:该游戏可选择是否重玩)

int main() { 

	while(if_start_game) {
		restart();//重置游戏 ,在此处选择是否运行游戏,y运行,其余键退出 
		playgame();//玩游戏 
	}
	
	return 0;
}
细化问题之关于游戏对象表示的实现

如何表示出游戏界面?我们可以采用一个二维数组记录墙、食物、蛇的位置。

(考虑到可以选择是否重玩游戏,将使用的数组区分为用于restart和用于playgame两种,restart的数组作为游戏初始记录用,而playgame则用于游戏进行时对游戏对象记录。其余的函数的名称标注也是此用意)

的表示是简单的,在二维数组的边缘且无需改变。

食物呢?我们通过一个产生随机数的函数,随机生成横纵坐标,并判断是否在地图内。若坐标可行,则在此位置打印出食物。

接下来是,为了实现移动,我们发现,主导因素是蛇头、蛇尾,因为在每一次的移动中,中间的蛇节就像是不动的一样,这给我们的设计提供了便捷之处,但是单单关注蛇头、蛇尾又是不足够的,因为蛇拐弯是,靠近蛇头的蛇节并不知道自己何去何从,这就引发我们的深层思考,除蛇头外,必须记录每一节蛇的下一节的坐标。

于是,贴出代码:

char map_restart[12][13] = {//初始状态地图 
	"************",      //可用于重置游戏
	"*XXXXH     *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"************"
};
int headx = 1,heady = 5,tailx = 1,taily = 1;//创建表示蛇头、蛇尾的坐标变量 
char map_playgame[12][13];//游戏中用于记录蛇、食物等坐标的“游戏时 ”地图

char snake_nextx_restart[12][12] = {//初始状态时用于记录除蛇头外每一节蛇的下一节的x坐标 
	{0,0,0,0,0,0,0,0,0,0,0,0},   //可用于重置游戏 
	{0,1,1,1,1,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0}
};
char snake_nextx_playgame[12][12];//游戏时用于记录除蛇头外每一节蛇的下一节的x坐标  

char snake_nexty_restart[12][12] = {//初始状态时用于记录除蛇头外每一节蛇的下一节的y坐标
	{0,0,0,0,0,0,0,0,0,0,0,0},   //可用于重置游戏
	{0,2,3,4,5,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
};
char snake_nexty_playgame[12][12];//游戏时用于记录除蛇头外每一节蛇的下一节的y坐标

上述代码展示了初始的墙以及蛇,接下来是投放食物的函数

void put_food(){    //  随机投放食物 

    srand(time(0)); //  初始化伪随机
    int x,y;
    while (1) { //  一直循环随机直到出现可行坐标 
        x=rand() % 12; y=rand() % 12;    //  随机一个坐标 
        if (map_playgame[x][y]==BLANK_CELL) {    //  若此坐标为空白格 
            map_playgame[x][y] = SNAKE_FOOD ;   //  改为食物 
            return;     //  跳出 
        }  
    }
    
}
细化问题之游戏的restart、playgame

做好了上述表示工作,我们以自顶向上的游戏设计思维为蓝图,此时应该设计游戏的重置以及进行。

贴上代码:

void restart() {//重置游戏 

	memcpy(map_playgame,map_restart,sizeof(map_restart));
	
    memcpy(snake_nextx_playgame,snake_nextx_restart,sizeof(snake_nextx_restart));
    
    memcpy(snake_nexty_playgame,snake_nexty_restart,sizeof(snake_nexty_restart));
    
    headx = 1,heady = 5,tailx = 1,taily = 1;if_end_game = 0;//重置蛇头蛇尾的位置,并且更新end变量 
    
	printf("Welcome to Greedy Snake!\n");
	printf("Do you want to start?\ny for yes;n for no\n");
	scanf("%c",&if_start_game);
	getchar(); //将上一次scanf输入后的回车清除 
	if(if_start_game != 'y') exit(1); //除了'y',其余键退出 
}
void playgame() {//进行游戏

	system("cls");//清屏 
	int if_hit = 0;//判断键盘是否有输入 
	put_food();//投放食物 
	print_map_playgame();//打印初始地图 
	char direction = 'd';//初始方向为'd',即朝向右
	int first_press = 0;//这是为了防止在为进行游戏前闪屏而设置的bool变量  
	while(!if_end_game) {
		char next_direction ;
		if(kbhit()) {//当键盘有敲击时才给下一次方向赋值 
        	next_direction = getch();
        	first_press = 1;//这里表示有了第一次键盘输入
        }
		if(next_direction != direction) {//如果下一次方向与当前方向不同,判断下列语句 
			if(next_direction + direction == 'w'+'s' || next_direction + direction == 'a'+'d');
										//如果下一次方向与当前相反,不做改变 
			else direction = next_direction;
										//否则改变方向 
		}//如果下一次方向与当前相同,不做改变 
		switch(direction) {
			case 'w': snake_move(-1,0);break;
			case 'a': snake_move(0,-1);break;
			case 's': snake_move(1,0);break;
			case 'd': snake_move(0,1);break;
		}
		if(first_press) {//当有了第一次键盘输入之后,再清屏打出地图,避免未进行游戏前闪屏
			system("cls");//清屏 
			print_map_playgame();//打印进行一次snake_move后的地图 
		}
	}
	system("cls");//跳出上述循环时,游戏结束,清屏 
	
}
细化问题之蛇的移动以及“贪吃”

最棘手、最核心的问题莫过于如何让蛇动起来。通过上述的细化问题,我们清楚地知道我们对蛇的移动需要兼顾蛇头和蛇尾、蛇节两大部分,判断是否撞墙或者自食或者是吃到食物是容易的,难点在于如何在打印出地图时,蛇朝着期望的方向前进。

除却撞墙及自食结束游戏的情况,蛇的移动剩下是否进食两种情况,若进食,那么由于会生长出新的一节,则相当于蛇尾不动,蛇头前进。若未进食,则蛇全身动,此时除蛇头每一节蛇都要到达原先未移动时下一节蛇的位置,至此,蛇的移动的设计思想即如上。

贴出代码:

void snake_move(int dx,int dy) {//蛇移动 
    
	int is_eat = 0;//bool变量判断是否吃到食物
	int x,y;//用于暂存坐标 
	if(map_playgame[headx + dx][heady + dy] == SNAKE_FOOD) {//判断头部进行move时是否会碰到食物 
		is_eat = 1;//如果吃到食物则更新bool 
	}
	if(!is_eat) {//如果没吃到食物,尾巴将往下一节移动 
		Sleep(100);
		map_playgame[tailx][taily] = BLANK_CELL;//尾部变成空格
		x = snake_nextx_playgame[tailx][taily];
		y = snake_nexty_playgame[tailx][taily];//获取新蛇尾的坐标 
		tailx = x; taily = y;
	}
	if (map_playgame[headx+dx][heady+dy] == WALL_CELL || map_playgame[headx+dx][heady+dy] == SNAKE_BODY) {  
	     // 判断蛇头移动至的位置是否墙或蛇身 
        if_end_game = 1; //  若是墙或蛇身则游戏结束 
        return; 
    }
    //除了撞墙,无论是否进食,头部均会移动
    x = headx + dx ; y = heady + dy;
	snake_nextx_playgame[headx][heady] = x;
	snake_nexty_playgame[headx][heady] = y;//更新离头部最近的一节蛇的下一节的坐标,即头部坐标 
	map_playgame[x][y] = SNAKE_HEAD;//移动头部 
	map_playgame[headx][heady] = SNAKE_BODY;
	headx = x ; heady = y;//更新头部的坐标
	if(is_eat) {
		put_food();
	} 
} 

对于Sleep(a)函数的a参数的把握是必要的,为什么?

若去掉Sleep(a)函数,蛇的移动将非常快,死的也快。若Sleep(a)函数的参数a(以毫秒为单位)设计过大,将会使蛇的动作延迟非常明显,于是,经过反复测验,我采用100毫秒的延迟时间(其实这是睡眠时间,即程序睡眠,这里的效果及目的在于延迟故称之为延迟时间)。

完整代码(问题解决)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<conio.h>
#include<windows.h>

//游戏中横向为y,竖向为x 
//整条蛇为snake,除蛇头外,每一节蛇的下一节为snake_nextx与snake_nexty 
//标记为restart为重置游戏用,记录初始状态
//标记为playgame为游戏进行时记录蛇位置用
 
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

char if_start_game = 'y';//用于判断是否是用户意愿停止游戏 
int if_end_game = 0;//用于判断是否是撞墙或者自食而停止游戏 

char map_restart[12][13] = {//初始状态地图 
	"************",      //可用于重置游戏
	"*XXXXH     *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"*          *",
	"************"
};
int headx = 1,heady = 5,tailx = 1,taily = 1;//创建表示蛇头、蛇尾的坐标变量 
char map_playgame[12][13];//游戏中用于记录蛇、食物等坐标的“游戏时 ”地图

char snake_nextx_restart[12][12] = {//初始状态时用于记录除蛇头外每一节蛇的下一节的x坐标 
	{0,0,0,0,0,0,0,0,0,0,0,0},   //可用于重置游戏 
	{0,1,1,1,1,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0}
};
char snake_nextx_playgame[12][12];//游戏时用于记录除蛇头外每一节蛇的下一节的x坐标  

char snake_nexty_restart[12][12] = {//初始状态时用于记录除蛇头外每一节蛇的下一节的y坐标
	{0,0,0,0,0,0,0,0,0,0,0,0},   //可用于重置游戏
	{0,2,3,4,5,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0},
};
char snake_nexty_playgame[12][12];//游戏时用于记录除蛇头外每一节蛇的下一节的y坐标

void print_map_playgame();//打印地图 
void put_food();//投放食物 
void snake_move(int dx,int dy);//蛇移动 
void restart();//重置游戏
void playgame();//进行游戏 

int main() { 

	while(if_start_game) {
		restart();//重置游戏 ,在此处选择是否运行游戏,y运行,其余键退出 
		playgame();//玩游戏 
	}
	
	return 0;
}

void print_map_playgame() {
	int i;
	for(i=0;i<12;i++) {
        printf("%s\n",map_playgame[i]);
    }
    
} 
void put_food(){    //  随机投放食物 

    srand(time(0)); //  初始化伪随机
    int x,y;
    while (1) { //  一直循环随机直到出现可行坐标 
        x=rand() % 12; y=rand() % 12;    //  随机一个坐标 
        if (map_playgame[x][y]==BLANK_CELL) {    //  若此坐标为空白格 
            map_playgame[x][y] = SNAKE_FOOD ;   //  改为食物 
            return;     //  跳出 
        }  
    }
    
}
void snake_move(int dx,int dy) {//蛇移动 
    
	int is_eat = 0;//bool变量判断是否吃到食物
	int x,y;//用于暂存坐标 
	if(map_playgame[headx + dx][heady + dy] == SNAKE_FOOD) {//判断头部进行move时是否会碰到食物 
		is_eat = 1;//如果吃到食物则更新bool 
	}
	if(!is_eat) {//如果没吃到食物,尾巴将往下一节移动 
		Sleep(100);
		map_playgame[tailx][taily] = BLANK_CELL;//尾部变成空格
		x = snake_nextx_playgame[tailx][taily];
		y = snake_nexty_playgame[tailx][taily];//获取新蛇尾的坐标 
		tailx = x; taily = y;
	}
	if (map_playgame[headx+dx][heady+dy] == WALL_CELL || map_playgame[headx+dx][heady+dy] == SNAKE_BODY) {  
	     // 判断蛇头移动至的位置是否墙或蛇身 
        if_end_game = 1; //  若是墙或蛇身则游戏结束 
        return; 
    }
    //除了撞墙,无论是否进食,头部均会移动
    x = headx + dx ; y = heady + dy;
	snake_nextx_playgame[headx][heady] = x;
	snake_nexty_playgame[headx][heady] = y;//更新离头部最近的一节蛇的下一节的坐标,即头部坐标 
	map_playgame[x][y] = SNAKE_HEAD;//移动头部 
	map_playgame[headx][heady] = SNAKE_BODY;
	headx = x ; heady = y;//更新头部的坐标
	if(is_eat) {
		put_food();
	} 
} 
void restart() {//重置游戏 

	memcpy(map_playgame,map_restart,sizeof(map_restart));
	
    memcpy(snake_nextx_playgame,snake_nextx_restart,sizeof(snake_nextx_restart));
    
    memcpy(snake_nexty_playgame,snake_nexty_restart,sizeof(snake_nexty_restart));
    
    headx = 1,heady = 5,tailx = 1,taily = 1;if_end_game = 0;//重置蛇头蛇尾的位置,并且更新end变量 
    
	printf("Welcome to Greedy Snake!\n");
	printf("Do you want to start?\ny for yes;n for no\n");
	scanf("%c",&if_start_game);
	getchar(); //将上一次scanf输入后的回车清除 
	if(if_start_game != 'y') exit(1); //除了'y',其余键退出 
}
void playgame() {//进行游戏

	system("cls");//清屏 
	int if_hit = 0;//判断键盘是否有输入 
	put_food();//投放食物 
	print_map_playgame();//打印初始地图 
	char direction = 'd';//初始方向为'd',即朝向右
	int first_press = 0;//这是为了防止在为进行游戏前闪屏而设置的bool变量  
	while(!if_end_game) {
		char next_direction ;
		if(kbhit()) {//当键盘有敲击时才给下一次方向赋值 
        	next_direction = getch();
        	first_press = 1;//这里表示有了第一次键盘输入
        }
		if(next_direction != direction) {//如果下一次方向与当前方向不同,判断下列语句 
			if(next_direction + direction == 'w'+'s' || next_direction + direction == 'a'+'d');
										//如果下一次方向与当前相反,不做改变 
			else direction = next_direction;
										//否则改变方向 
		}//如果下一次方向与当前相同,不做改变 
		switch(direction) {
			case 'w': snake_move(-1,0);break;
			case 'a': snake_move(0,-1);break;
			case 's': snake_move(1,0);break;
			case 'd': snake_move(0,1);break;
		}
		if(first_press) {//当有了第一次键盘输入之后,再清屏打出地图,避免未进行游戏前闪屏
			system("cls");//清屏 
			print_map_playgame();//打印进行一次snake_move后的地图 
		}
	}
	system("cls");//跳出上述循环时,游戏结束,清屏 
	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贪吃蛇——C语言(附源码) 的相关文章

  • Java接口幂等性设计场景解决方案v1.0

    Java接口幂等性设计场景解决方案v1 0 1 面试 实际开发场景 1 1面试场景题目 分布式服务接口的幂等性如何设计 比如不能重复扣款 1 2 题目分析 一个分布式系统中的某个接口 要保证幂等性 如何保证 这个事 其实是你做分布式系统的时
  • JSP session的生命周期简介说明

    转自 JSP session的生命周期简介说明 下文笔者将讲述session生命周期的相关简介说明 如下所示 Session存储在服务器端 当客户端关闭浏览器 并不意味着Session对象的销毁 如果不是显式调用invalidate 去销毁
  • [39题] 牛客深度学习专项题

    1 卷积核大小 提升卷积核 convolutional kernel 的大小会显著提升卷积神经网络的性能 这种说法是 正确的 错误的 这种说法是错误的 提升卷积核的大小并不一定会显著提升卷积神经网络的性能 卷积核的大小会影响网络的感受野 r
  • Java时间处理(UTC时间和本地时间转换)

    文章内容引用来源 http blog csdn net top code article details 50462922 前言 本文主要对UTC GMT CST等时间概念做简单的介绍 比较实用的在于本文最后一个小知识点 带时区格式的时间和

随机推荐

  • python编程题-基本编程题 --python

    1 让Python帮你随机选一个饮品吧 import random listC 加多宝 雪碧 可乐 勇闯天涯 椰子汁 print random choices listC type random choices listC choices函
  • hbuilder如何设置图片居中显示_啊哦!WORD设置格式后,我插入的图片显示不全怎么办?...

    每天分享一个小技巧 不如各位在日常办公中 有没有这样的烦恼 一个编辑好的文档 已经到了最后一步 Ctrl A 全选 设置格式 然后 发现文档里的图片 它 它 它 它 它显示不全了 就像这样 其实导致这种问题发生的原因 很简单 就是因为我们批
  • LeetCode算法题 - 两整数相加(简单)

    题目 func sum num1 int num2 int int return num1 num2
  • SpringBoot通过Excel文件导入用户信息,找出Excel(ArrayList)中重复的元素和个数

    Excel文件内容如下 其中userCode不能重复 怎么返回重复的userCode和个数呢 因为Map是存储键值对这样的双列数据的集合 其中存储的数据是无序的 它的键是不允许重复的 值是允许重复的 也就是只保留一项数据 不记录重复数据 所
  • 2021年南京大学842考研-软件工程部分代码设计题

    题干 1 以下代码是否有问题 有什么影响 2 给出改进 按钮构件 Class Button private Label label private List list public void change list update label
  • 启动hadoop集群

    1 配置core site xml 每个节点上都要配置 路径 usr local hadoop 2 7 3 etc hadoop core site xml 配置项1 name fs defaultFS value hdfs master的
  • 敏感性和特异性

    敏感性 sensitivity 在测验的阳性结果中 有多少是真阳性 就是在生病的病例中 能检测出来多少 是病例中 你的诊断方法对疾病的敏感程度 识别程度 敏感性越高 识别疾病 阳性 的概率越高 不漏诊概率 特异性 Specificity 在
  • 使用yolov8进行字符检测

    最近使用yolov8进行字符检测任务 因为场景数据是摆正后的证件数据 所以没有使用DB进行模型训练 直接选用了yolov8n进行文本检测 但是长条字符区域检测效果一直不太好 检出不全 通过检测和分割等算法的调试 发现算法本身不太适合作文本检
  • Qt 之进程间通信(TCP/IP)

    Qt 之进程间通信 TCP IP 原创 一去丶二三里 发布于2016 02 04 10 19 46 阅读数 15428 收藏 更新于2018 05 30 10 35 06 分类专栏 Qt Qt 实战一二三
  • webpack4打包流程分析,实现一个简易的webpack打包器

    文章内容输出来源 拉勾教育前端高薪训练营 webpack打包的流程大致可以归纳成 options 通过config文件传递进来的配置参数 webpack 生成Compiler实例及其他webpack初始化逻辑 compiler 编译的核心桥
  • group by是否会用到索引_进阶联合索引

    单字段索引不能满足你了 那就多来几个 创建普通索引的时候 指定两个或更多的字段这就是联合索引 语法如下 alter table 表 add index 索引名 字段1 字段2 维护数据库时发现现索引重复了 这时可以删掉重复的索引 释放内存空
  • 让bat批处理以管理员权限运行的实现方法

    1 第一种方法 有的电脑是非管理员登录 运行程序时 需要提示是否运行运行 解决方法如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 echooff 1 2 ver find 5 gt nul goto Admin
  • 自动化测试(三)PO模型

    在页面元素不变的情况下 将页面中的所有元素全部提取出来 放入单独的模块中 百度搜索页元素 from selenium webdriver common by import By from pages basePage import Page
  • 【音视频流媒体】2、WebRTC 直播超详细介绍

    文章目录 音视频设别采集 访问摄Web像头 音频 用浏览器自拍 录制 js的二进制数据类型 ArrayBuffer ArrayBufferView Blob 录本地音视频 共享远程桌面 抓取桌面 展示桌面 录制桌面 RTP与RTCP RTP
  • 1080P,720P等高清分辨率的含义

    转载时请注明出处和作者联系方式 http blog csdn net mimepp 作者联系方式 YU TAO
  • N沟道与P沟道增强型MOS管电压、原理、导通条件!

    N沟道增强型场效应管的工作原理 工作原理 1 栅源电压V GS 的控制作用 当V GS 0V时 因为漏源之间被两个背靠背的PN结隔离 因此 即使在D S之间加上电压 在DS间也不可能形成电流 当 0
  • 【TypeScript】007-类型断言

    文章目录 8 类型断言 语法 类型断言的用途 将一个联合类型断言为其中一个类型 将一个父类断言为更加具体的子类 将任何一个类型断言为 any 将 any 断言为一个具体的类型 类型断言的限制 双重断言 类型断言 vs 类型转换 类型断言 v
  • 搭建Ansible控制Windows操作环境(一)

    搭建Ansible控制Windows操作环境 系统环境 一台centos 7服务器 两台windows2008R2客户机 IP地址 centos 172 16 21 188 win2008 172 16 21 186 190 操作思路 ce
  • github添加电脑密钥

    目的 为了使用github网站作为集中管理工作站并和个人电脑进行交互 需要在github中添加电脑生成的密钥 环境 Linux环境 ubuntu18 10 过程 安装git 在ubuntu电脑上安装git版本管理环境 命令 sudo apt
  • 贪吃蛇——C语言(附源码)

    文件在github下gh pages分支 考虑到实验要求为10 10地图 下两程序不对地图做修改 会动的蛇snake move 贪吃蛇snake eat 游戏设计及算法 分解问题 首先贴上游戏玩法以及表示 1 玩法 贪吃蛇游戏是一款经典的益