c語言貪吃蛇_C語言貪吃蛇完整代碼

c69297f4f06e2715fe3b8743dce68f7a.png

#include

#include

#include //windows編程頭文件

#include

#include //控制臺輸入輸出頭文件

#ifndef __cplusplus

typedef char bool;

#define false 0

#define true? 1

#endif

//將光標移動到控制臺的(x,y)坐標點處

void gotoxy(int x, int y)

{

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

#define SNAKESIZE 100//蛇的身體最大節數

#define MAPWIDTH 78//寬度

#define MAPHEIGHT 24//高度

//食物的坐標

struct {

int x;

int y;

}food;

//蛇的相關屬性

struct {

int speed;//蛇移動的速度

int len;//蛇的長度

int x[SNAKESIZE];//組成蛇身的每一個小方塊中x的坐標

int y[SNAKESIZE];//組成蛇身的每一個小方塊中y的坐標

}snake;

//繪制游戲邊框

void drawMap();

//隨機生成食物

void createFood();

//按鍵操作

void keyDown();

//蛇的狀態

bool snakeStatus();

//從控制臺移動光標

void gotoxy(int x, int y);

int key = 72;//表示蛇移動的方向,72為按下“↑”所代表的數字

//用來判斷蛇是否吃掉了食物,這一步很重要,涉及到是否會有蛇身移動的效果以及蛇身增長的效果

int changeFlag = 0;

int sorce = 0;//記錄玩家的得分

int i;

void drawMap()

{

//打印上下邊框

for (i = 0; i <= MAPWIDTH; i += 2)//i+=2是因為橫向占用的是兩個位置

{

//將光標移動依次到(i,0)處打印上邊框

gotoxy(i, 0);

printf("■");

//將光標移動依次到(i,MAPHEIGHT)處打印下邊框

gotoxy(i, MAPHEIGHT);

printf("■");

}

//打印左右邊框

for (i = 1; i < MAPHEIGHT; i++)

{

//將光標移動依次到(0,i)處打印左邊框

gotoxy(0, i);

printf("■");

//將光標移動依次到(MAPWIDTH, i)處打印左邊框

gotoxy(MAPWIDTH, i);

printf("■");

}

//隨機生成初試食物

while (1)

{

srand((unsigned int)time(NULL));

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

//生成的食物橫坐標的奇偶必須和初試時蛇頭所在坐標的奇偶一致,因為一個字符占兩個字節位置,若不一致

//會導致吃食物的時候只吃到一半

if (food.x % 2 == 0)

break;

}

//將光標移到食物的坐標處打印食物

gotoxy(food.x, food.y);

printf("*");

//初始化蛇的屬性

snake.len = 3;

snake.speed = 200;

//在屏幕中間生成蛇頭

snake.x[0] = MAPWIDTH / 2 + 1;//x坐標為偶數

snake.y[0] = MAPHEIGHT / 2;

//打印蛇頭

gotoxy(snake.x[0], snake.y[0]);

printf("■");

//生成初試的蛇身

for (i = 1; i < snake.len; i++)

{

//蛇身的打印,縱坐標不變,橫坐標為上一節蛇身的坐標值+2

snake.x[i] = snake.x[i - 1] + 2;

snake.y[i] = snake.y[i - 1];

gotoxy(snake.x[i], snake.y[i]);

printf("■");

}

//打印完蛇身后將光標移到屏幕最上方,避免光標在蛇身處一直閃爍

gotoxy(MAPWIDTH - 2, 0);

return;

}

void keyDown()

{

int pre_key = key;//記錄前一個按鍵的方向

if (_kbhit())//如果用戶按下了鍵盤中的某個鍵

{

fflush(stdin);//清空緩沖區的字符

//getch()讀取方向鍵的時候,會返回兩次,第一次調用返回0或者224,第二次調用返回的才是實際值

key = _getch();//第一次調用返回的不是實際值

key = _getch();//第二次調用返回實際值

}

/*

*蛇移動時候先擦去蛇尾的一節

*changeFlag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造一個移動的效果

*為1表明吃到了食物,就不需要擦除蛇尾,以此營造一個蛇身增長的效果

*/

if (changeFlag == 0)

{

gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);

printf("? ");//在蛇尾處輸出空格即擦去蛇尾

}

//將蛇的每一節依次向前移動一節(蛇頭除外)

for (i = snake.len - 1; i > 0; i--)

{

snake.x[i] = snake.x[i - 1];

snake.y[i] = snake.y[i - 1];

}

//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走

//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向

if (pre_key == 72 && key == 80)

key = 72;

if (pre_key == 80 && key == 72)

key = 80;

if (pre_key == 75 && key == 77)

key = 75;

if (pre_key == 77 && key == 75)

key = 77;

/**

*控制臺按鍵所代表的數字

*“↑”:72

*“↓”:80

*“←”:75

*“→”:77

*/

//判斷蛇頭應該往哪個方向移動

switch (key)

{

case 75:

snake.x[0] -= 2;//往左

break;

case 77:

snake.x[0] += 2;//往右

break;

case 72:

snake.y[0]--;//往上

break;

case 80:

snake.y[0]++;//往下

break;

}

//打印出蛇頭

gotoxy(snake.x[0], snake.y[0]);

printf("■");

gotoxy(MAPWIDTH - 2, 0);

//由于目前沒有吃到食物,changFlag值為0

changeFlag = 0;

return;

}

void createFood()

{

if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇頭碰到食物

{

//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物

while (1)

{

int flag = 1;

srand((unsigned int)time(NULL));

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

//隨機生成的食物不能在蛇的身體上

for (i = 0; i < snake.len; i++)

{

if (snake.x[i] == food.x && snake.y[i] == food.y)

{

flag = 0;

break;

}

}

//隨機生成的食物不能橫坐標為奇數,也不能在蛇身,否則重新生成

if (flag && food.x % 2 == 0)

break;

}

//繪制食物

gotoxy(food.x, food.y);

printf("*");

snake.len++;//吃到食物,蛇身長度加1

sorce += 10;//每個食物得10分

snake.speed -= 5;//隨著吃的食物越來越多,速度會越來越快

changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果

}

return;

}

bool snakeStatus()

{

//蛇頭碰到上下邊界,游戲結束

if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)

return false;

//蛇頭碰到左右邊界,游戲結束

if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)

return false;

//蛇頭碰到蛇身,游戲結束

for (i = 1; i < snake.len; i++)

{

if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])

return false;

}

return true;

}

int main()

{

drawMap();

while (1)

{

keyDown();

if (!snakeStatus())

break;

createFood();

Sleep(snake.speed);

}

gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);

printf("Game Over!\n");

gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);

printf("本次游戲得分為:%d\n", sorce);

Sleep(5000);

return 0;

}

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

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

相關文章

上海市計算機一級客觀題,2012年上海市高校計算機等級考試(一級)模擬卷客觀題...

2012年上海市高校計算機等級考試(一級)模擬卷客觀題 (5頁)本資源提供全文預覽&#xff0c;點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧&#xff0c;查找使用更方便哦&#xff01;11.9 積分關于防火墻&#xff0c;以下說法不正確的是____A____。下列屬于視頻制作的常用軟件的…

百度云盤云知夢php_教你搭建私有云盤,簡單快速,完全傻瓜式!不限速,永久有效!...

免費的云盤服務有很多&#xff0c;但是總感覺把重要文件存在上面不安全&#xff0c;動不動就跑路或者限速。辛辛苦苦收集的學習資料&#xff0c;一夜直接可能就會付諸東流。最穩妥的方式是存放在本地硬盤中&#xff0c;但是要進行共享或者不同設備之間進行交換&#xff0c;就顯…

結束 txt進程_Python多進程抓取拉鉤網十萬數據

轉載&#xff1a;Python多進程抓取拉鉤網十萬數據準備安裝Mongodb數據庫其實不是一定要使用MongoDB&#xff0c;大家完全可以使用MySQL或者Redis&#xff0c;全看大家喜好。這篇文章我們的例子是Mongodb&#xff0c;所以大家需要下載它。在Windows中。由于MongoDB默認的數據目錄…

計算機休眠怎么喚醒,電腦休眠后,就無法喚醒了?怎么辦?快速教你解決這個問題...

電腦是目前人們生活、工作中使用最多的電子產品之一&#xff0c;我們都經常會使用到電腦。但是如果電腦在一段時間后不使用&#xff0c;電腦就會自動進入休眠狀態&#xff0c;而在進入休眠狀態的之后&#xff0c;只有當我們將電腦喚醒了&#xff0c;電腦才能夠回到菜單界面當中…

python爬蟲爬取音樂單曲_Python爬取qq音樂的過程實例

一、前言qq music上的音樂還是不少的&#xff0c;有些時候想要下載好聽的音樂&#xff0c;但有每次在網頁下載都是煩人的登錄什么的。于是&#xff0c;來了個qqmusic的爬蟲。至少我覺得for循環爬蟲&#xff0c;最核心的應該就是找到待爬元素所在url吧。二、Python爬取QQ音樂單曲…

python按照日期篩選數據_日期時間范圍上的Python篩選器?

我有一些包含開始時間和結束時間的數據&#xff08;datetime格式&#xff09;&#xff0c;我想根據更受限制的日期范圍計算持續時間&#xff08;以小時為單位&#xff09;。但到目前為止&#xff0c;我還沒有成功。&#xff08;對python還是個業余愛好者。&#xff09; 示例&am…

計算機2級u盤作弊,一種帶LED指示燈的計算機考試防U盤作弊裝置制造方法及圖紙...

【技術實現步驟摘要】一種帶LED指示燈的計算機考試防U盤作弊裝置本申請是申請日為2016年4月1日&#xff0c;申請號為2016102009851&#xff0c;專利技術名稱為“一種防U盤舞弊的計算機考試裝置”的專利技術專利的分案申請。本專利技術涉及一種防止計算機考試抄襲作弊的裝置&…

python類定義的講解_python面向對象、自定義類等使用實例講解

python 面向對象相對別的語言來說缺少兩個功能&#xff1a; 1、python不具備重載&#xff0c;重載是指在同一個類中&#xff0c;使得方法有相同的名稱&#xff0c;但是有不同的參數列表&#xff0c;但由于python函數具有強大的參數處理功能&#xff0c;因此這不是一個問題。 2、…

ubutun 更換網絡源_「ubuntu腳本1」開啟ssh替換第三方源開啟tab鍵補齊屏蔽nouveau

Ubuntu初始化腳本,安裝顯卡驅動專用初始化腳本替換apt源為國內清華源,增加docker-ce國內源開啟tab鍵補齊桌面版開啟ssh僅支持Ubuntu16/18桌面版安裝gcc make屏蔽nouveau 自動重啟服務器生效#!/bin/bash #檢測網絡是否通暢 ping -w 5 qq.com || { echo "網絡異常,腳本終止&…

地理信息系統軟件測試培訓,地理信息系統軟件測試方法技術方案

本發明專利技術涉及一種軟件測試方法。更具體地說&#xff0c;本發明專利技術涉及一種地理信息系統軟件測試方法&#xff0c;包括&#xff1a;編寫測試用例文檔并腳本化形成測試腳本&#xff1b;結合路徑分析方法設置測試用例&#xff0c;按照測試用例配套至少一組測試原始數據…

matlab meshgrid函數_matlab入門(三)圖像可視化

matlab圖像可視化基本要求(1)掌握圖形窗口的創建與控制&#xff0c;以及圖形窗口的基本操作&#xff1b;(2)熟練掌握二維和三維繪圖基本的命令、線型控制&#xff1b;(3)初步掌握用特殊的圖形來表現特殊數據的性質&#xff0c;如面積圖、直方 圖、餅圖等。(4)掌握坐標軸的控制和…

hashmap remove 沒釋放內存_java從零開始手寫 redis(13)HashMap 源碼原理詳解

為什么學習 HashMap 源碼&#xff1f;作為一名 java 開發&#xff0c;基本上最常用的數據結構就是 HashMap 和 List&#xff0c;jdk 的 HashMap 設計還是非常值得深入學習的。無論是在面試還是工作中&#xff0c;知道原理都對會我們有很大的幫助。本篇的內容較長&#xff0c;建…

南京高中計算機老師,南京市教育局召開中小學教師信息技術應用能力提升工程2.0市級專家組工作會議...

2021年3月2日上午&#xff0c;南京市中小學教師信息技術應用能力提升工程2.0市級專家組工作會議在雨花臺區教師發展中心召開。市教育局副局長祁壽東出席會議并講話&#xff0c;市教研室、教科所、電教館、教師發展學院主要負責同志&#xff0c;市級專家團隊成員及各區教師發展中…

python計算執行時間的函數_[python] 統計函數運行時間

第一種&#xff1a; import time def time_me(fn): #fn 是要修飾/修改 的函數 def _wrapper(*args, **kwargs): #這個 _wrapper(*args, **kwargs) 則代指fn, *args 代表一般變量參數&#xff0c; **kwargs代表 字典&#xff0c;哈希等參數 start time.perf_counter() fn(*args…

arthas 排查內存溢出_Java 應用線上問題排查思路、常用工具小結

前言本文總結了一些常見的線上應急現象和對應排查步驟和工具。分享的主要目的是想讓對線上問題接觸少的同學有個預先認知&#xff0c;免得在遇到實際問題時手忙腳亂。畢竟作者自己也是從手忙腳亂時走過來的。只不過這里先提示一下。在線上應急過程中要記住&#xff0c;只有一個…

計算機個性化定制服務課題,服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文.docx...

服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文Classified Index: TP315 U.D.C: 681.3Dissertation for the Master’s Degree in EngineeringSERVICE NETWORK CONSTRUCTION AND DYNAMIC CUSTOMIZATION METHOD FOR SUBJECTIVE CHANGES OF CUSTOMER RE…

flutter listview 滾動到指定位置_Flutter 布局原理及實戰

1. Flutter UI架構Flutter將視圖數據抽象成為三個部分&#xff0c;即Widget樹、Element樹和RenderObject樹。Widget樹&#xff1a;控件的配置信息&#xff0c;不涉及渲染&#xff0c;更新代價極低。RenderObject樹&#xff1a;真正的UI渲染樹&#xff0c;負責渲染UI&#xff0c…

計算機的屏幕約是16平方分米嗎,小明的臥室有16平方分米對不對

小明的臥室有16平方分米對不對不對&#xff0c;應該是16平方米不對錯! 16平方分米太小了不對&#xff0c;那么小怎么可能住人。不正確應該是16平方米xiao ming de wo shi you 1 6 ping fang fen mi dui bu dui32平方分米涂上每平方分米的96克油漆,需要幾克32平方分米需要油漆30…

python引用傳遞_python 是值傳遞還是引用傳遞 知乎

展開全部 那要看數據類型了&#xff0c;21135261int&#xff0c;float&#xff0c;str這種就是傳值&#xff0c;list&#xff0c;dict&#xff0c;類的實例&#xff0c;自定義對象都是穿4102引用。 下面1653是示例代碼&#xff1a;def change(int1,float1,str1,dict1,obj1,list…

雷神開機logo更改_國產外星人雷神再發新品 911MT逐影者RTX2060光追游戲本評測

隨著NVIDIA發布了筆記本20系顯卡之后&#xff0c;宣示著全民進入了“RTX光線追蹤時代”&#xff0c;各種新款的游戲也紛紛宣布支持“光線追蹤”技術來吸引更多的玩家&#xff0c;似乎現在游戲本上沒有個“RTX”貼紙就已經不好意思跟別人打招呼了。說到2019年的RTX新品&#xff…