1. 程式人生 > >C/C++貪吃蛇專案

C/C++貪吃蛇專案

本次貪吃蛇專案已實現的功能

背景音樂,歡迎介面,各種選單選項,暫停遊戲,重新開始,儲存與讀取遊戲進度。

普通模式(撞牆gg) 穿牆模式(可以穿過牆不死,障礙物除外)
單蛇自嗨,雙蛇對戰。

計分功能,等級功能,等級越高蛇速度越快。
各種型別食物:讓自己,對方變長變短。讓對方無法轉向,或者方向反轉。
炮彈食物,可疊加。雙蛇都具備攻擊技能,可以發射炮彈。

冰塊地形,進入會加速。
單蛇普通與穿牆模式最高分數記錄,英雄排行榜。

自定義編輯地圖,儲存地圖,使用自定義地圖開始遊戲。

原始碼分享:https://github.com/Mr-Hock/MySnake

在這裡插入圖片描述
在這裡插入圖片描述

主要類:POINTDATA

所有圖形都是由每個獨立的座標點組成的
在這裡插入圖片描述

在這裡插入圖片描述

普通模式

撞牆或者撞到障礙物死亡

穿牆模式

可以穿過四周的牆壁,從另一邊出來,但是對障礙物無效

在這裡插入圖片描述

穿牆模式穿牆模式主要是在碰到牆壁後再進行一次操作
判斷蛇頭的位置,如果等於牆壁的邊緣位置
則直接修改到另一邊牆壁的位置
在這裡插入圖片描述

雙人對戰 – 使用2個蛇類

分別對2個不同的蛇類座標陣列進行操作。
使用while迴圈,用_getchar接受按鍵輸入。
在這裡插入圖片描述

迴圈內包含其他雙蛇判斷操作
吃不同種類食物讓對方產生效果
讓對方的按鍵方向反轉或禁轉向的食物,實現方法:
主執行緒迴圈內判斷是否吃到該種類食物
在這裡插入圖片描述
在這裡插入圖片描述

置入異常狀態與取出異常狀態是否有效
實現方法:
在這裡插入圖片描述

發炮彈

玩家是否能發炮,判斷是否有炮彈食物,如果沒有就犧牲長度發炮,最短不能小於5
炮彈打到自己或者對方則死亡,打到牆壁或者障礙物後炮彈消失
在這裡插入圖片描述

炮彈發出規則與方向

如果在牆壁或者障礙物前面
則無法發炮
炮彈發出後將定位在蛇頭移動方向座標+2

實現方法:
在這裡插入圖片描述

炮彈消失規則

炮彈打到自己或者對方則死亡,打到牆壁或者障礙物後炮彈消失
要用倒序迴圈,不然刪除的時候會影響後續判斷的陣列元素位置
實現方法:
在這裡插入圖片描述

冰面上加速

加速方法就是改sleep時間
實現方法:
在這裡插入圖片描述

儲存存檔。

僅儲存蛇頭,蛇身座標點分佈,顏色,使用寫出二進位制檔案的方式儲存。
儲存格式與順序:蛇座標點數量-蛇的座標點資料pointdata類動態陣列,移動方向,分數
最後寫出檔案,普通:Normal2 .sav 穿牆:Wear .sav
在這裡插入圖片描述


在這裡插入圖片描述

讀取存檔。

讀取:首先new一個pointdata類的記憶體空間,將資料讀入這個記憶體空間
讀取順序:先讀取前面4位元組,為pointdata類的數量,然後for迴圈依次讀取資料
再讀取蛇的移動方向,還有分數,還原上一次的記錄
讀取陣列的資料要重新將pointdata 類內的m_data儲存的值重新改一下
因為這個成員儲存的是上一次的字串地址,並非圖案。
最後push_back將這個資料加入動態陣列最後一個位置即可
在這裡插入圖片描述
在這裡插入圖片描述

自定義地圖

主要使用檢測滑鼠函式完成繪畫
檢測滑鼠點選的位置,將設計畫面分為3個框架
繪圖區,工具介面區,儲存與退出區

繪圖區操作技巧

在繪圖區按住滑鼠左鍵可以連續繪畫,按住右鍵連續擦除
實現方法:
主要用INPUT_RECORD結構體內的成員dwButtonState數值判斷
在這裡插入圖片描述
在這裡插入圖片描述

自定義地圖

滑鼠訊息實現判斷
因為這是一個被迴圈執行的函式,所以使用static定義一個區域性靜態變數儲存。
如果滑鼠左鍵按下賦值1,放開賦值0.
然後判斷滑鼠移動訊息,如果值不等於0且移動了,則取出座標傳入類方法進行連續繪圖或擦除
在這裡插入圖片描述

儲存自定義地圖

首先將Map類所有畫出的座標與圖案進行判斷歸類,分別壓入不同型別的動態陣列內
然後再按動態陣列型別進行儲存
先儲存陣列元素的數量,再儲存陣列內的資料
最後以二進位制的形式寫到檔案
在這裡插入圖片描述

讀取自定義地圖

首先讀出陣列的數量
再接著往後讀取陣列的資料
讀取後存入申請的臨時空間
並將m_data重新賦值
因為讀出來的是上一次字串地址,並不是圖案
根據特定的寫入順序,然後還原特定的圖案重新賦值m_data
在這裡插入圖片描述