Linux下的图形库curses写贪吃蛇,酷
最近看到大神在Linux下寫的貪吃蛇代碼,用到了curses圖形庫,可能很多人都沒有用過,分享出來給大家。
在ubuntu下安裝curses圖形庫命令
sudo?apt-get?install?libncurses5-dev雙buff是一個非常優秀的機制,之前寫貪吃蛇的時候,如果不使用雙buff屏幕跳動會很劇烈,使用了雙buff后體驗就非常好。
我們使用curses圖形庫也是一樣,如果沒有調用refresh()函數之前,顯示的屏幕是不會進行更新的。
比如下面這段代碼
#include?<unistd.h> #include?<stdlib.h> #include?<curses.h> int?main() {initscr();/*?We?move?the?cursor?to?the?point?(5,15)?on?the?logical?screen,print?"Hello?World"?and?refresh?the?actual?screen.Lastly,?we?use?the?call?sleep(2)?to?suspend?the?program?for?two?seconds,so?we?can?see?the?output?before?the?program?ends.?*/move(5,?15);addstr("Hello?World");refresh();sleep(2);endwin();exit(EXIT_SUCCESS); }使用下面的命令編譯并運行
gcc?-o?t?screen1.c?-lncurses?&&?./t首先初始化一個屏幕,然后移動到屏幕的 5,15位置,在輸出字符串 Hello World。之后休眠 2秒后,程序退出。
使用curses寫貪吃蛇代碼
//sudo?apt-get?install?libncurses5-dev //gcc?-o?t?tanchishe.c?-lncurses?&&?./t #include?<curses.h>?//?Linux?下的圖形庫 #include?<unistd.h>?//?usleep() #include?<stdlib.h>?//?rand() #include?<time.h>???//?time() #define?W?40 #define?H?24 int?m[W?*?H],?q[W?*?H],?p?=?H?/?2?*?W?+?(W?/?2),?a,?h?=?0,?t?=?0,?d?=?1,?i; int?main(void)?{initscr();?noecho();?keypad(stdscr,?1);?nodelay(stdscr,?1);?curs_set(0);srand(time(NULL));for?(i?=?0;?i?<?W?*?H;?i++)m[i]?=?!(i?/?W?%?(H?-?1)?&&?i?%?W?%?(W?-?1));m[q[t?=?(t?+?1)?%?(W?*?H)]?=?p]?=?1;do?{?a?=?rand()?%?(W?*?H);?}?while?(m[a]);while?((i?=?getch())?!=?27)?{if??????(i?==?KEY_UP????&&?d?!=??W)?d?=?-W;else?if?(i?==?KEY_DOWN??&&?d?!=?-W)?d?=??W;else?if?(i?==?KEY_LEFT??&&?d?!=??1)?d?=?-1;else?if?(i?==?KEY_RIGHT?&&?d?!=?-1)?d?=??1;if?(m[p?+=?d])?break;m[q[t?=?(t?+?1)?%?(W?*?H)]?=?p]?=?1;if?(p?==?a)?do?{?a?=?rand()?%?(W?*?H);?}?while?(m[a]);else?m[q[h?=?(h?+?1)?%?(W?*?H)]]?=?0;for?(i?=?0;?i?<?W?*?H;?i++)mvaddstr(i?/?W,?(i?%?W)?*?2,?m[i]???"[]"?:?"??");mvaddstr(a?/?W,?(a?%?W)?*?2,?"()");refresh();usleep(100000);}while?(getch()?==?ERR);endwin(); }程序運行
簡單解釋下
for?(i?=?0;?i?<?W?*?H;?i++)mvaddstr(i?/?W,?(i?%?W)?*?2,?m[i]???"[]"?:?"??");構建邊框和蛇身的代碼,邊框是用 [] 構建的,用這個字符從視覺上看會比較舒服。
mvaddstr(a?/?W,?(a?%?W)?*?2,?"()");隨機生成的食物,之前已經用時間srand(time(NULL));作為種子設置了隨機數。
if?(m[p?+=?d])?break;碰撞檢測
if?(p?==?a)?do?{?a?=?rand()?%?(W?*?H);?}?while?(m[a]);else?m[q[h?=?(h?+?1)?%?(W?*?H)]]?=?0;如果碰撞到了食物,就增加蛇長度,m[]里面同時保存蛇的數據和邊框的數據,并且蛇移動的時候,需要把后面的數值設置為0。
p?=?H?/?2?*?W?+?(W?/?2)蛇的初始位置
自己修改的代碼,可以實現穿墻效果
運行如下:
代碼原文:
https://www.zhihu.com/question/360814879/answer/1013986215
公眾號后臺回復「curse」獲取curse圖形庫資料
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~
總結
以上是生活随笔為你收集整理的Linux下的图形库curses写贪吃蛇,酷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吉利博越L为何被称为新三好SUV
- 下一篇: 工程师的电脑桌面