在Linux下用C语言写贪吃蛇;

2023-10-30

项目思路

ncurses上下左右键的获得——>贪吃蛇地图的实现——>显示贪吃蛇的完整身子——>贪吃蛇向右移动——>贪吃蛇撞墙找死——>贪吃蛇自行向右行走与页面一起刷新(利用线程解决)——>贪吃蛇四个方向的自由走位——>贪吃蛇吃饭——>贪吃蛇咬到自己撞墙找死
按照这个项目思路来设计游戏

运用ncuses库获得上下左右键

头文件#include<stdio.h>无法方便写出贪吃蛇游戏,因为如果使用<stdio.h>头文件,printf打印都要按回车,这对游戏的实现根本不可能,所以引进ncurses库。

#include<curses.h>
 //获取
 void  initcurses()
 {
       initscr();
       keypad(stdscr,1);
       noecho();
 }

打印一个20*20的坐标系作为地图

地图规划也用函数封装起来!
0和20行以–为界,0和20列以|为界,中间为空格,顺便显示蛇的身子和食物;分三步打印,首先打印第一行与第0列,然后打印1到18行,再打印19行19列;蛇的身子与食物用函数封装起来。

void gamePic()
{
    int hang;
    int lie;
    move(0,0);//ncurses的库函数,用它改变光标位置,使下一次的地图覆盖在上一次的地图上。
    for(hang=0;hang<20;hang++){
             if(hang==0){
                  for(lie=0;lie<20;lie++){
                      printw("--");
                  }
             }
             printw("\n");
             if(hang>0&&hang<19){
                  for(lie=0;lie<=20;lie++){//这里<=20刚好对齐第一行第0列
                      if(lie==0||lie==20){
                          printw("|");
                      }else if(hadSnake(hang,lie)){
                          printw("[]");
                      }else  if(hadFood(hang,lie)){
                           printw("##");
                      }else{
                          printw("  ");
                      }
                  }
                   printw("\n");
             }
             if(hang==19){
                 for(lie=0;lie<20;lie++){
                     printw("--");
                 }
                 printw("\n");
                 printw("by xiewenhui");
            }
  }
}

显示贪吃蛇的身子

1.## 显示蛇的身子需要用到结构体和链表,先声明链表头的指针和链表尾的指针。

#include<stdlib.h>
int dir;//全局变量,通过按键控制蛇身子的移动

struct Snake
{
   int hang;
   int lie;
   struct Snake *next;
};
Struct Snake *head=NULL;//防止变成野指针内存泄漏。
Struct Snake *tail=NULL;

2.封装一个函数初始化蛇的身子;蛇的身子是通过尾插法插入;动态创建链表来插入

#include<stdlib.h>

void initSnake()
{
    struct Snake *p;
    
    dir=RIGHT;//初始化按键;
    
    while(head!=NULL){//判断蛇是否撞墙找死;然后清理之前的数据,防止内存泄漏
         p=head;
         p=p->next;
         free(p);
    }
        
    head=(struct Snake*)malloc(sizeof(struct Snake));
    head->hang=1;
    head->lie=1;
    head->next=NULL;

    tail=head;//从尾巴插入,做一个尾巴;

    addNode();
    addNode();
    addNode();
    addNode();
    addNode();
}
void addNode()
{
    struct Snake *p;
    new=(struct snake*)malloc(sizeof(struct Snake));
    switch(dir){   //上下左右四个方向都增加节点,方便往下蛇的移动功能的实现;
            case UP:
                   new->hang=tail->hang-1;
                   new->lie=tail->lie;
                   break;
            case DOWN:
                  new->hang=tail->hang+1;
                  new->lie=tail->lie;
                  break;
            case LEFT:
                 new->hang=tail->hang;
                 new->lie=tail->lie-1;
                 break;
            case RIGHT:
                new->hang=tail->hang;
                new->lie=tail->lie+1;
                break;
    }
}

在地图上显示蛇的身子,封装一个函数判断蛇身子的坐标是否与地图上的坐标对应。

int handSnake(int hang,int lie)
{
   struct Snake *p;
   p=head;
   while(p!=NULL){//如果头节点是一个空指针不用返回行列坐标,因为根本没有节点增加;只有满足非空才能置1。
         if(p->hang==hang&&p->lie==lie){
              return 1;
         }
         p=p->next;
   }
     return 0;
}

蛇的移动与死亡

蛇的移动是通过在尾部增加一个节点,然后在删除一个节点,这样保持蛇身子保持不变,然后实现蛇的移动效果。蛇的死亡有两种:一是撞墙而死,二是咬到自己而死;代码如下:

#include<curses>

void addNode()
{
    struct Snake *p;
    p=head;
    new=(struct Snake*)malloc(sizeof(struct Snake));
    switch(dir){
            case UP:
                    new->hang=tail->hang-1;
                    new->lie=tail->lie;
                    break;
            case DOWN:
                    new->hang=tail->hang+1;
                    new->lie=tail->lie;
                    break;
            case LEFT:
                    new->hang=tail->hang;
                    new->lie=tail->lie-1;
                    break;
            case RIGHT:
                    new->hang=tail->hang;
                    new->lie=tail->lie+1;
                    break;
    }
}

void  deletNode()
{
     struct Snake *P;
     p=head;
     head=head->next;
     free(p);//防止游戏运行过久导致内存被撑爆,清除掉。
}

int ifSnakeDie()
{
    struct Snake *p;
    p=head;
    if(tail->hang==0||tail->hang==20||tail->lie==0||tail->lie==20){
             return 1;
    }
    while(p->next!=NULL){//每次遍历到最后一个节点会一直死,所以只要遍历到第二个节点就可以
       if(p->hang==tail->hang&&p->lie==tail->lie){
             return 0;
       }
        p=p->next;
    }   
}

void moveSnake()
{
   addNode()
   deleteNode();
   if(ifSnakeDie()){
        initSnake();
   }
}

贪吃蛇的按键与界面必须同时运行,linux线程解决这个问题;显示食物;解决不合理走位

如果不引入线程概念,他只能运行一个函数,比如他只能运行刷新界面的函数,根本不会运行按键这个函数,那么这样的话,这个游戏根本没有任何的意义,所以这个游戏就没必要做了。我们解决这个问题的话引进线程的概念,同时运行两个函数,引用线程的库<pthread.h>,把两个不同的函数放进pthread_create中,因为刷新界面与按键不能一次就退出运行,所以我们写一个死循环,一直刷新界面与按键。
代码如下:
主函数:

#include<pthread>

int main()
{
    pthread_t t1; //定义两个地址
    pthread_t t2;

    iniNcurses();//初始化按键函数
    initSnake();//初始化贪吃蛇
    initFood();//初始化食物
    gamePic();//地图扫描

   pthread_create(&t1,NULL,refreshjiemian,NULL);//线程1界面函数
   pthread_create(&t2,NULL,chageDir,NULL);//线程2按键函数
   while(1);//死循环,防止退出
  
   getch();//获取按键
   endwin();//nuurses库自带

   return 0;
}

界面函数

void refreshjiemain()
{
   while(1){
           moveSnake();//蛇的移动
           gamepic();//地图扫描
           refresh();//刷新界面,ncurses自带的函数
           usleep(100000);//提升蛇运行的速度
   }
}
这段代码的意思是,当你控制按键让蛇移动的时候,按键与地图都会同时刷新,用到ncurses库的refresh函数,然后用usleep提升蛇的速度,用while(1)循环,防止一次就退出。

按键函数

#include<curses>
#include<pthread>
int key//定义一个按键,全局变量;

void  chageDir()
{
     while(1){
      int key;
      switch(key){
           case KEY_UP:
                  turn(UP);
                  break;
           case KEY_DOWN:
                  turn(UP);
                  break;
            case KEY_LEFT:
                  turn(LEFT);
                  break;
             case KEY_RIGHT:
                  turn(UP);
                  break;
       }
    }
}

解决不合理走位,因为如果贪吃蛇一下子往上又往右,这样的话会显得很奇怪,所以利用绝对值解决这个问题;让上下的绝对值一样,左右的绝对值一样。
代码如下:

#include<curses>
#include<pthread>

#define UP     1  //宏定义四个按键
#define DOWN  -1
#define LEFT   2
#define RIGHT -2



void turn(int direction)
{
    if(abs(dir)!=abs(direction)){
           dir=direction;
   }
}
以上代码的意思是,绝对值不相等的时候方向才改变,如果绝对值相等方向不变。
abs是绝对值的意思

食物的节点显示

#include<curses>
#include<pthread>
struct Snake food;

int hasFood(int hang,int lie)
{
    if(food.hang==hang&&food.lie==lie){
          return 1;
    }
    return 0;
}

食物的初始化

#include<curses>
#include<pthread>

void hasFood()
{
   int x=rand()%20;    
   int y=rand()%20;
    
   food.hang=x;
   food.lie=y;
}

食物被吃掉,贪吃蛇身子变长;这个逻辑其实很简单,因为只要节点只增加而不删除,在链表的尾巴后面插入就能实现这个功能。然后吃完之后食物在初始化,不要让食物消失。

代码如下:

#include<curses.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>

#define UP     1
#define DOWN  -1
#define LEFT   2
#define RIGHT -2

void moveSnake()
{
    addNode();//增加节点显示贪吃蛇身子,如果要移动的话就要删除节点
    if(hasFood()){
         initFood();
    }else{
         deleteNode();
    }
    if(ifSnakeDie()){
          initSnake();
    }
}

蛇的死亡和吃饭都是在蛇的移动中实现的,所以必须在这个函数中实现这个功能。

贪吃蛇的实现逻辑

1.通过ncurses库来获取贪吃蛇的功能键与函数
2.地图显示,食物显示,蛇的身子显示
3.蛇的移动和死亡和蛇进行吃饭

根据以上三步来写出贪吃蛇的代码,并实现功能
全部代码如下:

#include<stdio.h>
#include<curses.h>

struct  Snake
{
    int hang;
    int lie;
    struct Snake *next;
};
struct Snake *head=NULL;
struct Snake *tail=NULL;

int dir;
int key;
struct Snake food;

void initFood()
{
     int x=rand()%20;
     int y=rand()%20;

     food.hang=x;
     food.lie=y;
}

void addNode()
{
    struct Snake *p;
    p=head;
    new=(struct Snake*)malloc(sizeof(struct Snake));
    switch(dir){
             case UP:
                    new->hang=tail->hang-1;
                    new->lie=tail->lie;
                    break;
              case DOWN:
                    new->hang=tail->hang+1;
                    new->lie=tail->lie;
                    break;
              case LEFT:
                    new->hang=tail->hang;
                    new->lie=tail->lie-1;
                    break;
              case RIGHT:
                    new->hang=tail->hang+1;
                    new->lie=tail->lie;
                    break;
   } 
}


void initSnake()//初始化的目的是创建链表,先创建头节点,然后从尾巴插入
{
    struct Snake *p;
    
    dir=LEFT;//初始化按键
    
    while(head!=NULL){
        p=head;
        head=head->next;
        free(p);
   }
    initFood();
    head=(struct Snake*)malloc(sizeof(struct Snake));
    head->hang=1;
    head->lie=1;
    head->next=NULL;

    tail=head;
     
    addNode();
    addNode();
    addNode();
    addNode();  
}

void deletNode()
{
   struct Snake *p;
   p=head;
   head=head->next;
   free(p);

}

int   ifSnakeDie()
{
     struct Snake *p;
     p=head;

    if(tail->lie<0||tail->lie==20||tail->hang==0||tail->==20){
             return 1;
    }
    while(p->next!=NULL){
         if(p->hang==hang&&p->lie==lie){
              return ;
         }
         p=p->next;
   }
   return  0;
}

void moveSnake()
{
    addNode();
    if(hasFood()){
          initFood();
    }else{
         deletNode();
    }
    if(ifSnakeDie()){
        initSnake();
    }
}

void  refreshjiemian()
{
   while(1){
         moveSnake();
         gamePic();
         refresh();
         usleep(100000);
   }
}

void turn(int direction)
{
   if(abs(dir)!=abs(direction)){
        dir=direction;
   }
}

void chageDir()
{
    int key;
    switch(key){
            case KEY_UP:
                     trun(UP);
                     break;
            case KEY_DOWN:
                     trun(DOWN);
                     break;
            case KEY_LEFT:
                     trun(LEFT);
                     break;
            case KEY_RIGHT:
                     trun(RIGHT);
                     break;
    }

}
  

void initNcurses()//初始化功能键函数
{
    initscr();//初始化屏幕
    keypad(stdscr,1);//在std中接受功能键
    noecho();//控制输入的字符
}

int  hasSnake(int hang,int lie)
{
   struct Snake *p;
   p=head;
   while(p!=NULL){
      if(p->hang=hang&&p->lie=lie){
          return 1;
      }
      p=p->next;
  }
    return 0;
}

int hasFood(int hang,int lie)
{
   if(food.hang==hang&&food.lie==lie){
         return 1;
   }
   return 0;
}

void gamePic()
{
     int hang;
     int lie;

     move(0,0);//锁定光标在(0,0);

     if(hang==0){
           for(lie=0;lie<20;lie++){
                 printw("--");
           }   
           printw("\n");
            
           if(hang>0&&hang<19){
               for(lie=0;lie<=20;lie++){//加个等号和第一行对的更准
                     if(lie==0&&lie==19){
                         printw("|");
                     }else  if(hasSnake()){
                         printw("[]");
                     }else if(hasFood()){
                         printw("#");
                     }else{
                        printw("  ");
                     }                
               }
               printw("\n");
           }

          if(hang==19){
               for(lie=0;lie<20;lie++){
                    printw("--")
              }
              printw("\n");
              printw("by xiewenhui\n");
          }
          
    }

}

int main()
{
    pthread t1;
    pthread  t2;

   initNucrses();
   initSnake();
   initFood();
   gamePic()

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

在Linux下用C语言写贪吃蛇; 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • PyPI 上的轮子平台约束有什么限制吗?

    是否有任何地方 PEP 或其他地方 声明关于 Linux 轮子上传范围的限制 PyPI http pypi io 应该有 具体来说 上传是否被认为是可接受的做法linux x86 64轮子到 PyPI 而不是manylinux1 x86 6
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 在 C# 中使用命名空间别名有什么好处? [复制]

    这个问题在这里已经有答案了 使用命名空间别名有什么好处 仅仅是为了简化编码吗 仅当与类发生冲突时我才使用名称空间别名 对我来说 这根本没有简化 我的意见是 如果没有必要 就不要使用
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • Python数据分析之——数据可视化(折线图)

    matplotlib的pyplot子库提供了和matlab类似的绘图API 方便用户快速绘制2D图表 首先我们先来看看效果图 然后 是数据 接着是代码 coding utf 8 import numpy as np import matpl
  • c语言入门----详解分支语句(if语句)

    文章目录 一 前言 二 顺序结构 三 为什么会有分支语句 四 if语句 五 if语句形式 1 if的基本形式 2 有关if的例子 3 有关if的易错提醒 六 if else语句 1 为什么会有if else语句 2 if else的基本形式
  • Canvas和SVG有什么区别

    在项目开发中也许会涉及到图形 经常用到的就是svg和canvas两种画图方式 下面就让我们看一看他们两者的区别 svg绘制出来的每一个图形的元素都是独立的DOM节点 能够方便的绑定事件或用来修改 canvas输出的是一整幅画布 svg输出的
  • RabbitMQ消息可靠性(二)-- 消费者消息确认

    一 消费者消息确认是什么 在这种机制下 消费者在接收到消息后 需要向 RabbitMQ 发送确认信息 告知 RabbitMQ 已经接收到该消息 并已经处理完毕 如果 RabbitMQ 没有接收到确认信息 则会将该消息重新加入队列 等待其他消
  • supervisor系列:2、运行supervisor

    supervisor系列 2 运行supervisor 文章目录 supervisor系列 2 运行supervisor 1 添加一个程序 2 运行supervisord 2 1 supervisord命令行配置 3 运行superviso
  • 【剑指Offer题解:java】二叉树的镜像

    文章目录 题目 分析 代码 题目 操作给定的二叉树 将其变换为源二叉树的镜像 二叉树的镜像定义 源二叉树 8 6 10 5 7 9 11 镜像二叉树 8 10 6 11 9 7 5 分析 递归交换左右子树即可 1 root null直接返回
  • 【环境配置】基于Docker配置Chisel-Bootcamp环境

    文章目录 Chisel是什么 Chisel Bootcamp是什么 基于Docker配置Chisel Bootcamp 官网下载Docker安装包 Docker换源 启动Bootcamp镜像 常用docker命令 可能产生的问题 Chise
  • Mysql获取数据库的所有表以及表所有字段信息

    mysql获取所有表以及表所有字段信息 SELECT TB TABLE SCHEMA 模式 TB TABLE NAME 表名 TB TABLE COMMENT 表名注释 COL COLUMN NAME 字段名 COL COLUMN TYPE
  • 风投与IT

    风投即风险投资 广义的风险投资泛指一切具有高风险 高潜在收益的投资 狭义的风险投资是指以高新技术为基础 生产与经营技术密集型产品的投资 根据美国全美风险投资协会的定义 风险投资是由职业金融家投入到新兴的 迅速发展的 具有巨大竞争潜力的企业中
  • vue设置不出现滚动条的全屏背景100%

    1 想在登录页面设置页面背景占比100 而且不出现滚动 首先给你所需要的元素设置好css 2 如果没生效 看下App vue中是否有定义 app的宽高 将其设置成100 3 如果综上两部设置完成还未生效 那就需要在index html文件中
  • kubernetes集群实战——资源限制(内存、CPU、NameSpace)

    1 k8s容器资源限制 Kubernetes采用request和limit两种限制类型来对资源进行分配 request 资源需求 即运行Pod的节点必须满足运行Pod的最基本需求才能 运行Pod limit 资源限额 即运行Pod期间 可能
  • MySQL必知必会 学习笔记 第一章 了解SQL

    数据库是保存有组织的数据的容器 通常是一个或一组文件 数据库软件称为DBMS 数据库管理系统 数据库是被DBMS创建和操纵的容器 数据库究竟是文件或其他东西并不重要 因为你不会直接访问数据库 而是间接通过DBMS替你访问数据库 表是某种特定
  • BootstrapTable checkbox默认选中

    BootstrapTable 在Web后台管理项目中对表格展示数据使用居多 主要是表格的多条件查询 分页 排序等功能 我们的项目中前端框架是Bootstrap 所以很多插件都是支持Bootstrap的 bootstrap table是一款非
  • 关于List的subList原理分析

    今天在看Java开发手册的时候看到这么一句话 如果需要对list某个范围内的元素进行操作 可以使用subList 任何对子列表的操作最终都会反映到原列表中 例如list subList 0 2 clear 这样的操作便会对原列表进行修改 修
  • SARScape中用sentinel-1数据做SBAS-InSAR完整流程(1/2)

    SARScape中用sentinel 1数据做SBAS InSAR完整流程 1 SABA InSAR原理简述 2 数据采集和预设 2 1 SAR数据采集 2 2 DEM数据下载与放置 2 3 精密轨道数据下载与放置 2 4 制作研究区范围矢
  • 三分钟教你小程序实现无感刷新!

    无感刷新 无感刷新对于前端来说是一项非常实用的技术 其本质是为了优化用户体验 让用户感受不到token已经过期 本质上就是登录时 储存token和refresh token 当token过期或错误时不需要用户跳回登录页重新登录 而是在响应拦
  • python读取文件名存到list_python读取文件名称生成list的方法

    下面为大家分享一篇python读取文件名称生成list的方法 具有很好的参考价值 希望对大家有所帮助 一起过来看看吧 经常需要读取某个文件夹下所有的图像文件 我使用python写了个简单的代码 读取某个文件夹下某个后缀的文件 将文件名生成为
  • 力扣 删除链表的节点

    给定单向链表的头指针和一个要删除的节点的值 定义一个函数删除该节点 返回删除后的链表的头节点 注意 此题对比原题有改动 示例 1 输入 head 4 5 1 9 val 5 输出 4 1 9 解释 给定你链表中值为 5 的第二个节点 那么在
  • 手动实现Spring IOC 跟 AOP 的雏形

    关注后回复 进群 拉你进程序员交流群 作者丨sowhat1412 来源丨sowhat1412 Spring Spring make java more simpleSpring make java more modernSpring mak
  • 在Linux下用C语言写贪吃蛇;

    项目思路 ncurses上下左右键的获得 gt 贪吃蛇地图的实现 gt 显示贪吃蛇的完整身子 gt 贪吃蛇向右移动 gt 贪吃蛇撞墙找死 gt 贪吃蛇自行向右行走与页面一起刷新 利用线程解决 gt 贪吃蛇四个方向的自由走位 gt 贪吃蛇吃饭