草庐IT

c - Ncurses - 多窗口和刷新

coder 2023-11-12 原文

我正在编写一个小型学校项目。这是一个单词下降游戏 - 单词从顶部移动到底部。我有一个想法,制作两个窗口(一个带有界面,第二个带有移动对象)。正如您在代码中看到的那样,单词是随机的。问题是输入。我正在使用 mvwsacanw 来写这个词。当单词在不同的窗口中移动时,有没有办法在第二个窗口中写任何东西?现在这个词正在下降,当它到达底部时,第二个窗口打开,我可以输入这个词。

希望有人能帮助我。

#include <stdio.h>
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

void moving(WINDOW *move)
{
    int j,random;
    char *cmp=(char*)malloc(10*sizeof(char));
    char word[6];

    wclear(move);
    box(move, 0, 0);
    mvwprintw(move, 1, 1, "PIS");
    wrefresh(move);

    srand (time (NULL));
    random=2+rand()%7;
    for(j=0; j< random ; j++) //random word
    {
        word[j]= rand()%26+'a';
    }

    int poz = 2+rand()%24; //random position of moving word


    for(int i=1; i<18; i++)
    {
        wclear(move);
        box(move,0,0);
        mvwprintw(move,i, poz, word);
        wrefresh(move);
        usleep(300000);
    }
}

void interface(WINDOW *ui)
{
    wclear(ui);
    char *cmp=(char*)malloc(10*sizeof(char));
    box(ui, 0, 0);
    mvwprintw(ui,1,1,"wpisz wyraz: ");
    mvwscanw(ui,2,1, "%s",cmp);

    mvwprintw(ui, 3, 1, "->%s",cmp);
    wrefresh(ui);
}


int main(int argc, char *argv[])//int argc, const char * argv[])
{
    int x,y;
    int sc = 3;
    initscr();
    noecho();
    curs_set(FALSE);

    getmaxyx(stdscr, y,x);

    WINDOW *move = newwin(y-5, x-1, 0, 0);
    WINDOW *ui = newwin(sc+2, x, y-5, 0);

    while(1)
    {
    moving(move);
    interface(ui);
    wclear(move);
    wclear(ui);
    }

    delwin(move);
    delwin(ui);
    endwin();
    return 0;
}

最佳答案

您不能用当前的代码结构来做到这一点。您将单词 fall phase 和 input phase 保持在不同的函数中,因此使它们同时工作的唯一方法是某种多线程。 假设这不是您想要做的,您可以尝试将这两个功能合并到一个函数中。在伪代码中:

pick random word
pick random position
set i = 0
set input = {} //empty array
do
> print word at (i, pos)
> set stoptime = time() + DELAY
> do
>> set c = getch()
>> append c to input
>> print interface
> while (time() < stoptime)
> i++
while (i < 18)

将 timeout() 设置为适当的延迟,会给人一种印象,即一切都在同时发生。 这绝对不是最有效的解决方案,但简单明了,考虑到你正在做一个学校项目,它应该没问题

关于c - Ncurses - 多窗口和刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27607939/

有关c - Ncurses - 多窗口和刷新的更多相关文章

  1. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  2. ruby - 有没有办法将 html 刷新到 Sinatra 中的线路 - 2

    我有一个Sinatra应用程序,它有一个长时间运行的进程(网络抓取工具)。我希望应用程序在爬虫运行时而不是在结束时刷新爬虫进度的结果。我已经考虑过fork请求并使用ajax做一些有趣的事情,但这是一个非常基本的单页应用程序,实际上只需要在它发生时将日志输出到浏览器。有什么建议吗? 最佳答案 更新(2012-03-21)从Sinatra1.3.0开始,您可以使用新的流式API:get'/'dostreamdo|out|out旧答案不幸的是,您没有可以简单地刷新到的流(这不适用于Rack中间件)。从路由block返回的结果可以简单地响应

  3. ruby - 处理在 keyup 事件上发生的 javascript 弹出窗口 - 2

    我在HTML页面上有一个文本字段,用于检查您是否输入了1到365之间的值。如果用户输入了无效值,如非数字字符或不在范围内的值,它显示一个弹出窗口。我在watirwiki上看到有一个select_no_wait方法,用于在您从列表中选择无效值时关闭弹出窗口。处理键盘事件时出现的弹出窗口的好方法是什么?我是否需要按照select_no_wait方法的实现方式进行操作,或者我们是否可以启动一个不同的进程来消除调用set方法时可能出现的弹出窗口。带有Javascript验证函数的HTML文件示例如下:varnum=0functionvalidate(e){varcharPressed=Stri

  4. ruby - Watir Webdriver 如何关闭子窗口 - 2

    我正在将一些遗留的Watir脚本迁移到Watir-Webdriver。除了他们如何设计Watir-Webdriver来处理弹出窗口之外,迁移大部分进行得很顺利。他们没有使用久经考验的“附加”方法,而是用简化的“窗口”方法取而代之。语法非常简单,但是我很难理解如何在不关闭父窗口的情况下关闭单独的子窗口。目前我的代码是这样的-b.button(:xpath=>PREVIEWBUTTON).clickb.window(:title,POPUPWINDOW).useDOb.closeend目前正在发生的是b.close方法正在关闭子窗口和父窗口。我不确定为什么会这样,因为b.close方法包含

  5. ruby - 如何在 selenium-webdriver 中获取窗口标题、ID 和名称? - 2

    我正在尝试从selenium-webdriver(ruby)实现以下方法get_all_window_idsget_all_window_titlesget_all_window_names我运行了SeleniumIDE并将我的脚本导出到RubyTest::Unit。另存为.rb使用AptanaStudio3打开我的脚本进行编辑初始代码片段如下:require"rubygems"require"selenium-webdriver"require"test/unit"classSwitchToPopup3我不断得到的错误是NoMethodError:undefinedmethod`ge

  6. ruby - 如何设置 WATIR 焦点在新窗口 - 2

    我是WATIR测试的新手(我喜欢它吗!)并且遇到了如何将我的WATIR脚本重新聚焦到新打开的窗口的问题。这是我的(简化的)脚本....#!/usr/bin/rubyrequire'rubygems'require'watir-webdriver'browser=Watir::Browser.newbrowser.goto("http://0:3050")browser.text_field(:name,"userkey300203830").set("OKJHNB")browser.button(:id,"interview48").clickputs"ExpectedResult:"

  7. ruby-on-rails - 在 rails 中单击提交打开一个新窗口 - 2

    您好,我想使用ruby​​onrails在单击提交按钮时打开新窗口,这是我的代码'btnbtn-mdbtn-success'do%>CreateNewWindow我试过:target=>"_blank"提交,但它不起作用,请帮助我 最佳答案 使用formtarget="_blank"。'btnbtn-mdbtn-success',:formtarget=>"_blank"do%>CreateNewWindow此链接将为您提供帮助http://www.w3schools.com/tags/att_button_formtarget.a

  8. ruby - 切换到 cucumber , capybara 中的弹出窗口 - 2

    在RSpec中我可以使用这样的代码切换到弹出窗口,link,我怎么能在cucumber步骤中做这样的事情?login_window=page.driver.find_window('PPA_identity_window')main_window=page.driver.find_window('')#Weusethistoexecutethenextinstructionsinthepopupwindowpage.within_window(login_window)do#Normallyfillintheformandloginfill_in'email',:with=>""fil

  9. ruby - MacVim 命令窗口文本着色帮助(Rspec 输出) - 2

    我正在尝试为ruby​​开发人员过渡到MacVim。我遇到的一个难题是快速运行规范并轻松获得结果(通过/失败)。当我运行:Rake(或:!rspec%)时,它会运行当前文件中的规范。输出显示在命令窗口中。如果我在常规终端中运行它,我会得到彩色输出。也就是说,点是绿色的,失败的是红色的。在MacVim中,我得到了这些奇怪的[32m和[0m标记。这是一个例子:关于如何解决这个问题有什么想法吗? 最佳答案 Gvim(我假设Macvim就是那个有品牌名称的:))背后没有真正的终端,所以这就是为什么你会得到这些“奇怪”的标记——它们是真正的转

  10. ruby - 你能关闭 capybara 中所有打开的窗口吗? - 2

    因此,当我单独运行测试时,它们运行良好。但是,当我运行我的功能(多次测试)时,我的代码失败了。这是因为当capybara存在时,并不是我所有的窗口都关闭,因此我的selenium驱动程序不知道要使用哪个窗口。基本上,我的测试正在打开多个窗口。发生这种情况是因为我的测试是单击打开新窗口的链接并检查新窗口中的内容。尽管我在每次测试结束时都说了page.quit,但此函数并没有关闭所有打开的窗口(关闭事件窗口但不关闭原始窗口)。当第二个测试运行时,它使用最初创建的窗口,但是当它打开新的弹出窗口时,它使用了错误的窗口。如何确保在每次测试期间都使用新的浏览器并且关闭之前测试的所有窗口。我目前正在

随机推荐