c語言第一個小游戲:貪吃蛇小游戲03

我們為貪吃蛇的節點設置為一個結構體,構成貪吃蛇的身子的話我們使用鏈表,鏈表的每一個節點是一個結構體

顯示貪吃蛇身子的一個節點

我們這邊node就表示一個蛇的身體? 就是一小節

輸出結果如下

顯示貪吃蛇完整身子

效果如下

代碼實現

????????這個hasSnakeNode(hang,lie)這個函數就是來判斷當前這個坐標是否為蛇的身子的坐標,坐標帶進去,如果符合return 1;那么返回1 到地圖這里? ?1? 的話就是ture 使hasSnakeNode這個函數生效,然后打印[ ]蛇身。那么函數封裝的好處就是在于我們可以進行多個節點的判斷

????????宏觀的看,每個坐標都會進入到hasSnakeNode(hang,lie)進行判斷,如果行列坐標等于蛇身子的行列坐標,那么就返回1? ? ? ? 我們會去想p的下一項是哪里操作的 請看main函數node1.next=&next2,這個是關鍵,才能遍歷鏈表,暫時是靜態的寫鏈表,下一次我們用動態添加的方法進行添加節點

代碼

#include <curses.h>

struct snack{

????????int hang;

????????int lie;

????????struct snack *next;

};

struct snack node1 = {2,2,NULL};

struct snack node2 = {2,3,NULL};

struct snack node3 = {2,4,NULL};

void initgame()

{

????????initscr();

????????keypad(stdscr,1);

}

int ?hasSnackNode(int i,int j)

{

????????struct snack *p;

????????p = &node1;

????????while(p != NULL){

????????????????if(p->hang==i && p->lie==j){

????????????????????????return 1;

????????????????}

????????????????p=p->next;

????????}

????????return 0;

}

void gamepic()

{

????????int hang;

????????int lie;

????????for(hang=0;hang<20;hang++){

????????????????if(hang == 0){

????????????????????????for(lie=0;lie<20;lie++){

????????????????????????????????printw("--");

?}

?????????????????printw("\n");

????????????????}

????????????????if(hang>=0 && hang<=19){

????????????????????????for(lie=0;lie<=20;lie++){

?????????????????????????????????if(lie==0||lie==20){

?????????????????????????????????????????printw("|");

?????????????????????????????????}else if(hasSnackNode(hang,lie)){

????????????????????????????????????????printw("[]");

?????????????????????????????????}

?????????????????????????????????else{

?????????????????????????????????????????printw(" ?");

?????????????????????????????????}

????????????????????????}

????????????????????????printw("\n");

????????????????}

????????????????if(hang == 19){

????????????????????????for(lie=0;lie<20;lie++){

?????????????????????????????????printw("--");

????????????????????????}

????????????????????????printw("\n");

????????????????}

??????????}

??????????printw("by shijintao");

???}

int main()

{

initgame();

????????????????node1.next = &node2;

????????????????node2.next = &node3;

????????????????gamepic();

????????????????getch();

????????????????endwin();

????????????????return 0;

}

但是這個太土了我們要進行優化

我們用封裝函數的方法

顯示貪吃蛇完整身子

優化代碼

#include <curses.h>

#include <stdlib.h>

struct snake{

????????int hang;

????????int lie;

????????struct snake *next;

};

struct snake *head;//全局變量

struct snake *tail;//全局變量

void initgame()

{

????????initscr();

????????keypad(stdscr,1);

}

int ?hasSnakeNode(int i,int j)

{

????????struct snake *p;

????????p = head; //現在頭節點是head? 不是node1了? 而且這個head是通過initSnake影響的,因為head是全局變量,所以可以使用head

????????while(p != NULL){

????????????????if(p->hang==i && p->lie==j){

????????????????????????return 1;

????????????????}

????????????????p=p->next;

????????}

????????return 0;

}

void gamepic()

{

????????int hang;

????????int lie;

????????for(hang=0;hang<20;hang++){

????????????????if(hang == 0){

????????????????????????for(lie=0;lie<20;lie++){

????????????????????????????????printw("--");

????????????????????????}

printw("\n");

????????????????}

????????????????if(hang>=0 && hang<=19){

????????????????????????for(lie=0;lie<=20;lie++){

?????????????????????????????????if(lie==0||lie==20){

?????????????????????????????????????????printw("|");

?????????????????????????????????}else if(hasSnakeNode(hang,lie)){

????????????????????????????????????????printw("[]");

?????????????????????????????????}

?????????????????????????????????else{

?????????????????????????????????????????printw(" ?");

?????????????????????????????????}

????????????????????????}

????????????????????????printw("\n");

????????????????}

????????????????if(hang == 19){

????????????????????????for(lie=0;lie<20;lie++){

?????????????????????????????????printw("--");

????????????????????????}

????????????????????????printw("\n");

????????????????}

??????????}

??????????printw("by shijintao");

???}

void addNode()

{

????????struct snake *new;

????????new =(struct snake *)malloc(sizeof(struct snake));

????????new->hang=tail->hang; //最先開始tail的值等于head

????????new->lie=tail->lie+1;

????????tail->next = new;

????????tail = new;//每次改變tail的值

????????new->next = NULL;

}

void ?initSnake()

{

????????head = (struct snake *)malloc(sizeof(struct snake));

????????head->hang=2;

????????head->lie=2;

????????head->next=NULL;

????????tail = head;

????????addNode();

}

int main()

{

????????????????initgame();

????????????????initSnake();

????????????????gamepic();

????????????????getch();

????????????????endwin();

????????????????return 0;

}

代碼優化的點:

將原先死板添加的,變成動態的添加節點,并進行封裝,減少代碼冗余

void ?initSnake()

{

????????head = (struct snake *)malloc(sizeof(struct snake));? ??

????????head->hang=2;//這些都是設置初始值

????????head->lie=2;

????????head->next=NULL;

????????tail = head;//蛇的初始狀態頭節點也是尾節點

????????addNode(); //如果你不加這個的話? 蛇的身子就只有一個,我覺得加一個也就是比較好看

}

void addNode()

{

????????struct snake *new;

????????new =(struct snake *)malloc(sizeof(struct snake));

????????new->hang=tail->hang;?//這個只是單純的向右邊加入,不考慮方向,以后回頭來看不要被誤導

????????new->lie=tail->lie+1;

????????tail->next = new;

????????tail = new;//可以這樣想每次新節點插入后這個tail的值(行和列)都會回到最上方全局變量的地方然后,tail的值是不會被刷新的,是一直被影響的,被上一個節點影響,隨后保存信息,因為他是全局變量

????????new->next = NULL;

}

initSnake()這個函數直接就是把蛇的頭節點,也就是蛇的初始位置,hang、lie 都默認的設置好,就像我們玩貪吃蛇初始有個蛇停在那邊,這個函數就是這個作用。

這兩個函數搭配使用組成了蛇的身子,我們都說用動態創建鏈表要用到指針,且鏈表都是有頭節點和尾節點,為了不容易出現錯誤 我們將頭指針和尾指針設置為全局變量。

頭節點是指針,我們需要為指針賦予一個內存空間,因為后面我們需要在尾點后方插入新的節點,那么我們需要將新節點每次開辟一個空間。

最先開始尾節點就是頭節點

addNode是添加新節點到尾節點后邊

我們將添加新節點,還有初始化貪吃蛇的行列,封裝成了函數,直接調用函數即可在尾部添加新節點

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79604.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

架構思維:通用架構模式_系統監控的設計

文章目錄 引言什么是監控三大常見監控類型1. 次數監控2. 性能監控3. 可用率監控 落地監控1. 服務入口2. 服務內部3. 服務依賴 監控時間間隔的取舍小結 引言 架構思維&#xff1a;通用架構模式_從設計到代碼構建穩如磐石的系統 架構思維&#xff1a;通用架構模式_穩如老狗的SDK…

精益數據分析(46/126):深入剖析用戶生成內容(UGC)商業模式

精益數據分析&#xff08;46/126&#xff09;&#xff1a;深入剖析用戶生成內容&#xff08;UGC&#xff09;商業模式 在創業與數據分析的征程中&#xff0c;每一種商業模式都蘊含著獨特的價值與挑戰。今天&#xff0c;我們依舊懷揣著共同進步的信念&#xff0c;深入研讀《精益…

QMK鍵盤固件中LED鎖定指示燈的配置與使用詳解(實操部分+拓展)

QMK鍵盤固件中LED鎖定指示燈的配置與使用詳解 大家好!今天就跟大家一起探索QMK固件中LED鎖定指示燈的配置與使用。無論你是鍵盤DIY新手還是老司機,相信這篇教程都能幫你解鎖新技能! 一、基礎配置:定義LED引腳 在QMK固件中配置LED鎖定指示燈非常簡單,只需在config.h文件…

CVE體系若消亡將如何影響網絡安全防御格局

CVE體系的核心價值與當前危機 由MITRE運營的通用漏洞披露&#xff08;CVE&#xff09;項目的重要性不容低估。25年來&#xff0c;它始終是網絡安全專業人員理解和緩解安全漏洞的基準參照系。通過提供標準化的漏洞命名與分類方法&#xff0c;這套體系為防御者建立了理解、優先級…

一周學完計算機網絡之三:1、數據鏈路層概述

簡單的概述 數據鏈路層是計算機網絡體系結構中的第二層&#xff0c;它在物理層提供的基本服務基礎上&#xff0c;負責將數據從一個節點可靠地傳輸到相鄰節點。可以將其想象成一個負責在兩個相鄰的網絡設備之間進行數據 “搬運” 和 “整理” 的 “快遞中轉站”。 幾個重要概念…

?WordToCard使用分享?

https://www.wordtocard.com 家人們&#xff0c;今天發現了一個超好用的工具——WordToCard&#xff01;&#x1f61c; 它可以把WordToCard文檔轉換成漂亮的知識卡片&#xff0c;學習筆記、知識整理和內容分享都變得超輕松&#xff5e;&#x1f917; 支持各種WordToCard語法…

擴展:React 項目執行 yarn eject 后的 package.json 變化詳解及參數解析

擴展&#xff1a;React 項目執行 yarn eject 后的 package.json 變化詳解及參數解析 什么是 yarn eject&#xff1f;React 項目執行 yarn eject 后的 package.json 變化詳解1. 腳本部分 Scripts 被替換2. 新增構建依賴 dependencies&#xff08;部分&#xff09;3. 新增 Babel …

[Java實戰]Spring Boot 整合 Redis(十八)

[Java實戰]Spring Boot 整合 Redis&#xff08;十八&#xff09; 在現代的分布式應用開發中&#xff0c;Redis 作為一種高性能的鍵值存儲數據庫&#xff0c;被廣泛用于緩存、消息隊列、排行榜等多種場景。Spring Boot 提供了強大的支持&#xff0c;使得整合 Redis 變得非常簡單…

【氮化鎵】GaN在不同電子能量損失的SHI輻射下的損傷

該文的主要發現和結論如下: GaN的再結晶特性 :GaN在離子撞擊區域具有較高的再結晶傾向,這導致其形成永久損傷的閾值較高。在所有研究的電子能量損失 regime 下,GaN都表現出這種傾向,但在電子能量損失增加時,其效率會降低,尤其是在材料發生解離并形成N?氣泡時。 能量損失…

R語言實戰第5章(1)

第一部分&#xff1a;數學、統計和字符處理函數 數學和統計函數&#xff1a;R提供了豐富的數學和統計函數&#xff0c;用于執行各種計算和分析。這些函數可以幫助用戶快速完成復雜的數學運算、統計分析等任務&#xff0c;例如計算均值、方差、相關系數、進行假設檢驗等。字符處…

k8s術語之Horizontal Pod Autoscaling

應用的資源使用率通常都有高峰和低谷的時候&#xff0c;如何削峰填谷&#xff0c;提高整體的整體資源利用率&#xff0c;讓service中的Pod個數自動調整呢&#xff1f;Horizontal Pod Autoscaling:使pod水平自動縮放。這個Object也是最能體現kubernetes之于傳統運維價值的地方&a…

Linux復習筆記(三) 網絡服務配置(web)

遇到的問題&#xff0c;都有解決方案&#xff0c;希望我的博客能為你提供一點幫助。 二、網絡服務配置 2.3 web服務配置 2.3.1通信基礎&#xff1a;HTTP協議與C/S架構&#xff08;了解&#xff09; ??HTTP協議的核心作用?? Web服務基于HTTP/HTTPS協議實現客戶端&#xff…

9.1.領域驅動設計

目錄 一、領域驅動設計核心哲學 戰略設計與戰術設計的分野 ? 戰略設計&#xff1a;限界上下文&#xff08;Bounded Context&#xff09;與上下文映射&#xff08;Context Mapping&#xff09; ? 戰術設計&#xff1a;實體、值對象、聚合根、領域服務的構建原則 統一語言&am…

CSS Layer 詳解

CSS Layer 詳解 前言 最近在整理CSS知識體系時&#xff0c;發現Layer這個特性特別有意思。它就像是給樣式規則提供了一個專屬的「VIP通道」&#xff0c;讓我們能更優雅地解決樣式沖突問題。今天我就用最通俗的語言&#xff0c;帶大家全面了解這個CSS新特性。 什么是CSS Laye…

【Dv3Admin】工具視圖配置文件解析

在開發后臺管理系統時,處理復雜的 CRUD 操作是常見的需求。Django Rest Framework(DRF)通過 ModelViewSet 提供了基礎的增刪改查功能,但在實際應用中,往往需要擴展更多的功能,如批量操作、權限控制、查詢優化等。dvadmin/utils/viewset.py 模塊通過繼承并擴展 ModelViewS…

?云原生CAE軟件

?云原生CAE軟件?是一種在設計和實現時就充分考慮了云環境特點的軟件&#xff0c;能夠充分利用云資源&#xff0c;實現高效、可擴展和靈活的仿真分析。 定義和特點 云原生CAE軟件是一種在云端構建和運行的CAE&#xff08;Computer Aided Engineering&#xff0c;計算機輔助工…

若依定制pdf生成實戰

一、介紹 使用 Java Apache POI 將文字渲染到 Word 模板是一種常見的文檔自動化技術&#xff0c;廣泛應用于批量生成或定制 Word 文檔的場景。使用aspose可以將word轉成pdf從而達到定制化pdf的目的。 參考文檔&#xff1a;java實現Word轉Pdf&#xff08;Windows、Linux通用&a…

Redis再次開源!reids8.0.0一鍵安裝腳本分享

準備工作 1. 下載 Redis 8 安裝包 # Redis 8.0.0 示例&#xff08;請替換為實際版本&#xff09; http://download.redis.io/releases/redis-8.0.0.tar.gz一、腳本內容&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*-import os import time import shutil import s…

stm32之BKP備份寄存器和RTC時鐘

目錄 1.時間戳1.1 Unix時間戳1.2 UTC/GMT1.3 時間戳轉換**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…

Android學習總結之算法篇八(二叉樹和數組)

路徑總和 import java.util.ArrayList; import java.util.List;// 定義二叉樹節點類 class TreeNode {int val;TreeNode left;TreeNode right;// 構造函數&#xff0c;用于初始化節點值TreeNode(int x) {val x;} }public class PathSumProblems {// 路徑總和 I&#xff1a;判…