自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux下的圖形庫curses寫貪吃蛇,酷

系統(tǒng) Linux
最近看到大神在Linux下寫的貪吃蛇代碼,用到了curses圖形庫,可能很多人都沒有用過,分享出來給大家。

近看到大神在Linux下寫的貪吃蛇代碼,用到了curses圖形庫,可能很多人都沒有用過,分享出來給大家。

在ubuntu下安裝curses圖形庫命令

  1. sudo apt-get install libncurses5-dev 

雙buff是一個非常優(yōu)秀的機制,之前寫貪吃蛇的時候,如果不使用雙buff屏幕跳動會很劇烈,使用了雙buff后體驗就非常好。

我們使用curses圖形庫也是一樣,如果沒有調(diào)用refresh()函數(shù)之前,顯示的屏幕是不會進行更新的。

比如下面這段代碼 

  1. #include <unistd.h>  
  2. #include <stdlib.h>  
  3. #include <curses.h>  
  4. int main()  
  5.  
  6.     initscr();  
  7.     /* We move the cursor to the point (5,15) on the logical screen,  
  8.        print "Hello World" and refresh the actual screen.  
  9.        Lastly, we use the call sleep(2) to suspend the program for two seconds,  
  10.        so we can see the output before the program ends. */  
  11.     move(5, 15);  
  12.     addstr("Hello World");  
  13.     refresh();  
  14.     sleep(2);  
  15.     endwin();  
  16.     exit(EXIT_SUCCESS);  

使用下面的命令編譯并運行

  1. gcc -o t screen1.c -lncurses && ./t 

首先初始化一個屏幕,然后移動到屏幕的 5,15位置,在輸出字符串 Hello World。之后休眠 2秒后,程序退出。

使用curses寫貪吃蛇代碼 

  1. //sudo apt-get install libncurses5-dev  
  2. //gcc -o t tanchishe.c -lncurses && ./t  
  3. #include <curses.h> // Linux 下的圖形庫  
  4. #include <unistd.h> // usleep()  
  5. #include <stdlib.h> // rand()  
  6. #include <time.h>   // time()  
  7. #define W 40  
  8. #define H 24  
  9. int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0t = 0d = 1, i;  
  10. int main(void) {  
  11.     initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);  
  12.     srand(time(NULL)); 
  13.     for (i = 0; i < W * H; i++)  
  14.         m[i] = !(i / W % (H - 1) && i % W % (W - 1));  
  15.     m[q[t = (t + 1) % (W * H)] = p] = 1;  
  16.     do { a = rand() % (W * H); } while (m[a]);  
  17.     while ((i = getch()) != 27) {  
  18.         if      (i == KEY_UP    && d !=  W) d = -W;  
  19.         else if (i == KEY_DOWN  && d != -W) d =  W 
  20.         else if (i == KEY_LEFT  && d !=  1) d = -1;  
  21.         else if (i == KEY_RIGHT && d != -1) d =  1 
  22.         if (m[p += d]) break;  
  23.         m[q[t = (t + 1) % (W * H)] = p] = 1;  
  24.         if (p == a) do { a = rand() % (W * H); } while (m[a]);  
  25.         else m[q[h = (h + 1) % (W * H)]] = 0;  
  26.         for (i = 0; i < W * H; i++)  
  27.             mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");  
  28.         mvaddstr(a / W, (a % W) * 2, "()");  
  29.         refresh();  
  30.         usleep(100000);  
  31.     }  
  32.     while (getch() == ERR);  
  33.     endwin();  

程序運行

簡單解釋下 

  1. for (i = 0; i < W * H; i++)  
  2.             mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  "); 

構(gòu)建邊框和蛇身的代碼,邊框是用 [] 構(gòu)建的,用這個字符從視覺上看會比較舒服。 

  1. mvaddstr(a / W, (a % W) * 2, "()"); 

隨機生成的食物,之前已經(jīng)用時間srand(time(NULL));作為種子設(shè)置了隨機數(shù)。

  1. if (m[p += d]) break; 

碰撞檢測 

  1. if (p == a) do { a = rand() % (W * H); } while (m[a]);  
  2.         else m[q[h = (h + 1) % (W * H)]] = 0; 

如果碰撞到了食物,就增加蛇長度,m[]里面同時保存蛇的數(shù)據(jù)和邊框的數(shù)據(jù),并且蛇移動的時候,需要把后面的數(shù)值設(shè)置為0。 

  1. p = H / 2 * W + (W / 2) 

蛇的初始位置

自己修改的代碼,可以實現(xiàn)穿墻效果 

  1. //sudo apt-get install libncurses5-dev  
  2. //gcc -o t tanchishe.c -lncurses && ./t 
  3. #include <curses.h> // Linux 下的圖形庫  
  4. #include <unistd.h> // usleep()  
  5. #include <stdlib.h> // rand()  
  6. #include <time.h>   // time()  
  7. #define W 40  
  8. #define H 24  
  9. int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0t = 0d = 1, i,j=3 
  10. int main(void) {  
  11.     initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);  
  12.     srand(time(NULL));  
  13.     for (i = 0; i < W * H; i++) m[i] = !(i / W % (H - 1) && i % W % (W - 1));  
  14.     m[q[t = (t + 1) % (W * H)] = p] = 1;  
  15.     do { a = rand() % (W * H); } while (m[a]);  
  16.     while ((i = getch()) != 27) {  
  17.         if      (i == KEY_UP    && d !=  W) {d = -W;j=0;}  
  18.         else if (i == KEY_DOWN  && d != -W) {d =  W;j=1;}  
  19.         else if (i == KEY_LEFT  && d !=  1) {d = -1;j=2;}  
  20.         else if (i == KEY_RIGHT && d != -1) {d =  1;j=3;}  
  21.         if (m[p += d]) {  
  22.             switch(j){  
  23.                 case 0:p = p+(H-2)*W; break;  
  24.                 case 1:p = p-(H-2)*W; break;  
  25.                 case 2:p = p+W-2; break;  
  26.                 case 3:p = p-W+2; break;  
  27.                 default: p = H / 2 * W + (W / 2); break;  
  28.             }  
  29.         };  
  30.         m[q[t = (t + 1) % (W * H)] = p] = 1;  
  31.         if (p == a) do { a = rand() % (W * H); } while (m[a]);  
  32.         else m[q[h = (h + 1) % (W * H)]] = 0;  
  33.         for (i = 0; i < W * H; i++){  
  34.             mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");  
  35.         }  
  36.         mvaddstr(a / W, (a % W) * 2, "()");  
  37.         refresh(); 
  38.         usleep(100000);  
  39.     }  
  40.     while (getch() == ERR);  
  41.     endwin();  

運行如下:

代碼原文:

https://www.zhihu.com/question/360814879/answer/1013986215 

 

責(zé)任編輯:龐桂玉 來源: 良許Linux
相關(guān)推薦

2024-01-18 11:22:41

C++Windows開發(fā)

2015-07-31 11:26:24

Swift貪吃蛇

2012-06-05 14:42:57

Silverlight

2022-07-25 14:17:04

JS應(yīng)用開發(fā)

2022-10-28 09:33:10

Linux貪吃蛇

2021-06-15 09:18:51

鴻蒙HarmonyOS應(yīng)用

2020-08-20 20:30:49

C語言小游戲貪吃蛇

2024-12-17 17:46:05

Android原生控件貪吃蛇

2021-09-02 15:25:53

鴻蒙HarmonyOS應(yīng)用

2022-11-07 11:27:00

JS游戲開發(fā)

2023-10-17 10:20:53

VueReact

2025-02-27 09:31:05

2010-02-05 15:00:44

Android 調(diào)用u

2025-02-18 09:00:00

2016-09-19 21:24:08

PythonAsyncio游戲

2016-09-14 21:17:47

PythonAsyncio游戲

2016-09-22 21:12:14

2021-05-27 16:53:09

開發(fā)技能代碼

2021-06-10 22:26:53

Python 幾何圖形

2018-08-31 15:48:33

點贊
收藏

51CTO技術(shù)棧公眾號