运用C在Linux系统中写贪吃蛇小游戏

2023-05-16

  最近在学习Linux操作系统的运用。通过写下贪吃蛇这个小游戏,加深对c语言的理解以及Linux操作系统的运用。在文章中逐步解析贪吃蛇的整个构建逻辑。并将它记录下来。

  1.运用ncurses库编写贪吃蛇小游戏

  在开始编译贪吃蛇小游戏时就发现一个难题,运用#include <stdio.h>的头文件实现贪吃蛇小游戏并不现实,在该头文件中每次的输出都要按一次回车键。也就是说,每按一个方向键就需要按下一次回车键程序才能输出。这样写下的的贪吃蛇小游戏无疑是愚蠢的。所以,这里要用到ncurses库。

  Ncurses:Ncurses是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。其中的函数“getch()”就不需要按下回车键进行输出。在后续编写中一些函数也适用于贪吃蛇游戏的编写。

#include <curses.h>
//ncurses上下左右键的获取
void initcurses()
{
    initscr();//初始化
    keypad(stdscr,1);//在std中接受键盘的功能键
    noecho(); //控制键盘输入进来的字符
}

   2.贪吃蛇地图程序编写

    我们编写一个20×20的小地图:

     

      结果如图所示这是一个20×20的小地图在第0行和第20行中我们用“--”作为边界,在第0列和第20列中我们用“|”作为边界。用函数封装游戏地图,然后对每一行要实现的结果进行编写。头和尾我们需要打印“--”封住,中间的空间用“|”封住,中间的区域打印空格。

void gameworld()
{
      int hang;
      int lie;
      move(0,0);//改变光标位置
      for(hang=0;hang<=20;hang++)
          { 
                  if(hang==0)
                   {
                      for(lie=0;lie<20;lie++)
                       {
                          printw("--");
                       }
                       printw("\n");
                   }
                  if(hang>=0&&hang<=20)
                   {
                      for(lie=0;lie<=20;lie++)
                       {     
                           if(lie==0||lie==20)
                            {
                               printw("|");
                            }
                           else if(hasSnakenode(hang,lie))//蛇身子模块在地图显现
                            {
                                printw("[]");
                            }
                           else if(hasFoodnode(hang,lie))//食物模块在地图显现
                            {
                                printw("##");
                            } 
                           else
                            {
                               printw("  ");
                            }
                       }
                       printw("\n");
                   }
                  if(hang==20)
                   {
                      for(lie=0;lie<20;lie++)
                       {
                          printw("--");
                       }
                   }
           }
        printw("\n");
        
}              

      3.建立蛇身子模块并显现在地图上

      在完成地图的制作后我们就需要制作蛇的身子,这里我们用到的是结构体,运用链表的思想把它们连起来。首先声明一个结构体以及头和尾的指针。(这里尾巴的英文打错了,是tail)

struct snake
{
   int hang;
   int lie;
   struct snake *next;
};
struct snake *head=NULL;
struct snake *toil=NULL;

  然后我们运用malloc函数动态开辟空间。用malloc函数要调头文件<stdilb.h>。

#include <stdlib.h>
void initsnakenode()
{
      struct snake *p;
      dir=RIGHT;
      while(head!=NULL)//将原先head中的数据依次清除在后面会使用到
       {
            p=head;
            head=head->next;
            free(p);
       }
      head=(struct snake *)malloc(sizeof(struct snake));
      head->hang=2;
      head->lie=2;
      head->next=NULL;
      toil=head;
      addsnakenode();
      addsnakenode();
      addsnakenode();
}

  之后我们要增加节点。这里是对上下左右四方向增加节点,所以这里会用到dir。在刚做这个小游戏的时候我们可以只对右方向增加节点进行试验,其原理不变,单独从switch拿出来即可。

void addsnakenode()
{
     struct snake *new;
     new=(struct snake *)malloc(sizeof(struct snake));
     switch(dir)
       {
         case UP:
                 new->hang=toil->hang-1;
                 new->lie=toil->lie;
                 break;
         case DOWN:
                 new->hang=toil->hang+1;
                 new->lie=toil->lie;
                 break;
         case LEFT:
                 new->hang=toil->hang;
                 new->lie=toil->lie-1;
                 break;
         case RIGHT:
                 new->hang=toil->hang;
                 new->lie=toil->lie+1;
                 break;
       }  
     new->next=NULL;
     toil->next=new;
     toil=new;
}

  以上代码就是对蛇身子的编写。最后我们希望可以在地图中将蛇身显现。结合上面在地图编写时编注的代码。当符合要求时我们置1,不合要求就置0。这样实现了蛇身在地图中的显现。

int hasSnakenode(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;
}

     4.蛇的移动以及死亡方式

     将地图和蛇的身子都做完后。我们就要开始做蛇的移动了,其实蛇移动的原理就是:增加一个节点的同时不要第一个节点。就是是说,当我们有3个节点时,向右增加一个节点就变成了4个节点,但不要第一个节点,我们就又回到了3个节点,不过相较于之前的3节点我们向右偏移了一格。

     注意:在我们不要原先头结点时要把原先的头结点free()掉,给内存腾空间。

void moveSnakenode()
{
      addsnakenode();
      deleteSnakenode();
}
void deleteSnakenode()
{
     struct snake *p;
     p=head;
     head=head->next;
     free(p);
}

 但是仅仅这样并不能在地图上实现移动,我们还要对地图进行更新才可以在地图上实现移动。所以修改完之后,把地图拿进来进行更新用while函数实现一直移动一直更新。但按一个按键再走一步又不符合贪吃蛇的游戏,并且为此我们还要专门写一个向右按键代码来做试验。所以我们直接运用refresh()函数,并延迟100ms。这样无需按键,贪吃蛇也可以一直向右移动。

void* refreshjiemian()
{
         while(1)
        {
          moveSnakenode();
          gameworld();
          refresh();
          usleep(100000);
        }
}

  最后我们要给蛇设个边界免得它出了边界外回不来。所以这里的原理就是当蛇撞边界了,那么我们就让其重新回到建立蛇身子的那个函数,也就是初始化蛇。最后我们要清理掉原先的蛇的数据。

void moveSnakenode()
{
      addsnakenode();
      deleteSnakenode();
       
      if(Snakedie())
       {
           initsnakenode();
       }
}
int Snakedie()
{
   struct snake *p;
   p=head;
   //蛇撞墙
   if(toil->hang<0||toil->lie==0||toil->hang>20||toil->lie==20)
      {
          return 1;
      }
	  //蛇自己撞自己
    while(p->next!=NULL)
      {
         if( p->hang==toil->hang && p->lie==toil->lie)
           {
              return 1;
           }
          p=p->next;
      }
     return 0;
}

  

struct snake *p;
while(head!=NULL)//将原先head中的数据依次清除
       {
            p=head;
            head=head->next;
            free(p);
       }

      5.控制蛇的方向以及禁止不合理走位

      现在我们给贪吃蛇加入转向功能使其不仅仅向右移动还可以上下左右移动。首先定义变量dir、key,宏定义上下左右。

#define UP    1
#define DOWN  -1
#define LEFT  2
#define RIGHT -2
int dir;
int key;

      然后封装一个转向的函数。为了防止贪吃蛇出现从左向右,从上到下这样不合理的走位。所以我们写下一个绝对值的函数去禁止这样不合理的走位。

void* changedir()
{
   while(1)
   {
     key=getch();
      switch(key)
        {
         case KEY_UP:
                 turn(UP);
                 break;
         case KEY_DOWN:
                 turn(DOWN);
                 break;
         case KEY_LEFT:
                 turn(LEFT);
                 break;
         case KEY_RIGHT:
                 turn(RIGHT);
                 break;
        }
   } 
}

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

  6.Linux线程概念

   但地图的不断刷新和蛇的方向转动都是在while循环当中的,执行了一个就不可能再去执行另一个。为了解决这个问题。我们要引用到LinuxX系统中的线程概念。引入后就可以同时运行两个函数。引用线程的库<pthread.h>。分别将两个不同的函数放进pthread_create中。同时在主函数中再加一个while(1)使这两个函数一直在循环中,不至于运行一次就退出。

#include <pthread.h>
int main()
{
 pthread_t t1;
 pthread_t t2;

 initscrkeypad();
 initsnakenode();
 initFoodnode();
 gameworld();

 pthread_create(&t1,NULL,refreshjiemian,NULL);
 pthread_create(&t2,NULL,changedir,NULL);

 while(1);
 getch();
 endwin();
 return 0;
}

  7.食物的编写和随机位置

   最后我们编写食物的程序。和贪吃蛇一样。初始化食物,让食物在地图中显现两个函数实现食物的编写。注意:因为我们的列第0行是打印“|”,为避免食物刷到墙上,所以排除y==0的情况。

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

  

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

  最后我们还要加个当蛇吃食物,身子伸长的功能。其原理就是吃食物只增长节点,不会缩短节点。所以我们在moveSnake函数中加一个条件语句。当吃食物,食物初始化。蛇身只增长不缩短。

void moveSnakenode()
{
      addsnakenode();
      if(hasFoodnode(toil->hang,toil->lie))
        {
             initFoodnode();
        }
      else
       {
             deleteSnakenode();
       }

  以上就是贪吃蛇游戏的整个构建逻辑,最后附上所有代码。

#include <curses.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#define UP    1
#define DOWN  -1
#define LEFT  2
#define RIGHT -2
//ncurses上下左右键的获取
void initcurses()
{
    initscr();//初始化
    keypad(stdscr,1);//在std中接受键盘的功能键
    noecho(); //控制键盘输入进来的字符
}

struct snake
{
   int hang;
   int lie;
   struct snake *next;
};
struct snake *head=NULL;
struct snake *toil=NULL;
int key;
int dir;
struct snake food;

int hasSnakenode(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 hasFoodnode(int hang,int lie)
{
          if(food.hang==hang && food.lie==lie)
           {
               return 1;
           }
      return 0;
}

void gameworld()
{
      int hang;
      int lie;
      move(0,0);//改变光标位置
      for(hang=0;hang<=20;hang++)
          { 
                  if(hang==0)
                   {
                      for(lie=0;lie<20;lie++)
                       {
                          printw("--");
                       }
                       printw("\n");
                   }
                  if(hang>=0&&hang<=20)
                   {
                      for(lie=0;lie<=20;lie++)
                       {     
                           if(lie==0||lie==20)
                            {
                               printw("|");
                            }
                           else if(hasSnakenode(hang,lie))//蛇身子模块在地图显现
                            {
                                printw("[]");
                            }
                           else if(hasFoodnode(hang,lie))//食物模块在地图显现
                            {
                                printw("##");
                            } 
                           else
                            {
                               printw("  ");
                            }
                       }
                       printw("\n");
                   }
                  if(hang==20)
                   {
                      for(lie=0;lie<20;lie++)
                       {
                          printw("--");
                       }
                   }
           }
        printw("\n");
        printw("%d",key);//
}              

void addsnakenode()
{
     struct snake *new;
     new=(struct snake *)malloc(sizeof(struct snake));
     switch(dir)
       {
         case UP:
                 new->hang=toil->hang-1;
                 new->lie=toil->lie;
                 break;
         case DOWN:
                 new->hang=toil->hang+1;
                 new->lie=toil->lie;
                 break;
         case LEFT:
                 new->hang=toil->hang;
                 new->lie=toil->lie-1;
                 break;
         case RIGHT:
                 new->hang=toil->hang;
                 new->lie=toil->lie+1;
                 break;
       }  
     new->next=NULL;
     toil->next=new;
     toil=new;
}

void deleteSnakenode()
{
     struct snake *p;
     p=head;
     head=head->next;
     free(p);
}

void initsnakenode()
{
      struct snake *p;
      dir=RIGHT;
      while(head!=NULL)//将原先head中的数据依次清除在后面会使用到
       {
            p=head;
            head=head->next;
            free(p);
       }
      head=(struct snake *)malloc(sizeof(struct snake));
      head->hang=2;
      head->lie=2;
      head->next=NULL;
      toil=head;
      addsnakenode();
      addsnakenode();
      addsnakenode();
}

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

int Snakedie()
{
   struct snake *p;
   p=head;
   //蛇撞墙
   if(toil->hang<0||toil->lie==0||toil->hang>20||toil->lie==20)
      {
          return 1;
      }
	  //蛇自己撞自己
    while(p->next!=NULL)
      {
         if( p->hang==toil->hang && p->lie==toil->lie)
           {
              return 1;
           }
          p=p->next;
      }
     return 0;
}

void moveSnakenode()
{
      addsnakenode();
      if(hasFoodnode(toil->hang,toil->lie))
        {
             initFoodnode();
        }
      else
       {
             deleteSnakenode();
       }
      if(Snakedie())
       {
           initsnakenode();
       }
}

void* refreshjiemian()
{
         while(1)
        {
          moveSnakenode();
          gameworld();
          refresh();
          usleep(100000);
        }
}

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

void* changedir()
{
   while(1)
   {
     key=getch();
      switch(key)
        {
         case KEY_UP:
                 turn(UP);
                 break;
         case KEY_DOWN:
                 turn(DOWN);
                 break;
         case KEY_LEFT:
                 turn(LEFT);
                 break;
         case KEY_RIGHT:
                 turn(RIGHT);
                 break;
        }
   } 
}

int main()
{
 pthread_t t1;
 pthread_t t2;

 initscrkeypad();
 initsnakenode();
 initFoodnode();
 gameworld();

 pthread_create(&t1,NULL,refreshjiemian,NULL);
 pthread_create(&t2,NULL,changedir,NULL);

 while(1);
 getch();
 endwin();
 return 0;
}

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

运用C在Linux系统中写贪吃蛇小游戏 的相关文章

  • Jenkins参数化构建自动化测试

    测试人员在进行支付类型相关的场景测试过程中 xff0c 需要真实支付的金额较大 xff0c 测试过程中又难以控制测试支付成本 xff0c 无法确切的向公司申请测试备用金 那么问题来了 xff1a 在无法避免自掏腰包进行巨额支付测试时 xff
  • 运维实战 kubernetes(k8s) 之 service

    64 TOC 运维实战 kubernetes k8s 之 service 1 service 介绍 Service可以看作是一组提供相同服务的Pod对外的访问接口 借助Service xff0c 应用可以方便地实现服务发现和负载均衡 ser
  • 企业运维之 openstack 的私有网络以及图形化配置

    企业运维之 openstack 的私有网络以及图形化 1 私有网络2 图形化配置虚拟机3 封装镜像4 上传镜像5 块存储6 kolla ansible 在上一篇的基础上 xff0c 来继续完善 openstack 的相关配置 先将控制节点启
  • AD 软件的学习--基本操作

    一 界面认识 如果某个空间消失了就在设置中的VIEW进行一个复位 device 元器件 xff1b connector 连接器 库所在文件夹 原理图大小设置 二 基本过程 放元器件时 xff0c 空格键进行旋转 先选好元件 xff0c 摆在
  • ROS学习记录(三)C++与Python文件的配置

    本篇文章依托于赵虚左老师的ROS课程 xff0c 实现HelloWorld打印 xff0c 并安装VScode环境 课程链接 讲义链接 文章目录 前言一 基本操作过程1 先创建一个工作空间 xff1b 2 再创建一个功能包 xff1b 二
  • STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1 引言 2 配置 3 流程 1 引言 近来需要使用蓝牙模块 xff0c 再了解到蓝牙模块等无线模块许多使用串口透传 xff0c 便决定在研究一下串口UART 的使用方法 由于用的板子种类每次都不一样 xff0c 有F103 有G0
  • Jetson Nano-USB和HDMI无响应,无法开机问题+jetson nano的烧录记录

    问题描述 xff1a Jetson Nano USB和HDMI没输出 xff0c 电源Led正常绿灯 xff0c 但端口无供电 xff0c 无法正常使用和开机 经查阅相关资料 xff0c 初步猜测应该是系统崩溃了 xff0c 导致usb驱动
  • expect/spawn小记

    usr bin expect set timeout 3 spawn ssh l root 10 239 81 207 expect 34 passwd 34 send 34 123456 r 34 interact
  • 人脸识别(了解知识)

    上节课我们学习了 xff0c OpenCV的基础知识和基本的读取数据方法 这节课 xff0c 让我们继续来了解人脸识别的知识 一 xff0c 图片灰度转换 OpenCV 中有数百种关于在不同色彩空间之间转换的方法 当前 xff0c 在计算机
  • 医疗实验室信息管理系统源码(云LIS)

    云LIS系统源码是一种医疗实验室信息管理系统 xff0c 提供全面的实验室信息管理解决方案 它的主要功能包括样本管理 检测流程管理 报告管理 质量控制 数据分析和仪器管理等 云LIS源码技术说明 xff1a 技术架构 xff1a Asp N
  • java 算法之快速排序

    1 快速排序是一种比较高效的排序算法 xff0c 采用 分而治之 的思想 xff0c 通过多次比较和交换来实现排序 xff0c 在一趟排序中把将要排序的数据分成两个独立的部分 xff0c 对这两部分进行排序使得其中一部分所有数据比另一部分都
  • 设置机器人的tf变换

    设置机器人的tf变换 转载自古月居 xff1a ROS探索总结 xff08 二十二 xff09 设置机器人的tf变换 1 什么是tf变换 ROS中的很多软件包都需要机器人发布tf变换树 xff0c 那么什么是tf变换树呢 xff1f 抽象的
  • matlab仿真建立机器臂模型并得到其D-H参数表

    最近老师要求我们在matlab中构造下图机器人的模型 其初步构型长这样 想要实现图示关节的构型 xff0c 必须在正确的坐标位置绘制出圆柱体 xff08 为圆柱指定位置和z轴方向 xff09 xff0c 那么就必须先获得机器臂各个关节的位姿
  • 自动控制原理中matlab的应用

    知识点汇总 生成传递函数 sys 61 tf xff08 num xff0c den xff09 xff1b num为分子多项式系数 xff0c den为分母的多项式系数多项式乘法 den 61 conv xff08 den1 xff0c
  • 解决 linux下编译.sh文件报错 “[: XXXX: unexpected operator” 问题

    原因 xff1a linux下能正常执行的脚本 xff0c 在ubuntu系统中都会编译报错 xff0c 因为二者使用的解释器不一同导致 Linux xff1a sh ubuntu dash 因为ubuntu默认的sh是连接到dash的 又
  • 刚下好ROS,如何从零开始实现px4的无人机仿真

    刚刚入门ROS开发 xff0c 作为刚刚挺过艰难的ubuntu安装 ros安装的萌新来说 xff0c 你应该正处于ROS开发的初始过渡阶段 一方面 xff0c 你庆幸你解决了许多安装新系统的许多bug xff0c 跨过了阻拦了无数人入门RO
  • 信号与系统——matlab

    一 信号的matlab表示与绘图 1 连续信号绘图 xff0c 例 xff1a t 61 0 0 0001 5 a 61 5 b 61 0 8 x 61 a exp b t sin pi t 注意是 plot t x 绘制出信号关于变量t的
  • 无人车仿真:带反馈的绕圈路径实现

    前期入门ros xff0c 无论是无人机还是无人车等的控制 xff0c 基本都是先以仿真学习为主 xff0c 成熟的仿真理解与功能实现 xff0c 再搬到现实世界的无人车无人机就变得简单随意 xff0c 也能减少许多不必要的硬件损坏 但是很
  • stm32中C语言知识巩固

    此文知识来源于江科大老师b站视频讲解 C语言数据类型 需要注意的是 xff0c 在51单片机中int是16位的 xff0c 32单片机中int是32位的 后面两行是对其重命名 xff0c 因为左边的数据类型名字比较长 xff0c 且有很多名
  • Rviz中控制机器人模型运动(arbotix)

    前言 xff1a 通过 URDF 结合 rviz 可以创建并显示机器人模型 xff0c 不过 xff0c 当前实现的只是静态模型 xff0c 如何控制模型的运动呢 xff1f 在此 xff0c 可以调用 Arbotix 实现此功能 简介 A

随机推荐

  • Gazebo仿真环境搭建(04)

    Gazebo 中创建仿真实现方式有两种 1 直接添加内置组件创建仿真环境 1 1启动 Gazebo 并添加组件 1 2保存仿真环境 添加完毕后 xff0c 选择 file gt Save World as 选择保存路径 功能包下 world
  • 树莓派4b安装ubuntu18.04和ros-melodic(一)

    因为用到了树莓派这个集成计算机 xff0c 所以买了张sd卡自己配置了一下环境 每个人环境都不一样 xff0c 但是大体方法流程都是一样 xff0c 我用了一周的时间配置好的 xff0c 说实话真的很麻烦所以在这里我把方法分享给大家 xff
  • 集成学习详解

    入门小菜鸟 xff0c 希望像做笔记记录自己学的东西 xff0c 也希望能帮助到同样入门的人 xff0c 更希望大佬们帮忙纠错啦 侵权立删 目录 一 集成学习的产生原因与相关定义 1 产生原因 2 相关定义 xff08 1 xff09 同质
  • 深度学习之优化算法

    入门小菜鸟 xff0c 希望像做笔记记录自己学的东西 xff0c 也希望能帮助到同样入门的人 xff0c 更希望大佬们帮忙纠错啦 侵权立删 目录 一 优化算法与深度学习 1 优化算法对于深度学习的意义 2 优化算法与深度学习的关系 3 优化
  • Redis常用命令(超详细整理)

    1 字符串string操作命令 Redis中字符串类型常用命令 xff1a SET key value 设置指定的key值 GET key 获取指定key的值 SETEX key seconds value 设置指定key的值 xff0c
  • linux/android中aplay/arecord用法以及命令

    linux xff1a 1 查看声卡 xff1a root 64 sos dom0 aplay l List of PLAYBACK Hardware Devices card 0 broxtontdf8532 broxton tdf853
  • linux怎么查看防火墙状态

    1 通过SSH连接登录linux系统 2 输入如下命令 xff1a systemctl status firewalld 3 敲回车即可查看防火墙的状态 xff0c 如下状态表示防火墙已经关闭 4 又或输入命令 xff1a service
  • 一闪一闪的星星特效效果

    首先让我们看一下一闪一闪的星星特效效果如下图 xff1a 让我们先看一下布局 xff1a span class token tag span class token tag span class token punctuation lt s
  • 实现红绿灯的效果

    首先看一下效果如下 xff1a html部分 xff1a span class token tag span class token tag span class token punctuation lt span div span spa
  • 图书管理系统数据库SQL设计思路

    1 x1f58d 需求分析 一个图书管理系统包括用户信息维护 图书馆信息 图书信息维护 书籍借出 书籍归还 借书记录 支付查询等 此系统功能用户可以借书 续借 归还 查询书籍 增加 修改和删除 2 x1f58b 需求 1 用户信息维护 xf
  • jQuery夹娃娃小游戏

    点击开始 xff0c 爪子开始往下移夹娃娃首先让我们看一下它的效果图如下 xff1a 页面布局代码如下 xff1a span class token tag span class token tag span class token pun
  • 酒店管理系统数据库SQl设计思路

    第一节 x1f58d 需求分析 一个酒店管理系统包括很多个模块 xff0c 首先我们先要分析一下需求 一 实时房态图 动态生成实时房态图 在房态图上进行房态修改 换房操作 xff0c 续住操作 选择房间进行散客 团队预定 散客 团队入住 散
  • 超经典的20道SQL题目(附加解题思路)

    最近学了SQL的内容 xff0c 老师也给我们发了练习题 xff0c 感觉在做题的过程中得到了提高 xff0c 所以将题目和我自己的答案分享一下 xff0c 希望对大家有所帮助 我使用的是SQL Server 2014 Management
  • 《酒店管理系统》项目总结

    一 项目模块 二 业务流程图 三 业务流程功能实现 1 首先客人接待 xff1a 实时房态图 xff0c 可以直观的显示出所有客房的状态 2 客人预定 xff1a 根据客人的基本资料做预订 xff0c 在房态图上的客房添加一个预定的标识 3
  • Java基础语法

    一 基础语法 Java大小写敏感 比如HelloWorld和Helloworld是不一样的 包名 Package 公司 组织 个人的域名的反向 xff0c 一般是英文字母 英文字母必须是小写 类名 xff08 ClassName xff09
  • Java中的分支语句

    一 前言 本篇文章讲解的知识点是 xff1a 分支语句 xff0c 希望大家能掌握 二 分支语句 提示 xff1a if else 语句可以看作有4种形式 xff1a 1 if 语句 代码 xff1a span class token ke
  • Linux 下ALSA音频工具amixer,aplay,arecord使用

    ALSA音频工具amixer aplay arecord ALSA音频工具编译安装 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java中的循环语句

    一 前言 本篇文章主要讲解Java知识点是 xff1a 循环语句 希望大家读完这篇文章之后能掌握以下几种循环语句的知识点 二 循环语句 提示 xff1a 循环语句分为以下几种 xff1a 1 for循环 循环场景 xff1a 更适用于明确循
  • Java数组

    对于所有的编程语言来说数组都是相对比较重要的数据结构之一 在Java中数组主要用来存放一组固定大小的相同类型的数据 xff08 一 xff09 数组变量的声明 数组声明有两种写法 xff1a dataType span class toke
  • 运用C在Linux系统中写贪吃蛇小游戏

    最近在学习Linux操作系统的运用 通过写下贪吃蛇这个小游戏 xff0c 加深对c语言的理解以及Linux操作系统的运用 在文章中逐步解析贪吃蛇的整个构建逻辑 并将它记录下来 1 运用ncurses库编写贪吃蛇小游戏 在开始编译贪吃蛇小游戏