c語言版貪吃蛇小游戲

来源:http://www.cnblogs.com/woxinfeixiang2015/archive/2016/09/17/5880107.html
-Advertisement-
Play Games

編譯環境:windows 7 64位 編譯工具:codeblocks 13.12 備註:未使用graphics.h 聲明:個人原創,未經允許,禁止轉載!!! 數據結構:雙向鏈表 1.程式未使用graphis.h中的 函數,所以採用先清屏,再列印的方式顯示圖形,大約每秒刷新一次; 2.除蛇頭元素外,其 ...


編譯環境:windows 7 64位

編譯工具:codeblocks 13.12

備註:未使用graphics.h

聲明:個人原創,未經允許,禁止轉載!!!

 

數據結構:雙向鏈表

1.程式未使用graphis.h中的 函數,所以採用先清屏,再列印的方式顯示圖形,大約每秒刷新一次;

2.除蛇頭元素外,其它元素的狀態(行進方向)均重覆前一元素;

3.蛇的圖形元素為笑臉,可在源碼中更改symbol參數選用不同元素。

 

游戲截圖1                                                                                                                         游戲截圖2

/*********************************
*time:    2016.09.17 22:50
*version:1.0
*********************************/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>

#define UP   0
#define DOWN 1
#define LEFT 2
#define RIGHT 3

#define HIGH  35
#define WIDTH 80   //必須為偶數

int temp[HIGH][WIDTH];//像素數組,用於列印圖形(蛇、食物、空格)

int STATE = LEFT;//初始狀態為向左走

int FOODPOS = 700; //WIDTH*HIGH/2+WIDTH/2-WIDTH*HIGH/4;//食物的初始位置

#define INIT_LEN 1  //初始蛇的長度
int init_pos[INIT_LEN] = {HIGH/2*WIDTH+WIDTH/2};//蛇的初始位置
int SCORE = 0;//得分

//蛇的結構體
struct Item{
    int pos;//位置
    int state;//狀態:上下左右
    struct Item *per, *next;
};

struct Item *head, *tail, *iTemp;

char symbol = 2;//元素符號

//獲取元素的位置
int getPos(int pos, int state){
    if(state == UP)
        pos -= WIDTH;
    else if(state == DOWN)
        pos += WIDTH;
    else if(state == LEFT)
        pos -= 2;
    else if(state == RIGHT)
        pos += 2;
    else
    {
        printf("\n狀態state出錯!");
        exit(-1);
    }
    return pos;
}

//更新蛇的位置與狀態
void change(){
    while(1){
        print();
        iTemp = tail;
        while(iTemp != head){
            iTemp->state = iTemp->per->state;//當前元素的狀態等於其前驅的狀態
            iTemp->pos = getPos(iTemp->pos,iTemp->state);//更新位置信息
            iTemp = iTemp->per;
        }
        head->state = STATE;
        head->pos = getPos(head->pos, head->state);
    }
}

//列印圖形
void print(){
    int h, w;
    for(h = 1; h < HIGH-1; h++)//初始化像素數組
        for(w = 1; w < WIDTH-1; w++)
            temp[h][w] = 0;
    for(w = 0; w < WIDTH; w += 2){//置第0行和最後一行為2
        temp[0][w] = 2;
        temp[HIGH-1][w] = 2;
    }
    for(h = 0; h < HIGH; h++){//置第0列和最後一列為2
        temp[h][0] = 2;
        temp[h][WIDTH-1] = 2;
    }

    iTemp = head->next;
    while(iTemp){
        h = iTemp->pos / WIDTH;
        w = iTemp->pos % WIDTH;
        temp[h][w] = 1;
        iTemp = iTemp->next;
    }

    h = head->pos / WIDTH;
    w = head->pos % WIDTH;
    int i;
    if(temp[h][w] == 2 || temp[h][w] == 1){//撞到牆或自己,游戲結束head->pos < 0 || head->pos > HIGH*WIDTH
        for(i = 0; i < (WIDTH-12)/2; i++)
            printf(" ");
        printf("游戲結束:%d分", SCORE);
        getchar();
        exit(0);
    }
    else
        temp[h][w] = 1;

    temp[FOODPOS/WIDTH][FOODPOS%WIDTH] = 1;
    if(head->pos == FOODPOS){
        //吃食物
        struct Item *new = (struct Item*)malloc(sizeof(struct Item));
        new->next = head;
        head->per = new;
        //head = new;
        new->per = NULL;
        new->pos = getPos(head->pos, head->state);
        new->state = head->state;
        head = new;
        SCORE += 10;

        //產生新食物
        while(temp[FOODPOS/WIDTH][FOODPOS%WIDTH] == 1 || temp[FOODPOS/WIDTH][FOODPOS%WIDTH] == 2 || FOODPOS % 2 ==1){
            FOODPOS = rand() % (HIGH * WIDTH);
        }
        temp[FOODPOS/WIDTH][FOODPOS%WIDTH] = 1;
    }


    //清屏並列印圖形
    system("cls");
    for(h = 0; h < HIGH; h++)
        for(w = 0; w < WIDTH; w++){
            if(temp[h][w] == 0)
                printf(" ");
            else if(temp[h][w] == 1)
                printf("%c", symbol);
            else if(temp[h][w] == 2)
                printf("*");
            else{
                printf("\t\t\t\t\t error!");
                exit(-2);
            }
        }
}

//初始化結構體
void init(){
    int i;

    head = (struct Item*)malloc(sizeof(struct Item));
    head->per = NULL;
    iTemp = head;
    iTemp->pos = init_pos[0];
    iTemp->state = LEFT;

    for(i = 1; i < INIT_LEN; i++){
        iTemp->next = (struct Item*)malloc(sizeof(struct Item));
        iTemp->next->per = iTemp;
        iTemp = iTemp->next;
        iTemp->pos = init_pos[i];
        iTemp->state = LEFT;
    }

    iTemp->next = NULL;
    tail = iTemp;
}

DWORD WINAPI Thread1(LPVOID pM){
    while(1){
        change();
    }
    return 0;
}

DWORD WINAPI Thread2(LPVOID pM){
    char c;
    while(1){
        c = _getch();//控制蛇的行進方向
        if(c == 'a' && STATE != RIGHT)
            STATE = LEFT;
        else if(c == 'd' && STATE != LEFT)
            STATE = RIGHT;
        else if(c == 'w' && STATE != DOWN)
            STATE = UP;
        else if(c == 's' && STATE != UP)
            STATE = DOWN;
        else
            continue;
    }
    return 0;
}

int main(void) {
    system("mode con cols=80 lines=40");//設置視窗大小
    system("color 8f");//設置視窗顏色
    init();

    HANDLE handle1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);//線程1
    HANDLE handle2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);//線程2

    WaitForSingleObject(handle1, INFINITE);
    WaitForSingleObject(handle2, INFINITE);
    return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切麵編程, 實現的是核心業務和非核心業務之間的的分離,讓核心類只做核心業務,代理類只做非核心業務。 ⒉目的: ⑴、把核心業務和非核心業務進行分離 ⑵、把多個非核心業務處理(點)變成一個切麵(之前的非核心業 ...
  • cd命令是linux實際使用當中另一個非常重要的命令,本文就為大家介紹下Linux中cd命令的用法。 更多Linux命令詳情請看:Linux命令速查手冊 Linux cd命令用於切換當前工作目錄至 dirName(目錄參數)。 其中 dirName 表示法可為絕對路徑或相對路徑。若目錄名稱省略,則變 ...
  • 在我們安裝PHP模塊時,有時需要註意PHP編譯的版本,下麵講解下PHP中VC6、VC9、TS、NTS版本的區別與用法詳解,介紹php的兩種執行方式。 1. VC6與VC9的區別:VC6版本是使用Visual Studio 6編譯器編譯的,如果你的PHP是用Apache來架設的,那你就選擇VC6版本。 ...
  • \_\_init\_\_.py 文件的作用是將文件夾變為一個Python模塊,Python 中的每個模塊的包中,都有\_\_init\_\_.py 文件。 通常\_\_init\_\_.py 文件為空,但是我們還可以為它增加其他的功能。我們在導入一個包時,實際上是導入了它的\_\_init\_\_. ...
  • 從php5.0開始增加mysql(i)支持 , 新加的功能都以對象的形式添加 i表示改進的意思 功能多、效率高、穩定 編譯時參數: ./configure --with-mysql=/usr/bin/mysql_config \ #使用 Mysql ClientLibrary(libmysql)構建 ...
  • Awesome系列的Java資源整理。awesome-java 就是akullpp發起維護的Java資源列表,內容包括:構建工具、資料庫、框架、模板、安全、代碼分析、日誌、第三方庫、書籍、Java 站點等等。 業務流程管理套件 流程驅動的軟體系統構建,中間件。 jBPM:非常靈活的業務流程管理框架, ...
  • 類的基本成員才有預設值 finalize()並非析構,Java中沒有析構,使用finalize()通常在於跨語言調用情景:比如使用C進行malloc記憶體分配以後,要在finalize()方法中進行free,以便於提供一種記憶體釋放的方法,否則當量達到一定程度時會造成out of memories。Jv ...
  • 介紹一個生成動態鏈接庫*.so的例子: 首先新建1個頭文件test.h: 然後新建3個源文件first.c/second.c/third.c: first.c: second.c: third.c: 然後,生成動態鏈接庫libtest.so: gcc first.c second.c third.c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...