1.C语言俄罗斯方块游戏解析
2.å¦ä½è®© Qt çç¨åºä½¿ç¨ Sleep
3.ORB-SLAM2 的源码编译运行(ubuntu20.04)以及ROS1安装
4.linuxä¸å¦ä½å®ç°sleep(0)çåè½
5.å¦ä½è®© Qt ç¨åº Sleep
C语言俄罗斯方块游戏解析
本文解析一个优秀的C语言实现的俄罗斯方块游戏代码。首先,源码需要了解游戏中常见的源码7种形状方块,每种形状可能有1种或4种状态,源码每个方块需要2个字节存储,源码使用4x4数组表示方块信息。源码死亡实验源码
接下来,源码代码通过解析方块数据的源码4个bit来决定输出位置。例如,源码方块0的源码数据0x(二进制0B)会被显示为特定形状。同样,源码Z方块数据0x(二进制0B)显示为另一形状。源码若模式设置为0,源码则擦除方块。源码
在程序中,源码固定cmd窗口大小,而非默认黑框,postgresql 源码 锁通过代码实现。显示方块与模式0的擦除功能已实现。
程序设计中,延迟函数避免使用usleep,采用在键值获取函数中插入延迟,这是一项巧妙设计。此外,得分机制、直销盘源码碰撞检测与消除方块的逻辑未详述。
源码提供下载,欢迎试玩。作者的实现技术令人佩服,后续文章将更深入解析游戏的关键部分。欢迎留言讨论,共同进步。
俄罗斯方块游戏是oauth源码分析学习C语言编程的理想案例,适合编程初学者。免费资源提供C语言入门资料,包括编程基础、游戏编程、课程设计及黑客技术。资深工程师在线解答疑惑,助你轻松入门C语言。
å¦ä½è®© Qt çç¨åºä½¿ç¨ Sleep
Qt 为ä½æ²¡ææä¾ Sleep
论åä¸ä¸æ¶è§å°æ人é®ï¼
Qt 为ä»ä¹æ²¡ææä¾è·¨å¹³å°ç sleep å½æ°ï¼
使ç¨å¹³å°ç¸å ³ç Sleep æ nanosleep 以åï¼çé¢ä¸ºä»ä¹æ²¡æååºï¼
QThread ä¸æä¾äºprotected æéç sleep å½æ°ï¼å¦ä½ç¨å°ä¸»çº¿ç¨ä¸ï¼
ä½¿ç¨ QTest ä¸ç qSleepï¼å¨windowsä¸å¦ä½éèæ§å¶å°ï¼
è¿äºé®é¢å ¶å®å½ç»ä¸ºä¸ç¹ï¼å¨ä¸»çº¿ç¨ä¸ä½¿ç¨è¿äºå½æ°æ¯ä¸ç§é误ï¼è¿ä¼ç´æ¥å¯¼è´çé¢æ æ³å·æ°ï¼ç¨æ·ä¸ç¨åºæ æ³äº¤äºã
Qtä¸æä¾ï¼æ¯å ä¸ºä½ ä¸éè¦å¨ä¸»çº¿ç¨ä¸ä½¿ç¨ sleep å½æ°ã
å¦ä½è®©ç¨åºçå¾ ä¸æ®µæ¶é´
QTime
QTime t;
t.start();
while(t.elapsed()<);
è¿ç§æ»å¾ªç¯ä¹æ¯ä¸ç§å¸¸è§é误ç¨æ³ãä½æ¹ææ£ç¡®çè¿æ¯æ¯è¾ç®åçï¼
QTime t;
t.start();
while(t.elapsed()<)
QCoreApplication::processEvents();
ä¸åå°å¤çäºä»¶ï¼ä»¥ä½¿å¾ç¨åºä¿æååºã
QElapsedTimer
è¿æ¯Qt4.7å¼å ¥çæ°çç±»ï¼åQTimeç¸æ¯ï¼å®æä¾äºæ´å¿«çè®¡ç® elapsed æ¶é´çæ¹æ³ã
QElapsedTimer t;
t.start();
while(t.elapsed()<)
QCoreApplication::processEvents();
QTest::qWait
è¿æ¯QTest模åæä¾ççå¾ å½æ°
ä¸é¢æ¯å ¶æºä»£ç ï¼åæ们åé¢ç代ç å¾åå§ï¼ï¼ï¼
namespace QTest
{
inline static void qWait(int ms)
{
Q_ASSERT(QCoreApplication::instance());
QElapsedTimer timer;
timer.start();
do {
QCoreApplication::processEvents(QEventLoop::AllEvents,远程视频 源码 ms);
QTest::qSleep();
} while (timer.elapsed() < ms);
}
...
å ¶å®æ²¡ä»ä¹éå,对å§ï¼ä½æ¯å 为å®QTest模åï¼æ以å¨ç¨åºä¸æ们ä¸è¦ä½¿ç¨å®ã
QEventLoop
é åQTimer使ç¨å±é¨ç eventLoop ä¹æ¯ä¸ä¸ªä¸éçéæ©ãä¾åï¼
QEventLoop eventloop;
QTimer::singleShot(, &eventloop, SLOT(quit()));
eventloop.exec();
QTimer å QBasicTimer
è¿ä¸¤ä¸ªåæ¬æ没æä»ä¹ç´æ¥å ³ç³»ï¼QTimer估计大家é½å¾çäºãèQBasicTimer估计å¾å°æ人ç¨ã
ä¸QTimerç¸æ¯ï¼QBasicTimeræ´å¿«éãè½»éãåºå±ã
ä¸QTimerç¸æ¯ï¼å®ä¸æ¯QObjectçæ´¾çç±»ã
跨平å°çsleep
尽管ä¸å¼å§æ们就说äºï¼ä¸éè¦è¿ä¸ªä¸è¥¿ãä½ä¸æé¤æç§åºåä¸ï¼ä½ ç¡®å®éè¦è¿ä¸ªä¸è¥¿ãå¦ä½å®ç°ä¸ä¸ªè·¨å¹³å°ç sleep å¢ï¼
æ们ä¸å¼å§ä¹æå°äºï¼QThreadç±» å QTest模åé½æä¾äºsleepå½æ°ï¼å ¶å®æ们åªéè¦ççä»ä»¬çæºç å°±å¤äºï¼
QTest 模åä¸çå½æ°å¾ç®åï¼windowsä¸è°ç¨Sleepï¼å ¶ä»å¹³å°è°ç¨ nanosleepï¼ï¼
void QTest::qSleep(int ms)
{
QTEST_ASSERT(ms > 0);
#ifdef Q_OS_WIN
Sleep(uint(ms));
#else
struct timespec ts = { ms / , (ms % ) * * };
nanosleep(&ts, NULL);
#endif
}
çQThreadçæºç ï¼windowsä¸åæ ·ç´æ¥è°ç¨Sleepï¼ä½éwindowsçå®ç°æ¯è¿ä¸ªå°±å¤æå¤äºï¼
[cpp] view plain copy
/* /internal
helper function to do thread sleeps, since usleep()/nanosleep()
aren't reliable enough (in terms of behavior and availability)
*/
static void thread_sleep(struct timespec *ti)
{
pthread_mutex_t mtx;
pthread_cond_t cnd;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cnd, 0);
pthread_mutex_lock(&mtx);
(void) pthread_cond_timedwait(&cnd, &mtx, ti);
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cnd);
pthread_mutex_destroy(&mtx);
}
void QThread::sleep(unsigned long secs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_sec = tv.tv_sec + secs;
ti.tv_nsec = (tv.tv_usec * );
thread_sleep(&ti);
}
ORB-SLAM2 的编译运行(ubuntu.)以及ROS1安装
在 Ubuntu . 环境中,编译并运行 ORB-SLAM2 需要一系列的准备工作和库的安装。首先,确保已安装了所需的依赖项,然后按照指定链接从 GitHub 下载并安装 Pangolin-0.6 稳定版。
接着,进行 OpenCV-3.4.5 的安装,包括下载、配置编译环境和查询版本信息以验证安装是否成功。对于 Eigen3,建议源码安装默认的 Eigen 版本(3.3.9),并将其头文件复制到相应目录以确保正常工作。若需要使用特定版本(如3.3.7),需手动安装并调整位置。
在编译 ORB-SLAM2 时,需处理常见的报错,例如在 `System.h` 中添加 `#include` 以解决 `usleep` 报错,并根据特定链接调整 `LoopClosing.h` 文件中的代码以解决第二个报错。第三个报错需删除 `CMakeCache.txt` 文件并重新执行 `cmake ..` 和 `make` 命令。
成功编译后,需在特定目录下运行 ORB-SLAM2,确保使用正确的终端打开以找到可执行文件。此外,安装 ROS1 可以通过一键安装工具完成,注意管理日志目录的大小以避免警告。在安装完成后,启动 ROS Master、小海龟仿真器和海龟控制节点,以验证 ROS1 是否已成功安装。
安装过程中可能遇到的问题包括 ROS 目录的位置和库查找问题,以及如何在编译 ORB-SLAM2 时指定依赖目录。通过将 ROS 目录添加到环境变量(如 `PYTHONPATH` 或 `LD_LIBRARY_PATH`)中,可以解决这些问题并确保库的正确查找。
linuxä¸å¦ä½å®ç°sleep(0)çåè½
å段æ¶é´ä»windows移æ¤äºä¸ä¸ªç¨åºå°linuxä¸ï¼ä¸ç¥ä¸ºä½æ§è½å¥å·®ãæ¥äºä¸åå ï¼åç°æ¯ç±äºä¸ä¸ªå½æ°ZeroSleepç¹å«èæ¶ï¼è¿ä¸ªå½æ°ç代ç å¾ç®åï¼å¦ä¸ï¼
void ZeroSleep()
{
Sleep(0);
}
Sleep(0)ä½ç¨æ¯ç¨æ¥éæ¾cpuçæ¶é´çï¼é¿å å¿çå¾ ãäºæ¯æ³å½ç¶çå¨linuxä¸å®ç°ä¸ºï¼
void ZeroSleep()
{
msleep(0);
}
ä½å ¶å®msleep APIçæºä»£ç å¦ä¸ï¼
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schedule_timeout_uninterruptible(timeout);
}
å¦æ¤ä¸æ¥ï¼å³ä½¿åæ°ä¸º0ï¼ä¹è³å°è¦ç¡ç ä¸ä¸ªjiffiesåä½çæ¶é´ï¼å æ¤å¯¼è´ä¸¥éçæ§è½é®é¢ã
该é®é¢ç解å³æ¹æ³æ¯ï¼
æ¢ç¶ZeroSleepçç®çæ¯éæ¾cpuèµæºï¼é£ä¹å°±å¯ä»¥éè¿è°ç¨schedule()å½æ°æ¿æ¢msleep ãèä¸å®é ä¸msleepæ¬èº«ä¹æ¯éè¿è°ç¨schedule_timeout_uninterruptibleå®ç°çï¼æ以è¿ä¸ªåæ³ä¹æ¯åççã
d;pthread_mutex_init(&mtx, 0);pthread_cond_init(&cnd, 0);pthread_mutex_lock(&mtx); (void) pthread_cond_timedwait(&cnd, &mtx, ti);pthread_mutex_unlock(&mtx);pthread_cond_destroy(&cnd);pthread_mutex_destroy(&mtx);}voidQThread::sleep(unsignedlongsecs){ structtimevaltv;gettimeofday(&tv, 0);structtimespecti;ti.tv_sec = tv.tv_sec + secs;ti.tv_nsec = (tv.tv_usec * );thread_sleep(&ti);}