2015-11-02 21 views
1

所以我試圖在我的終端上顯示遊戲板,並讓玩家輸入他們的下一步行動(在我的情況下是4連勝)。每次玩家進行輸入時,我都會再次畫板。C - 在終端上顯示信息的方法更快

Player 'O' won! Well, player 'X' did play badly.

不幸的是,這些插入牆壁和棋子時,每個字符分別,你基本上可以看到我的電腦變慢顯示每一個字符一個接一個。

爲了簡化這裏的事情,我會假裝我只想顯示一大串字符。我已經有大部分的邏輯和輸入工作,所以我只是尋找優化。


所以這是我第一次方法。只需通過循環並逐一打印。

// Rows 
for(int x = 0; x < 10; x++) { 
    // Columns 
    for(int y = 0; y < 10; y++) { 

     // Note: to keep evererything neatly in-line, I'll just use if-statements 
     if((y % 3) == 0) printf(" "); 
     if((y % 3) == 1) printf("X"); 
     if((y % 3) == 2) printf("O"); 

    } 
    printf("\n"); // Add line-break at the end 
} 

所以我的猜測是,每一個我打電話printf時間,計算機分析和打印出來我的屏幕上之前相應編輯字符串。這可能是它如此緩慢的原因。 (如果我錯了,請糾正我)。


作爲第二種方法,我試圖將一個字符數組內的所有信件保存在打印之前。

char text[500]; // Note: In my program I don't know how long the text is. 
int index = 0; 

// Rows 
for(int x = 0; x < 10; x++) { 
    // Columns 
    for(int y = 0; y < 10; y++) { 

     if((y % 3) == 0) text[index] = ' '; // Set text index accordingly 
     if((y % 3) == 1) text[index] = 'X'; 
     if((y % 3) == 2) text[index] = 'O'; 
     index++; // Increase index 

    } 
    text[index] = '\n'; // Add line-break 
    index++; 
} 
text[index] = '\0'; // End of string 
printf(text); 

雖然起初有點勢不可擋,此代碼的工作perfectally我居然設法打印字符串很多,很多更快。

這樣做的問題是,(1)你很快就會失去跟蹤你的指數(所以調試是一個真正的痛苦),並且(2)你不得不忍受恐懼,你的文字會更長超過500個字符(或者你只需​​要100個字符並浪費了大量的空閒空間)。

我現在的問題是:是否有任何快速和更一致的方式來顯示終端屏幕上的信息?而不是每輪都顯示遊戲板,我是否也可以刪除最後幾個字符,直到找到需要編輯的部分?我還可以凍結屏幕直到內容準備好嗎?

對於那些有興趣,這裏是(幾乎是)我的全C代碼:http://pastebin.com/Emffgsdd

+1

爲此使用'curses'庫。 – Linus

+0

你有沒有考慮過使用[* ncurses *](https://en.wikipedia.org/wiki/Ncurses)庫? – lurker

+0

@Linnus好吧,我會研究它! –

回答

1

是的,而不是重繪一切,每次,你只能得出的變化(如在遊戲新玩法元素)。面臨的挑戰是跟蹤屏幕狀態。

一個知名的終端庫,照顧大多數這些問題是NCURSES。 Eric Raymond有很好的online book