成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

在ubuntu下安裝curses圖形庫命令

  1. sudo apt-get install libncurses5-dev 

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

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

比如下面這段代碼 

  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] ? "[]" : "  "); 

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

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

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

  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[]里面同時保存蛇的數據和邊框的數據,并且蛇移動的時候,需要把后面的數值設置為0。 

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

蛇的初始位置

自己修改的代碼,可以實現穿墻效果 

  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 

 

責任編輯:龐桂玉 來源: 良許Linux
相關推薦

2015-07-31 11:26:24

Swift貪吃蛇

2024-01-18 11:22:41

C++Windows開發

2012-06-05 14:42:57

Silverlight

2022-07-25 14:17:04

JS應用開發

2022-10-28 09:33:10

Linux貪吃蛇

2021-06-15 09:18:51

鴻蒙HarmonyOS應用

2020-08-20 20:30:49

C語言小游戲貪吃蛇

2024-12-17 17:46:05

Android原生控件貪吃蛇

2021-09-02 15:25:53

鴻蒙HarmonyOS應用

2022-11-07 11:27:00

JS游戲開發

2023-10-17 10:20:53

VueReact

2025-02-27 09:31:05

2010-02-05 15:00:44

Android 調用u

2016-09-19 21:24:08

PythonAsyncio游戲

2016-09-14 21:17:47

PythonAsyncio游戲

2016-09-22 21:12:14

2025-02-18 09:00:00

2018-08-31 15:48:33

2021-06-10 22:26:53

Python 幾何圖形

2021-05-27 16:53:09

開發技能代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日草天天干 | 国产精品中文字幕在线 | 国产午夜精品久久久 | 欧美在线a | 一区二区福利视频 | 91亚洲免费 | 亚洲高清在线观看 | 欧美日韩久久精品 | 欧美啪啪 | 久久国产亚洲 | 久久久久国产精品一区二区 | 成人精品一区二区三区中文字幕 | 亚洲精品66| 天天爱天天操 | 欧美视频一区 | 97色在线观看免费视频 | 在线观看电影av | 亚洲毛片| 亚洲精品国产第一综合99久久 | 成人精品鲁一区一区二区 | 黄色日本视频 | 天天爽一爽| 国产专区在线 | 日韩不卡在线观看 | 亚洲h视频 | 欧美一区二区在线观看 | 水蜜桃亚洲一二三四在线 | 激情综合五月天 | 亚洲精品一二三区 | 亚洲国产精品网站 | 久久久久无码国产精品一区 | 一区二区三区四区不卡视频 | 日韩在线一区二区 | 久久不卡 | 欧美在线一区二区三区 | 日本91av视频 | 国产成人精品网站 | 黄网免费 | 久久香蕉网 | 在线观看av免费 | 国产亚洲一区二区在线观看 |