求职简历网 > 知识 >

n0644

来源:求职简历网时间:2024-04-07 11:36:57编辑:皮带君

如何编译linux内核

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,
在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定
制一个更高效,更稳定的内核,就需要重新编译内核。本文将以RedHat Linux 6.0(kernel
2.2.5)为操作系统平台,介绍在Linux上进行内核编译的方法。


  一、 下载新内核的源代码


  目前,在Internet上提供Linux源代码的站点有很多,读者可以选择一个速度较快的站点下载。笔者是从站点www.kernelnotes.org上下载了Linux的最新开发版内核2.3.14的源代码,全部代码被压缩到一个名叫Linux-2.3.14.tar.gz的文件中。


  二、 释放内核源代码


  由于源代码放在一个压缩文件中,因此在配置内核之前,要先将源代码释放到指定的目录下。首先以root帐号登录,然后进入/usr/src子目录。如果用户在安装Linux时,安装了内核的源代码,则会发现一个linux-2.2.5的子目录。该目录下存放着内核2.2.5的源代码。此外,还会发现一个指向该目录的链接linux。删除该连接,然后将新内核的源文件拷贝到/usr/src目录中。


  (一)、用tar命令释放内核源代码


  # cd /usr/src


  # tar zxvf Linux-2.3.14.tar.gz


  文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包含了内核2.3.14的全部源代码。


  (二)、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。


  # cd /usr/include


  # rm -Rf asm linux


  # ln -s /usr/src/linux/include/asm-i386 asm


  # ln -s /usr/src/linux/include/linux linux


  # ln -s /usr/src/linux/include/scsi scsi


  (三)、删除源代码目录中残留的.o文件和其它从属文件。


  # cd /usr/src/linux


  # make mrproper


  三、 配置内核


  (一)、启动内核配置程序。


  # cd /usr/src/linux


  # make config


  除了上面的命令,用户还可以使用make menuconfig命令启动一个菜单模式的配置界面。如果用户安装了X window系统,还可以执行make xconfig命令启动X window下的内核配置程序。


  (二)、配置内核


  Linux的
内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内
核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序
的支持。由于内核的配置选项非常多,本文只介绍一些比较重要的选项。


  1、Code maturity level options(代码成熟度选项)


  Prompt for development and/or incomplete code/drivers
(CONFIG_EXPERIMENTAL) [N/y/?]
如果用户想要使用还处于测试阶段的代码或驱动,可以选择“y”。如果想编译出一个稳定的内核,则要选择“n”。


  1、 Processor type and features(处理器类型和特色)


  (1)、Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX] 选择处理器类型,缺省为Ppro/6x86MX。


  (2)、Maximum Physical Memory (1GB, 2GB) [1GB] 内核支持的最大内存数,缺省为1G。


  (3)、Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 协处理器仿真,缺省为不仿真。


  (4)、MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]


  选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。


  (5)、Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] 选择“y”,内核将支持对称多处理器。


  2、 Loadable module support(可加载模块支持)


  (1)、Enable loadable module support (CONFIG_MODULES) [Y/n/?] 选择“y”,内核将支持加载模块。


  (2)、Kernel module loader (CONFIG_KMOD) [N/y/?] 选择“y”,内核将自动加载那些可加载模块,否则需要用户手工加载。


  3、 General setup(一般设置)


  (1)、Networking support (CONFIG_NET) [Y/n/?] 该选项设置是否在内核中提供网络支持。


  (2)、PCI support (CONFIG_PCI) [Y/n/?] 该选项设置是否在内核中提供PCI支持。


  (3)、PCI access mode (BIOS, Direct, Any) [Any] 该选项设置Linux探测PCI设备的方式。选择“BIOS”,Linux将使用BIOS;选择“Direct”,Linux将不通过BIOS;选择“Any”,Linux将直接探测PCI设备,如果失败,再使用BIOS。


  (4)Parallel port support (CONFIG_PARPORT) [N/y/m/?] 选择“y”,内核将支持平行口。


  4、 Plug and Play configuration(即插即用设备支持)


  (1)、Plug and Play support (CONFIG_PNP) [Y/m/n/?] 选择“y”,内核将自动配置即插即用设备。


  (2)、ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 选择“y”,内核将自动配置基于ISA总线的即插即用设备。


  5、 Block devices(块设备)


  (1)、Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?] 选择“y”,内核将提供对软盘的支持。


  (2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [Y/m/n/?] 选择“y”,内核将提供对增强IDE硬盘、CDROM和磁带机的支持。


  6、 Networking options(网络选项)


  (1)、Packet socket (CONFIG_PACKET) [Y/m/n/?] 选择“y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。


  (2)、Network firewalls (CONFIG_FIREWALL) [N/y/?] 选择“y”,内核将支持防火墙。


  (3)、TCP/IP networking (CONFIG_INET) [Y/n/?] 选择“y”,内核将支持TCP/IP协议。


  (4)The IPX protocol (CONFIG_IPX) [N/y/m/?] 选择“y”,内核将支持IPX协议。


  (5)、Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 选择“y”,内核将支持Appletalk DDP协议。


  8、SCSI support(SCSI支持)


  如果用户要使用SCSI设备,可配置相应选项。


  9、Network device support(网络设备支持)


  Network device support (CONFIG_NETDEVICES) [Y/n/?] 选择“y”,内核将提供对网络驱动程序的支持。


  10、Ethernet (10 or 100Mbit)(10M或100M以太网)


  在该项设置中,系统提供了许多网卡驱动程序,用户只要选择自己的网卡驱动就可以了。此外,用户还可以根据需要,在内核中加入对FDDI、PPP、SLIP和无线LAN(Wireless LAN)的支持。


  11、Character devices(字符设备)


  (1)、Virtual terminal (CONFIG_VT) [Y/n/?] 选择“y”,内核将支持虚拟终端。


  (2)、Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]


  选择“y”,内核可将一个虚拟终端用作系统控制台。


  (3)、Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y/m/n/?]


  选择“y”,内核将支持串行口。


  (4)、Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]


  选择“y”,内核可将一个串行口用作系统控制台。


  12、Mice(鼠标)


  PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?] 如果用户使用的是PS/2鼠标,则该选项应该选择“y”。


  13、Filesystems(文件系统)


  (1)、Quota support (CONFIG_QUOTA) [N/y/?] 选择“y”,内核将支持磁盘限额。


  (2)、Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?] 选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。


  (3)、DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 选择“y”,内核将支持DOS FAT文件系统。


  (4)、ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/m/n/?]


  选择“y”,内核将支持ISO 9660 CDROM文件系统。


  (5)、NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/m/?]


  选择“y”,用户就可以以只读方式访问NTFS文件系统。


  (6)、/proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。


  (7)、Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的标准文件系统,该项也必须选择“y”。


  14、Network File Systems(网络文件系统)


  (1)、NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 选择“y”,内核将支持NFS文件系统。


  (2)、SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS)


  选择“y”,内核将支持SMB文件系统。


  (3)、NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS)


  选择“y”,内核将支持NCP文件系统。


  15、Partition Types(分区类型)


  该选项支持一些不太常用的分区类型,用户如果需要,在相应的选项上选择“y”即可。


  16、Console drivers(控制台驱动)


  VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?] 选择“y”,用户就可以在标准的VGA显示方式下使用Linux了。


  17、Sound(声音)


  Sound card support (CONFIG_SOUND) [N/y/m/?] 选择“y”,内核就可提供对声卡的支持。


  18、Kernel hacking(内核监视)


  Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?] 选择“y”,用户就可以对系统进行部分控制。一般情况下选择“n”。


  四、 编译内核


  (一)、建立编译时所需的从属文件


  # cd /usr/src/linux


  # make dep


  (二)、清除内核编译的目标文件


  # make clean


  (三)、编译内核


  # make zImage


  内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件zImage。如果编译的内核很大的话,系统会提示你使用make bzImage命令来编译。这时,编译程序就会生成一个名叫bzImage的内核映像文件。


  (四)、编译可加载模块


  如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。


  # make modules


  # make modelus_install


  编译成功后,系统会在/lib/modules目录下生成一个2.3.14子目录,里面存放着新内核的所有可加载模块。


  五、 启动新内核


  (一)、将新内核和System.map文件拷贝到/boot目录下


  # cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.3.14


  # cp /usr/src/linux/System.map /boot/System.map-2.3.14


  # cd /boot


  # rm -f System.map


  # ln -s System.map-2.3.14 System.map


  (二)、配置/etc/lilo.conf文件。在该文件中加入下面几行:


  default=linux-2.3.14


  image=/boot/vmlinuz-2.3.14


  label=linux-2.3.14


  root=/dev/hda1


  read-only


  (三)、使新配置生效


  # /sbin/lilo


  (四)、重新启动系统


  # /sbin/reboot


  新内核如果不能正常启动,用户可以在LILO:提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。


了解更多开源相关,去LUPA社区看看吧。


Linux内核编译失败

前段时间 Ubuntu 18.04 系统挂了,重装系统后,一直没有安装编译环境,记录下编译时遇到的一些问题。 1.1、问题描述 编译Linux内核映像时报如下错误: 1.2、解决方法 安装软件包 u-boot-tools 。 2.1、问题描述 编译Linux内核映像时报如下错误: 2.2、解决方法 安装软件包 lib32stdc++6 和 lib32z1 。 3.1、问题描述 编译Linux内核映像时报如下错误: 3.2、解决方法 安装软件包 libssl-dev 。

手机刷机包如何制作?自己如何制作刷机包?

1、手机刷包需要有ROM卡刷包和线刷包两种,常规分为dat和img格式的刷机包如果手机不支持ROM卡刷包,也可以选择电脑ROM 直接下载然后ROM进行修改。2、将下载好ROM放到桌面,然后新建一个文件夹方便寻找,当然你也可以自己选择一个位置安装只要你能找到路径即可。3、进行压缩解压刷机包,需要等几分钟看电脑的反应速度,假如嫌慢的话可以把后台运行关掉这样速度会快很多4、解包完成之后要对APP进行删除操作,当然你也可以不删除系统自带的APP可以选择保留,建议采用默认删除即可。5、修改属性:中间展示的是ROM包默认属性,选择对应项即可在右边 修改属性,建议采用非中文字新增属性:如果有需求增加属性,在 新增属性 添加即可,建议采用非中文字符。6、完成上述步骤后开始打包,使用usb连接手机把压缩包放到手机sd卡中这样就完成了刷机包制作以及应用。

手机刷机包如何制作?自己如何制作刷机包?

一、准备ROM包说明:本工具支持ROM卡刷包和线刷包,支持常规,dat和img格式的刷机包如果找不到ROM,也可以 选择线上ROM 直接下载ROM进行修改。1、将下载好ROM放到任意位置,建议放在容易找到的地方2、选择本地ROM 打开下载好的ROM 进行解包3、等待解包完毕即可进行修改二、系统精简解包完成之后即可对任意APP进行删除操作,默认已经针对常见推广应用进行删除,也可以手动删减任意应用。建议采用默认删除即可也可以选择性删除任意APP,选择左边勾选框进行删除或不删除操作右边状态提示:建议根据提示进行删除,过多删除可能会导致一些问题,建议采用默认删除方案即可三、信息修改说明:没特殊要求可以直接跳过此步骤。本功能主要是修改系统build.prop参数,可以自行修改或添加,可以实现部分优化或默认配置。修改属性:中间展示的是ROM包默认属性,选择对应项即可在右边 修改属性,建议采用非中文字符新增属性:如果有需求增加属性,在 新增属性 添加即可,建议采用非中文字符四、ROO授权说明:本功能主要针对卡刷ROM如果ROM包已经内置ROOT,建议选择 不进行修改如果ROM没有ROOT,选择 装入ROOT授权 即可五、ROM封包完成上述步骤后即可 开始打包 具体打包时间会根据ROM包大小和电脑性能有所不同,一般大约5-15分钟即可制作完毕,耐心等待即可

如何在linux内核中读写文件

内核中读写文件

1.filp_open()在kernel中可以打开文件,其原形如下:
Struct file* filp_open(const char* filename, int open_mode, int mode); 该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。
2. 读写文件(vfs_read/vfs_write)
kernel中文件的读写操作可以使用vfs_read()和vfs_write,在使用这两个函数前需要说明一下get_fs()和 set_fs()这两个函数。
vfs_read() vfs_write()两函数的原形如下:
ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);
ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);
注意这两个函数的第二个参数buffer,前面都有__user修饰符,这就要求这两个buffer指针都应该指向用空的内存,如果对该参数传递kernel空间的指针,这两个函数都会返回失败-EFAULT。但在Kernel中,我们一般不容易生成用户空间的指针,或者不方便独立使用用户空间内存。要使这两个读写函数使用kernel空间的buffer指针也能正确工作,需要使用set_fs()函数或宏(set_fs()可能是宏定义),如果为函数,其原形如下:
void set_fs(mm_segment_t fs);
该函数的作用是改变kernel对内存地址检查的处理方式,其实该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS,即对用户空间地址检查并做变换。那么要在这种对内存地址做检查变换的函数中使用内核空间地址,就需要使用set_fs(KERNEL_DS)进行设置。get_fs()一般也可能是宏定义,它的作用是取得当前的设置,这两个函数的一般用法为:


求C语言俄罗斯方块代码

俄罗斯方块C源代码#include #include #include #include #define ZL 4 //坐标增量, 不使游戏窗口靠边#define WID 36 //游戏窗口的宽度#define HEI 20 //游戏窗口的高度int i,j,Ta,Tb,Tc; // Ta,Tb,Tc用于记住和转换方块变量的值int a[60][60]={0}; //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框int b[4]; //标记4个"口"方块:1有,0无,类似开关int x,y, level,score,speed; //方块中心位置的x,y坐标,游戏等级、得分和游戏速度int flag,next; //当前要操作的方块类型序号,下一个方块类型序号void gtxy(int m, int n); //以下声明要用到的自编函数void gflag( ); //获得下一方块序号void csh( ); //初始化界面void start( ); //开始部分void prfk ( ); //打印方块void clfk( ); //清除方块void mkfk( ); //制作方块void keyD( ); //按键操作int ifmov( ); //判断方块能否移动或变体void clHA( ); //清除满行的方块void clNEXT( ); //清除边框外的NEXT方块int main( ){ csh( ); while(1) {start( ); //开始部分 while(1) { prfk( ); Sleep(speed); //延时 clfk( ); Tb=x;Tc=flag; //临存当前x坐标和序号,以备撤销操作 keyD( ); y++; //方块向下移动 if (ifmov( )==0) { y--; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环 } for(i=y-2;i<y+2;i++){ if (i==ZL) { j=0; } } //方块触到框顶 if (j==0) { system("cls");gtxy(10,10);printf("游戏结束!"); getch(); break; } clNEXT( ); //清除框外的NEXT方块 } return 0;}void gtxy(int m, int n) //控制光标移动{COORD pos; //定义变量 pos.X = m; //横坐标 pos.Y = n; //纵坐标 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); }void csh( ) //初始化界面{gtxy(ZL+WID/2-5,ZL-2); printf("俄罗斯方块"); //打印游戏名称 gtxy(ZL+WID+3,ZL+7); printf("******* NEXT:"); //打印菜单信息 gtxy(ZL+WID+3,ZL+13); printf("**********"); gtxy(ZL+WID+3,ZL+15); printf("Esc :退出游戏");gtxy(ZL+WID+3,ZL+17); printf("↑键:变体"); gtxy(ZL+WID+3,ZL+19); printf("空格:暂停游戏"); gtxy(ZL,ZL); printf("╔"); gtxy(ZL+WID-2,ZL); printf("╗"); //打印框角 gtxy(ZL,ZL+HEI); printf("╚"); gtxy(ZL+WID-2,ZL+HEI); printf("╝");a[ZL][ZL+HEI]=2; a[ZL+WID-2][ZL+HEI]=2; //记住有图案 for(i=2;i<WID-2;i+=2) {gtxy(ZL+i,ZL); printf("═"); } //打印上横框 for(i=2;i<WID-2;i+=2) {gtxy(ZL+i,ZL+HEI); printf("═"); a[ZL+i][ZL+HEI]=2; } //下框 for(i=1;i<HEI;i++) { gtxy(ZL,ZL+i); printf("║"); a[ZL][ZL+i]=2; } //左竖框记住有图案 for(i=1;i<HEI;i++) {gtxy(ZL+WID-2,ZL+i); printf("║"); a[ZL+WID-2][ZL+i]=2; } //右框 CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下是隐藏光标的设置 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); level=1; score=0; speed=400; gflag( ); flag=next; //获得一个当前方块序号}void gflag( ) //获得下一个方块的序号{ srand((unsigned)time(NULL)); next = rand()%19+1; }void start( ) //开始部分{ gflag( ); Ta=flag; flag=next; //保存当前方块序号,将下一方块序号临时操作 x=ZL+WID+6; y=ZL+10; prfk( ); //给x,y赋值,在框外打印出下一方块 flag=Ta; x=ZL+WID/2; y=ZL-1; //取回当前方块序号,并给x,y赋值}void prfk ( ) //打印俄罗斯方块{ for(i=0;i<4;i++) {b[i]=1; } //数组b[4]每个元素的值都为1 mkfk ( ); //制作俄罗斯方块 for( i= x-2; i<=x+4; i+=2 ) //打印方块 { for(j=y-2;jZL ){ gtxy(i,j); printf("□"); } } } gtxy(ZL+WID+3,ZL+1); printf("level : %d",level); //以下打印菜单信息 gtxy(ZL+WID+3,ZL+3); printf("score : %d",score); gtxy(ZL+WID+3,ZL+5); printf("speed : %d",speed);}void clfk( ) //清除俄罗斯方块{ for(i=0;i<4;i++) { b[i]=0; } //数组b[4]每个元素的值都为0 mkfk ( ); //制作俄罗斯方块 for( i=x-2; i<=x+4; i+=2 ) //清除方块 { for(j=y-2;jZL ){ gtxy(i,j); printf(" "); } } }}void mkfk( ) //制作俄罗斯方块{ a[x][ y]=b[0]; //方块中心位置状态: 1-有,0-无 switch(flag) //共6大类,19种小类型 { case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; } //田字方块 case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; } //直线方块:---- case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; } //直线方块: | case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; } //T字方块 case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; } //T字顺时针转90度 case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; } //T字顺转180度 case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; } //T字顺转270度 case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块 case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; } //Z字顺转90度 case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; } //Z字顺转180度 case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度 case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; } //7字方块 case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; } //7字顺转90度 case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; } //7字顺转180度 case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; } //7字顺转270度 case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; } //倒7字方块 case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; } //倒7字顺转90度 case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; } //倒7字顺转180度 case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; } //倒7字顺转270度 }}void keyD( ) //按键操作{ if (kbhit( )) { int key; key=getch(); if (key==224) { key=getch(); if (key==75) { x-=2; } //按下左方向键,中心横坐标减2 if (key==77) { x+=2; } //按下右方向键,中心横坐标加2 if (key==72) //按下向上方向键,方块变体 { if (flag>=2 && flag<=3 ) { flag++; flag%=2; flag+=2; } if ( flag>=4 && flag<=7 ) { flag++; flag%=4; flag+=4; } if (flag>=8 && flag<=11 ) { flag++; flag%=4; flag+=8; } if (flag>=12 && flag<=15 ) { flag++; flag%=4; flag+=12; } if ( flag>=16 && flag<=19 ) { flag++; flag%=4; flag+=16; } } } if (key==32) //按空格键,暂停 { prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } } //再按空格键,继续游戏 if (ifmov( )==0) { x=Tb; flag=Tc; } //如果不可动,撤销上面操作 else { prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;} //如果可动,执行操作 }}int ifmov( ) //判断能否移动{ if (a[x][y]!=0) { return 0; } //方块中心处有图案返回0,不可移动 else{ if ( (flag==1 && ( a[x][ y-1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) || (flag==2 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x+4][y]==0 ) ) || (flag==3 && ( a[x][y-1]==0 && a[x][y-2]==0 && a[x][y+1]==0 ) ) || (flag==4 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x][y+1]==0 ) ) || (flag==5 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y]==0 ) ) || (flag==6 && ( a[x][ y-1]==0 && a[x-2][y]==0 && a[x+2][y]==0 ) ) || (flag==7 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y]==0 ) ) || (flag==8 && ( a[x][y+1]==0 && a[x-2][y]==0 && a[x+2][y+1]==0 ) ) || (flag==9 && ( a[x][y-1]==0 && a[x-2][y]==0 && a[x-2][y+1]==0 ) ) || (flag==10 && ( a[x][y-1]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) || (flag==11 && ( a[x][y+1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) || (flag==12 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y-1]==0 ) ) || ( flag==13 && ( a[x-2][y]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) || ( flag==14 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y+1]==0 ) ) || (flag==15 && ( a[x-2][y]==0 && a[x-2][y+1]==0 && a[x+2][y]==0 ) ) || (flag==16 && ( a[x][y+1]==0 && a[x][y-1]==0 && a[x+2][y-1]==0 ) ) || ( flag==17 && ( a[x-2][y]==0 && a[x+2][y+1]==0 && a[x+2][y]==0 ) ) || (flag==18 && ( a[x][y-1]==0 &&a[x][y+1]==0 && a[x-2][y+1]==0 ) ) || (flag==19 && ( a[x-2][y]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ) { return 1; } } return 0; //其它情况返回0}void clNEXT( ) //清除框外的NEXT方块{ flag = next; x=ZL+WID+6; y=ZL+10; clfk( ); }void clHA( ) //清除满行的方块{ int k, Hang=0; //k是某行方块个数, Hang是删除的方块行数 for(j=ZL+HEI-1;j>=ZL+1;j--) //当某行有WID/2-2个方块时,则为满行 { k=0; for(i=ZL+2;i<ZL+WID-2;i+=2) { if (a[i][j]==1) //竖坐标从下往上,横坐标由左至右依次判断是否满行 { k++; //下面将操作删除行 if (k==WID/2-2) { for(k=ZL+2;k<ZL+WID-2;k+=2) { a[k][j]=0; gtxy(k,j); printf(" "); Sleep(1); } for(k=j-1;k>ZL;k--) { for(i=ZL+2;i<ZL+WID-2;i+=2) //已删行数上面有方块,先清除再全部下移一行 { if(a[i][k]==1) { a[i][k]=0; gtxy(i,k); printf(" ");a[i][k+1]=1; gtxy(i,k+1); printf("□"); } } } j++; //方块下移后,重新判断删除行是否满行 Hang++; //记录删除方块的行数 } } } } score+=100*Hang; //每删除一行,得100分 if ( Hang>0 && (score%500==0 || score/500> level-1 ) ) //得分满500速度加快升一级 { speed-=20; level++; if(speed<200)speed+=20; } }

一个简单的c语言写的俄罗斯方块程序?

1、考虑怎么存储俄罗斯方块俄罗斯方块的形状一共有19种类型,如果拿数组来表示的话,可能会比较会浪费空间(网上有很多实现代码)考虑到每种方块形状的范围是4 *4的小方块,用 字模点阵的方式来存储,即设置一个4行4列的数组,元素置1即代表这个位置有小 方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。 1000 1000 1100 0000 上述4*4来表示L形状的方块。 4*4 =16 bit 正好为short类型,所以每一个方块可以用一个short类型的数据来表示。我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。 但是这种方式扩展性不好,每当有一种新方块时需要改动, 所以可以写一个配置文件来表示19种方块。(RockShape.ini)@###@###@@######1234从配置文件中读取方块的类型的代码在(Init.h的ReadRock函数中)在下面3中解释下代码如何实现2如何画出方块可以使用EasyX库来画出简单的图形, EasyX库是在VC下实现TC的简单绘图功能的一个库,这个库很容易学会(直接 百度EasyX库,里面有详细的教程)那么如何画出方块,方块已经存储到一个short类型中了 从short中读取出,可以用一个掩码mask = 1来与short的每个bit位相与,结果为1,则画出一个小方块; 函数声明:void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed)1参数1:表示在数组中的下标,取出short类型的方块表示数据 参数2:表示当前坐标,即画出方块的左上角的坐标x,y 参数3:true表示画出该方块,false 表示擦除该方块。//方块在图形窗口中的位置(即定位4*4大块的左上角坐标) typedef struct LOCATE{ int left; int top;} RockLocation_t;1234563如何实现同一种类型方块的翻转,在按‘↑’时应该翻转同一种类型的方块, 比如下面的横杆和竖杆@###@###@###@###@@@@############****1234567891011可以假想成静态循环链表来实现这种方式 使同一种类型的方块循环起来,用一个struct结构来表示一种方块typedef struct ROCK{ //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)unsigned short rockShapeBits; int nextRockIndex; //下一个方块,在数组中的下标 } RockType;123456定义一个RockType类型的数组来存储19种方块 RockType RockArray[19] = { (0, 0) };当我们按“↑”时,把传入画方块函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。简单解释下ReadRock函数的实现:当读取到空行的时候表示 一种方块已经读取完毕,当读取到**** 行时 表示同一种类型的方块读取完毕,具体看代码实现,代码中具体的注释4、主要游戏实现的逻辑贴一个预览图吧 注:上述预览图的游戏控制区和游戏显示区在Draw.h的DrawGameWindow()函数实现的(1)在初始位置画出方块,在预览区画出下一次的方块 (2)方块有两种行为:响应键盘命令UserHitKeyBoard(),自由下落 如果敲击键盘了(w ,a ,s ,d, )空格表示暂停,如果在规定时间内没有敲击键盘的话,方块自由下落一个单位if (kbhit()) //如果敲击键盘了 就处理按键{userHit = getch();UserHitKeyBoard(userHit, &curRockIndex, &curRockLocation);} //没有 就自动下移一个单位 :不能用else,因为可能按键不是上下左右DWORD newtime = GetTickCount(); if (newtime - oldtime >= (unsigned int)(300) && moveAbled == TRUE){oldtime = newtime;DisplayRock(curRockIndex, &curRockLocation, false);curRockLocation.top += ROCK_SQUARE_WIDTH; //下落一格}1234567891011121314(3)当方块落地(即不能下移了)时,判断是否满行,如果满行则消除,然后再判断游戏是否结束,游戏结束的话,直接退出游戏判断满行:FullLine()函数,从最底下的一行开始判断,直到遇到一行空行,while (count != xROCK_SQUARE_NUM ) //遇到空行 14{linefull = true; count = 0; for (int i = 1; i <= xROCK_SQUARE_NUM; ++i){ if (game_board[idx][i] == 0){linefull = false; count++;}} if (linefull) //满行,消除当前行,更新分数{DelCurLine(idx);//消除满行game_socres += 3;UpdateSocres(game_socres);idx++;//因为下面要减1}idx--;}123456789101112131415161718192021(4)消除满行 将要删除的满行擦除:即将方块化成与背景色相同的,该代码为黑色 然后将上面的一行向下移,移一行删除一行,直到遇到空行 具体看代码的具体实现 game.h void DelCurLine(int rowIdx)(4)判断方块是否能移动 在game.h中实现bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction)1**比较当前位置的坐标(左上角)开始,能否放下rockIndex的方块。 注:f_direction为”↑”的话,则传入的rockIndex为下一个方块**如果不能移动的话,给游戏game_board设置标记表示该位置被占有//全局变量-游戏板的状态描述(即表示当前界面哪些位置有方块) //0表示没有,1表示有(多加了两行和两列,形成一个围墙,便于判断方块是否能够移动) int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };123实现过程遇到的一些问题(1)在快速下落的时候,可能方块会掉出围墙的范围内, 快速下落是使方块每次下落2个单位距离。 在判断不能下落时,使当前坐标的top即y减去一个单位的距离(2)遇到多行满行时消除不了, 在判断满行时,循环找出满行,找出一个满行,就消除一行,然后继续判断是否满行,直到遇到空行

计算机的软件系统可分为________

系统软件和应用软件系统软件是指控制和协调计算机及外部设备,支持应用软件开发和运行的系统,是无需用户干预的各种程序的集合,主要功能是调度,监控和维护计算机系统;负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。系统软件使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。应用软件是指为特定领域开发、并为特定目的服务的一类软件。应用软件是直接面向用户需要的,它们可以直接帮助用户提高工作质量和效率,甚至可以帮助用户解决某些难题。应用软件一般分为两类:一类是为特定需要开发的实用型软件,如会计核算软件、订景系统、工程预算软件和教育辅助软件等:另一类是为了方便用户使用计算机而提供的一种工具软件,如用于文字处理的Word、用于辅助设计的AutoCAD及用于系统维护的瑞星杀毒软件等。


以下软件中,哪个不是操作系统软件?

D、microsoft office不是操作系统软件。Windows xp属于微软Windows系列操作系统软件,unix和linux都属于类Unix操作系统软件,而microsoft office是一套办公软件,不是操作系统软件。Microsoft Office是一套由微软公司开发的办公软件,它为 Microsoft Windows 和 Mac OS X而开发。与办公室应用程序一样,它包括联合的服务器和基于互联网的服务。最近版本的 Office 被称为 “Office system” 而不叫 “Office suite”,反映出它们也包括服务器的事实。该软件最初出现于九十年代早期,最初是一个推广名称,指一些以前曾单独发售的软件的合集。当时主要的推广重点是购买合集比单独购买要省很多钱。最初的 Office 版本只有 Word、Excel 和 Powerpoint;另外一个专业版包含 Microsoft Access。随着时间的流逝,Office 应用程序逐渐整合,共享一些特性,例如拼写和语法检查、OLE 数据整合和微软 Microsoft VBA(Visual Basicfor Applications)脚本语言。该软件被认为是一个开发文档的事实标准,而且有一些特性在其他产品中并不存在;但是其他产品也有 Office 缺少的特性。2007 Microsoft Office System 有一个和以前版本差异很大的用户界面。扩展资料:常见操作系统软件:1、类Unix系统所谓的类Unix家族指的是一族种类繁多的OS,此族包含了System V、BSD与Linux。由于Unix是The Open Group的注册商标,特指遵守此公司定义的行为的操作系统。而类Unix通常指的是比原先的Unix包含更多特征的OS。2、微软WindowsMicrosoft Windows系列操作系统是在微软给IBM机器设计的MS-DOS的基础上设计的图形操作系统。现在的Windows系统,如Windows 2000、Windows XP皆是创建于现代的Windows NT内核。NT内核是由OS/2和OpenVMS等系统上借用来的。3、Mac OS XmacOS,前称“Mac OS X”或“OS X”,是一套运行于苹果Macintosh系列计算机上的操作系统。Mac OS是首个在商用领域成功的图形用户界面系统。参考资料来源:百度百科-Microsoft Office

即墨田横什么时候退潮

涨潮退潮时间算法

方法一
1、农历日期小于十五的:
涨潮时间 = 农历日期×0.8
退潮时间 = 农历日期×0.8-6

2、农历日期大于十五的:
涨潮时间 =(农历日期-15)×0.8;
退潮时间 =(农历日期-15)×0.8-6
计算出的时间是12小时制的。

方法二
1、当日高潮时间:
上半月计算方法:(农历日期数-1)× 0.8+5.7 = 涨潮时间
下半月计算方法:(农历日期数-16)× 0.8+5.7 = 涨潮时间

2、明日高潮时间计算法:
今日涨潮时间+48分钟 = 明日涨潮时间。

举例说明
今假设日涨潮为8点钟,那么明日涨潮时间就是8点48分。
日照海域潮汐为正规半日潮,一天有两个涨潮,两个涨潮×间隔时间为12小时24分,最涨潮至最退潮间隔时间为6小时。


linux操作系统哪个版本最好用

linux发行版本主要以下几种
01 ubuntu 桌面版系统
对于不擅长系统操作命令的人员,使用比较方便
02 SUSE 网络服务功能强的系统
如果想把服务器充当路由设备,或邮件服务器,可以关注
03 Debian 安全性较好系统
有些对系统安全性要求高的企业会作为优选
04 Redhat 红帽公司官方系统
是很多国企或外企服务器中常用系统,需要进行付费,有官方服务支持
05 centos 红帽公司免费版系统
大多数互联网公司服务器常用系统,可以部署的服务多样,稳定性也比较高


圆周率怎么算?

圆周率是用圆的周长除以它的直径计算出来的。“圆周率”即圆的周长与其直径之间的比率。1、圆周率是一个超越数,它不但是无理数,而且比无理数还要无理。无理数有一个特点,就是小数部分是无限的,而且是不循环的。比如0.9的循环小数,这个虽然无限,但是重复的。而圆周率则是无限,而且数字不会重复,因此圆周率看起来非常长的一串数字。2、阿基米德是最早得出圆周率大约等于3.14的人。传说在他临死时被罗马士兵逼到一个海滩,还在海滩上计算圆周率,并且对士兵说:“你先不要杀我,我不能给后世留下一个不完善的几何问题。”阿基米德计算圆周率的方法是双侧逼近:使用圆的内接正多边形和外切正多边形的周长来近似圆的周长。正多边形的边数越多,多边形周长就越接近圆的边长。3、以前的人计算圆周率,是要探究圆周率是否循环小数。自从1761年Lambert证明了圆周率是无理数,1882年Lindemann证明了圆周率是超越数后,圆周率的神秘面纱就被揭开了。现在的人计算圆周率,多数是为了验证计算机的计算能力,还有,就是为了兴趣。


上一篇:minisoyo

下一篇:没有了

相关推荐

热门头条