貪吃蛇中的小思考

2021-09-02 09:53:25 字數 1564 閱讀 7667

程式設計思路

構造遊戲地圖,用矩陣實現,每乙個元素就是乙個點

構造蛇物件,有長度,身體,移動等屬性

遊戲時,蛇一直在移動,獲取到鍵盤輸入的訊息後改變方向,繼續移動

構建食物物件,位置,以及被蛇吃掉後的位置更新

程式終止條件,也就是蛇不能撞到自己或者邊界,也就是輸了;當然為了遊戲效果,設定乙個最大值,當蛇的長度超過這個值,就判定為win

關鍵點由於是控制台程式,因此實現貪吃蛇的關鍵點在於將蛇移動後的介面重繪並展示出來,並隨時獲取到鍵盤輸入的訊息,以及食物被吃後的重新設定。

將每次移動後的畫面重現,初步構想是把每次介面中各元素的位置記錄下來,然後清楚螢幕內容,重新輸出。(mfc中易於實現,主要是除了redraw window,不知道還有什麼方法可以去除畫過的痕跡)但實際上並沒有必要,改變的只是蛇頭和蛇尾的位置,只需要改兩個點的位置的內容就好。

隨時獲取鍵盤訊息,在mfc中很方便可以實現(雖然親自試驗並沒有起作用),但在控制台程式裡,還需要引用一些庫中的函式。

食物的重新設定,主要是位置不要出界,不要落在蛇身在的位置。

引用標頭檔案

標準c++程式開頭,除了常見的,還需要

#include #include //需要隨機設定食物的位置,時間作為隨機種子

#include //響應鍵盤函式

#include //控制台介面的控制

關鍵點的實現
void snake::move()

if (this->dir == 1)

else if (this->dir == 2)

else if (this->dir == 3)

else if (this->dir == 4)

gotoxy(this->body[0].x, this->body[0].y);

cout <<'o';

}

這個是蛇的移動方法,同時表現了在介面裡的展示方法

if(kbhit())					//kbhit 非阻塞函式 

}

這裡的 kbhit() 函式就是可以實現隨時響應鍵盤輸入的函式,效果比較好

void setfood(snake &s)

} if(i==s.len)else

} return;

}

這個就是食物設定的方法,這個的28和78是邊界大小

問題**

目前程式實現的基本還有乙個蛇身重合,也就是自己會撞自己沒有加上去(懶得改了)。其他的沒有問題。

但對於鍵盤訊息響應,一直耿耿於懷,查到了還有一種方法是

#define key_down(vk_noname) ((getasynckeystate(vk_noname)&0x8000)?1:0)

if(key_down('a'))else if()······

但是和kbhit()比起來,效果比較卡。在實現雙擊加速時,使用了條件巢狀,結果kbhit()效果也遜色不少,所以想著應該有更好的辦法,還是說在mfc等封裝好的圖形介面設計裡,優化效果會好點?這個目前還沒有找到答案。

貪吃蛇遊戲

貪吃蛇遊戲 結構化程式設計 c語言程式設計 重要的的是結構化的程式設計思想 include include include include include include define field width 300 就做20個格仔的 define field height 300 define f...

貪吃蛇(改進)

該程式分成3個檔案 第乙個檔案 fang.cs using system using system.collections.generic using system.text using system.windows.forms using system.drawing namespace snak...

貪吃蛇遊戲

include include include include include 使用當前時間做種子 enum dir 列舉型別enum dir 圍牆 class fencef 定義物件 畫框框 void fence initfence 顯示框框 void fence outputf int snak...