成人免费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技術棧公眾號

主站蜘蛛池模板: 亚洲高清视频一区二区 | 91文字幕巨乱亚洲香蕉 | 国产成人免费 | 亚洲综合在线播放 | 天天天操天天天干 | 91麻豆精品国产91久久久更新资源速度超快 | 免费99视频 | 久久伦理中文字幕 | 一级毛片成人免费看a | 国产91丝袜在线播放 | 日韩精品成人一区二区三区视频 | 亚州春色 | 国产日韩欧美另类 | 亚洲高清一区二区三区 | 最新中文字幕第一页视频 | 久久www免费人成看片高清 | 亚洲综合一区二区三区 | 91影库 | 99久久精品国产一区二区三区 | 午夜天堂精品久久久久 | 成人亚洲视频 | 久久99成人 | 亚洲第一视频网 | 成人在线播放网址 | 亚洲一区二区三区免费在线观看 | 日本精品在线一区 | av国产精品毛片一区二区小说 | 久草在线 | 久草视频在线播放 | 欧美一二三四成人免费视频 | 国产在线视频在线观看 | 成人精品一区二区三区 | 午夜看看| 伊人狠狠 | 91.xxx.高清在线 | 国产精品成人一区二区三区 | 麻豆91精品91久久久 | 亚洲精品一区在线观看 | 在线成人福利 | 国产探花在线精品一区二区 | 一起操网站 |