999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

LINUX系統基于Ncurses圖形庫的C語言貪吃蛇小游戲

2022-06-20 05:12:29孫繼承
現代信息科技 2022年1期

摘? 要:Linux系統不僅免費、開源,而且還安全穩定,通過學習簡單的指令讓程序員更快地入門,讓大家早一點接觸Linux系統,并用C語言進行簡單的貪吃蛇游戲設計。貪吃蛇是許多人小時候的經典回憶,在對貪吃蛇游戲編寫時會涉及地圖,食物,蛇的更新,文章是基于Linux系統通過使用C語言進行蛇游戲的設計與編寫,經過每一個功能的設計與測試一步一步地最終實現游戲呈現的效果。

關鍵詞:Linux系統;C語言;ncurses庫;結構體;線程

中圖分類號:TP311? ? ? ? ? ?文獻標識碼:A文章編號:2096-4706(2022)01-0093-04

Abstract: The Linux system is not only free and open source, but also safe and stable. By learning simple instructions, programmers can get started faster, so that everyone can get in touch with the Linux system earlier, and use C language to design a simple snake game. Snake game is a classic memory of our childhood. When writing the snake game, it will involve the update of maps, food, and snakes. This paper designs and writes the snake game based on the Linux system by using C language. After the design and test of each function step by step, it finally achieves the effect of the game presentation.

Keywords: Linux system; C language; ncurses library; structure; thread

0? 引? 言

現在我們經常會安裝這些游戲:王者榮耀、和平精英、英雄聯盟等等,這些游戲畫面高清,代入感強,受廣大人們的喜愛,但貪吃蛇仍是我們大多數人心中的經典游戲。貪吃蛇游戲出現之后發展迅速,從最初的游戲機到普通手機再到智能機再到電腦;從最初的單機個人游戲,到現在的聯網多人同時游戲。貪吃蛇可以通過設定速度攝取食物讓自己變得更長,通過簡單地操作讓人們獲得滿足感和勝利感。該游戲的優勢是簡單易操作,實現容易。本文基于Linux ncurses庫通過c語言設計和編寫貪吃蛇游戲,以便程序員以后更好地接觸Linux系統并在其中進行開發。

1? 編程語言簡介

1.1? C語言簡介

C語言是一門面向大眾的、過程的、抽象化的通用程序進行設計教學語言,廣泛應用于底層技術開發。C語言可以用一種簡單的方式編譯,處理低級內存。C語言是一種高效的編程語言,它只生成少量的機器語言,并且可以在沒有任何運行環境支持的情況下運行。盡管C語言發展提供了許多低級處理的功能,但仍然保持著跨平臺的特性,以一個國家標準規格寫出的C語言應用程序可在包括企業類似嵌入式處理器技術以及中國超級計算機等作業管理平臺的許多學生計算機網絡平臺上進行編譯,C語言則與面向對象的語言不同,在進行C語言程序設計時,如果開發者沒有一開始就確定好合適的數據類型、結構體、變量等,那么在調試時,查到程序錯誤或者有漏洞,修改起來就會相當困難。

1.2? 設計環境

本程序在vmware虛擬機配置ubuntu鏡像操作系統實現Linux下編程Vim編寫C文件、GCC編譯文件,生成文件后運行。用戶可以自由編輯、編譯、運行和調試程序,該開發工具優勢可以讓程序員熟悉LINUX操作指令,并在其中練習C語言,為以后的開發做下鋪墊。

2? 程序設計

2.1? 程序簡介

貪吃蛇這款游戲玩家用戶從成人到青年,深受大家的喜愛。蛇初始化在一個自己設計的封閉圖形里 ,食物會隨機出現在墻壁內。玩家可以通過按鍵盤上的上下左右(蛇在移動過程中不可以直接更改到相反的方向)來控制蛇頭移動的方向,如果蛇的頭部(蛇的頭部為鏈表的尾部)碰到食物,食物消失,蛇的身體就會在尾部長出一節,然后食物會隨機在地圖內出現,重復以上的過程。如果蛇在運動中碰到邊界或者碰到自己的身體,則游戲結束。

2.2? 設計思路

在設計時,需要用一個圖案來代表蛇的一節身體,作者用“【】”來代表,因為這個圖形移動感強、相似度較高,能給玩家帶來更好的體驗。每當蛇吃掉一個食物時,身體就會自動在尾部增長一節。當蛇移動時必須從蛇頭(在這里作者用鏈表的尾部充當蛇頭,鏈表的頭部充當蛇尾)開始。如果玩家不按下任何方向鍵,蛇就會按照游戲初始方向自動前移。當玩家按下相應的方向鍵時,蛇頭就會朝著方向按鍵所指的方向移動,通過不斷刷新地圖來顯示蛇的移動。而食物我們用“#”來代替,在這里食物的位置我們用rand函數通過計算隨機地出現在地圖當中,確保食物出現的隨機性。

貪吃蛇的游戲過程我們可以分為5個部分。

第一部分:游戲界面初始化地圖,食物,貪吃蛇出現。

第二部分:蛇向游戲初始化設定的方向自動前進。

第三部分:根據玩家的鍵盤指令,蛇向相應的方向前進。

第四部分:判斷蛇是否吃到食物,若吃到食物,蛇在尾部增長一節,食物重新隨機地出現在地圖的內部,若蛇沒有吃到食物則按原長度繼續前進。

第五部分:當蛇撞到地圖邊界或者撞到自身的身體,蛇死亡游戲結束進行第一部分重新開始游戲繼續執行二三四部分,若蛇沒有死亡則繼續執行三四部分直到游戲結束。

2.3? 設計流程圖

游戲的設計流程圖如圖1所示。

程序按照設定初始游戲界面,地圖食物蛇出現,程序不斷捕獲玩家輸入,若為無效輸入,蛇按照原方向正常運行;若為有效輸入,蛇就會朝著按鍵方向正常移動。程序會不斷檢測蛇是否吃到食物,若吃到食物,食物消失,蛇增長;若沒吃到食物,程序繼續判斷。若蛇碰到自身或者邊界則游戲結束重新初始化;若沒有繼續循環以上程序,直到蛇碰到墻壁或自己游戲結束。

3? 算法分析

在這里我們需要用到ncurses庫幫助我們完成從鍵盤獲取輸入的任務,因為C語言函數庫里的函數從鍵盤獲取的響應速度慢,不具有實時性。而我們用ncurses庫則能彌補這一點,當我們按下方向鍵時,程序迅速反應來達到我們控制蛇移動方向的要求。主函數main()首先調用函數initcurses()來實現ncurses庫和獲取鍵盤輸入函數的初始化,然后調用函數InitSnake()來初始化貪吃蛇(程序設定最初的蛇為3個【】),在此函數中調用InitFood()隨機出現食物,調用Addnode()來增加節點。調用函數Initmap()出現地圖,此處我們需要創建兩個線程并在這兩個線程中一個執行Refresh_()函數實現不斷刷新地圖和蛇的移動功能的函數另一個線程執行ChangeDir()函數不斷獲取用戶輸入的按鍵,(在這里我簡單地闡述一下,線程是一種可以多任務共同執行的操作方式,若在這里我們創建一個新的進程去執行這個功能,需要很多的數據去維護它,實在浪費空間,若改為線程則所需的時間和空間遠小于進程并且他們二者在切換時,線程的優勢也體現的較明顯,增強了程序的健壯性和代碼的可移植性而且操作也較為簡單更利于程序員理解和應用)最后執行while()函數保持整個程序地進行。

接下來對各函數進行詳細分析:

(1)主函數main()是程序的主要流程,用來調用各個函數。各函數最終都在主函數中被直接或間接地調用執行來實現游戲的效果。

(2)初始化函數initSnake(),在此函數中我們首先設定了一個游戲的初始方向RIGHT,并在其中調用Initfood()函數來出現食物,并在函數外定義結構體通過結構體指針給蛇最初出現的身體賦值,在調用倆次Addnode()函數增加蛇的節點使蛇初始化長度為3,因為每次蛇死亡都會調用這個函數,為了減少對內存空間的浪費,我們在此函數的最開始把原來制造的內存釋放掉,增強程序的健壯性。此段釋放空間的代碼為:

Structtan*p;

While(head!=NULL){

P=head;

head=head->next;

free(p);

}

(3)繪制地圖函數InitMap(),地圖實際上是一個封閉的正方形用一個嵌套的雙重for循環打印出來的上下邊界我們用-代表,左右邊界用|來代表中間用空格。這樣便形成一個長20寬20的正方形。并在此函數中調用HaveSnake()函數和Havefood()函數,當這兩個函數判斷返回值為1時便打印【】和#來確定蛇和食物在地圖中出現的位置,這兩個函數用我們最初給的起始值與地圖的相應位置進行比較,相同返回1,不同返回0,便能達到我們想要的效果,最后在此函數開頭調用move(0,0)函數調整光標,如果不調用新的地圖將會在光標默認的位置打印,達到不了游戲的效果。

(4)Initcurses()獲取鍵盤輸入和初始化Ncurses庫,此處比較簡單具體實現代碼如下:

Void Initcurses(){

Initscr();

keypad(stdscr,1);//從小鍵盤上獲取方向

noecho();

}

(5)增加節點函數AddNode(),此函數我們在InitSnake()中調用,在這里詳細講解一下,我們用malloc函數給新增的節點開辟空間,因為我們的蛇移動的方向涉及上下左右,這就需要我們在增加節點的時候根據方向的不同來確定,此處我們用switch()函數進行方向的選擇。舉例 當我們按下up鍵時便讓這個新產生的節點行坐標比原來的行坐標減一,列坐標不變。再讓這個頭指針指向這個新的節點,把這個新節點變成尾部,這樣我們便完成了一次移動,其他方向也是如此。

(6)刷新Refresh_()函數,在此函數中我們調用while()函數并在里面不斷執行Movesnake()函數和Initmap()函數和refresh()函數和usleep()函數。通過以上函數的調用我們便能不斷地刷新顯示出蛇的整體運動,并調整地圖更新速度。

(7)刪除蛇節點函數DeleteNode()當蛇沒有吃到食物需要保持原長度進行移動時。我們就需要使頭節點指向下一個節點,釋放當前節點來達到移動的效果。代碼如下:

void DeleteNode()

{

Struct tan *p=head;

Head=head->next;

Free(p);

}

(8)改變方向函數ChangeDir()在這里我們調用while()函數不斷獲取用戶輸入,當我們檢測到用戶輸入時,該值便會在AddNode()函數中被調用來確定用戶輸入的方向從而進行精準走位,因為貪吃蛇的移動方向不能從左邊直接轉到右邊,所以我們需要判斷一下輸入的方向與當前的方向的關系,我們在函數外用define重新定義 DOWN……,把相反的方向設為相反數,當我們從鍵盤輸入時,該值就會傳到turn()函數中進行判斷,若與他自身的相反數不相等,則此值按照輸入方向執行,若相等則按原方向繼續移動,turn()函數中我們把輸入的方向當作參數傳進來,讓參數的相反值與原方向相反值進行比較得出結果。

(9)移動函數MoveSnake()每次調用此函數時節點就會按照方向的輸入增加一個,判斷蛇是否吃到食物,若吃到食物,調用Initfood()函數更新食物,若沒吃到食物則調用DeleteNode()函數刪掉頭節點達到蛇移動的效果。并在此函數中調用SnakeDie()函數判斷蛇是否撞墻或者撞到自身,若撞到則執行InitSnake()函數,否則按照原程序繼續前進。

(10)初始化食物函數Initfood()為了讓食物隨機出現在地圖內我們調用rand()函數給食物的橫,縱坐標賦值并讓其與20取余

這樣就能保證它出現在地圖以內。代碼如下:

void initfood(){

int x=rand()%20;

int y=rand()%20;

food.hang=x;

food.lie=y;

}

在主程序當中我們需要調用線程來實現ChangeDir()和Refresh_()函數,這樣才能保證程序不斷地刷新和獲取地圖的更新,應用線程能降低程序的內存,提高運行效率,給玩家帶來更好的用戶體驗。

4? 程序測試

程序測試的目的是為了檢測程序有無編譯上的漏洞和邏輯上的漏洞。在編寫程序期間,作者每完成一個部分就去編寫運行一下。作者在測試運行時發現,蛇的初始化都已經完成,但當玩家按下方向鍵時,地圖會在原來的地圖下面打印一個新地圖如圖2所示。

經過查找信息發現是光標的問題。找到這個bug后就需要程序員思考如何清除漏洞。這里我們在InitSnake()函數中調用move(0,0)函數并賦值便可幫助我們解決問題。

程序編寫完成,進入最終測試階段。在小鍵盤上按下方向鍵蛇按照鍵入方向改變了原本的線路,并且當蛇向右邊運行時按下左鍵蛇無反應,與我們設定的程序執行效果一樣,說明程序輸入和蛇的移動沒有問題。對于地圖,我們可自行參照根據自身要求來設定。如果發現蛇移動的速度過快或過慢,或者想要改變速度,可以在程序中Refresh()函數中修改usleep()函數的參數。經過最終測試,本程序通過編譯后沒有明顯的漏洞在邏輯上,最終效果如圖3所示,且運行結果與最初預想無較大不同。

5? 結? 論

本文基于Linux系統調用Ncurses庫用C語言和一些簡單的Linux的基礎知識完成了對貪吃蛇游戲的程序設計,算法分析等等。適合于剛學完C語言卻不知如何使用的同學們,并且還能簡單地認識一下Linux系統,每個環節的設計都源于C語言的基礎知識,例如鏈表、封裝函數、循環等等知識點,有利于啟發大家對以后編程的興趣。

參考文獻:

[1] 李雨哲,孫煉.基于C語言的貪吃蛇游戲設計 [J].河南科技,2020(7):31-33.

[2] 張文華,廖俊杰,付乙眉.基于C語言的貪吃蛇游戲的簡單設計與實現 [J].智富時代,2019(3):183.

[3] 王思樂,盧素魁,楊文柱,等.鏈表結構在基于C語言項目中復用方法 [J].電腦編程技巧與維護,2017(20):9-10+13.

[4] 匡泰,時允田.C語言程序設計項目式教程 編程語言 [M].北京:人民郵電出版社,2017.

[5] 周小云.C語言的快樂教學之旅 [J].課程教育研究,2013(2):156.

作者簡介:孫繼承(2000—),男,漢族,內蒙古呼倫貝爾人,本科在讀,研究方向:計算機。

主站蜘蛛池模板: 国产特一级毛片| 在线精品亚洲一区二区古装| 国产噜噜噜视频在线观看| 亚洲黄网视频| 国产丝袜91| 亚洲色图在线观看| 正在播放久久| 一级毛片免费观看久| 3p叠罗汉国产精品久久| 亚洲无码电影| 嫩草国产在线| 无码电影在线观看| 黄色网址手机国内免费在线观看| 日韩精品一区二区深田咏美| 免费A∨中文乱码专区| 亚洲无限乱码一二三四区| 欧美性天天| 91福利在线观看视频| 91精品情国产情侣高潮对白蜜| 国产一级妓女av网站| 狠狠v日韩v欧美v| 亚洲大尺码专区影院| 女人18毛片一级毛片在线 | 啊嗯不日本网站| 亚洲无码高清视频在线观看| 日韩高清无码免费| 欧美 亚洲 日韩 国产| 国产成人精品午夜视频'| 欧美色综合久久| 久久永久视频| 精品少妇三级亚洲| 国产伦精品一区二区三区视频优播| 国产精品性| 欧美午夜网| 亚洲成a人片7777| 欧美亚洲欧美| 九九久久精品免费观看| 国产在线欧美| 久久人与动人物A级毛片| 成人一级黄色毛片| 激情在线网| 免费一级毛片不卡在线播放| 日韩一二三区视频精品| 一本大道东京热无码av | 亚洲区视频在线观看| 中文字幕在线欧美| 香蕉伊思人视频| 国产精品极品美女自在线看免费一区二区 | 999精品在线视频| 制服丝袜 91视频| 天天综合天天综合| 制服丝袜一区| 日韩毛片在线视频| 四虎精品黑人视频| 二级特黄绝大片免费视频大片| 精品夜恋影院亚洲欧洲| 国产精品美女网站| 国产美女91呻吟求| 久久国产精品嫖妓| 一级毛片无毒不卡直接观看 | 亚洲精品欧美日韩在线| 国产丝袜第一页| 露脸国产精品自产在线播| 国产专区综合另类日韩一区| 日韩在线网址| 精品综合久久久久久97超人该| 成人国产精品一级毛片天堂| 国产精品永久不卡免费视频| 不卡的在线视频免费观看| 天天做天天爱天天爽综合区| 亚洲性视频网站| 国产网站黄| 欧美成人国产| 国产精品成人免费视频99| 国产人在线成免费视频| 国产精品大尺度尺度视频| 手机在线看片不卡中文字幕| 女人一级毛片| 日韩在线观看网站| 国产精品专区第一页在线观看| 国产欧美高清| 58av国产精品|