www.tjgcgs88.cn-狠狠久久亚洲欧美专区不卡,久久精品国产99久久无毒不卡,噼里啪啦国语版在线观看,zσzσzσ女人极品另类

  • <strike id="qgi8o"><td id="qgi8o"></td></strike>
  • <ul id="qgi8o"><acronym id="qgi8o"></acronym></ul>
  • <li id="qgi8o"></li>
    <ul id="qgi8o"></ul>
    <strike id="qgi8o"><rt id="qgi8o"></rt></strike>
    <ul id="qgi8o"><center id="qgi8o"></center></ul>
  • <kbd id="qgi8o"></kbd>

    c語(yǔ)言 貪吃蛇 程序 C語(yǔ)言的貪吃蛇源代碼

    基本思路: 

    蛇每吃一個(gè)食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇頭的運(yùn)動(dòng),而蛇身子跟著蛇頭走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此類(lèi)推。

    #include <stdio.h>

    #include <conio.h>

    #include <windows.h>

    #define BEG_X 2

    #define BEG_Y 1

    #define WID 20

    #define HEI 20

    HANDLE hout;

    typedef enum {UP, DOWN, LEFT, RIGHT} DIR;

    typedef struct Snake_body

    {

    COORD pos;//蛇身的位置

    struct Snake_body *next;//下一個(gè)蛇身

    struct Snake_body *prev;//前一個(gè)蛇身

    }SNAKE, *PSNAKE;

    PSNAKE head = NULL;//蛇頭

    PSNAKE tail = NULL;//蛇尾

    //畫(huà)游戲邊框的函數(shù)

    void DrawBorder()

    {

    int i, j;

    COORD pos = {BEG_X, BEG_Y};

    for(i = 0; i < HEI; ++i)

    {

    SetConsoleCursorPosition(hout, pos);

    for(j = 0; j < WID; ++j)

    {

    if(i == 0)//第一行

    {

    if(j == 0)

    printf("┏");

    else if(j == WID - 1)

    printf("┓");

    else

    printf("━");

    }

    else if(i == HEI - 1)//最后一行

    {

    if(j == 0)

    printf("┗");

    else if(j == WID - 1)

    printf("┛");

    else

    printf("━");

    }

    else if(j == 0 || j == WID - 1)//第一列或最后一列

    printf("┃");

    else

    printf("  ");

    }

    ++pos.Y;

    }

    }

    //添加蛇身的函數(shù)

    void AddBody(COORD pos)

    {

    PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));

    pnew->pos = pos;

    if(!head)

    {

    head = tail = pnew;

    }

    else

    {

    pnew->next = head;//新創(chuàng)建蛇身的next指向原先的蛇頭

    head->prev = pnew;//原先的蛇頭的prev指向新創(chuàng)建的蛇身

    head = pnew;//把新創(chuàng)建的蛇身作為新的蛇頭

    }

    SetConsoleCursorPosition(hout, head->pos);

    printf("◎");

    }

    //蛇身移動(dòng)的函數(shù)

    void MoveBody(DIR dir)

    {

    PSNAKE ptmp;

    COORD pos = head->pos;

    switch(dir)

    {

    case UP:

    if(head->pos.Y > BEG_Y + 1)

    --pos.Y;

    else

    return;

    break;

    case DOWN:

    if(head->pos.Y < BEG_Y + HEI - 2)

    ++pos.Y;

    else

    return;

    break;

    case LEFT:

    if(head->pos.X > BEG_X + 2)

    pos.X -= 2;

    else

    return;

    break;

    case RIGHT:

    if(head->pos.X < BEG_X + (WID - 2) * 2)

    pos.X += 2;

    else 

    return;

    break;

    }

    AddBody(pos);//添加了一個(gè)新的蛇頭

    ptmp = tail;//保存當(dāng)前的蛇尾

    tail = tail->prev;

    if(tail)

    tail->next = NULL;

    SetConsoleCursorPosition(hout, ptmp->pos);

    printf("  ");

    free(ptmp);

    }

    int main()

    {

    int ctrl;

    DIR dir = RIGHT;//初始蛇的方向是向右的

    COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};

    system("color 0E");

    system("mode con cols=90 lines=30");

    hout = GetStdHandle(STD_OUTPUT_HANDLE);

    printf("    ------------貪吃蛇的移動(dòng)------------");

    DrawBorder();

    //自定義幾個(gè)蛇的身體

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    pos.X += 2;

    AddBody(pos);

    //控制蛇的移動(dòng)

    while(ctrl = getch())

    {

    switch(ctrl)

    {

    case 'w':

    if(dir == DOWN)

    continue;

    dir = UP;

    break;

    case 's':

    if(dir == UP)

    continue;

    dir = DOWN;

    break;

    case 'a':

    if(dir == RIGHT)

    continue;

    dir = LEFT;

    break;

    case 'd':

    if(dir == LEFT)

    continue;

    dir = RIGHT;

    break;

    case 'q':

    return 0;

    }

    MoveBody(dir);

    }

    return 0;

    }

    擴(kuò)展資料:

    實(shí)現(xiàn)邏輯

    1,可以設(shè)置光標(biāo),就能實(shí)現(xiàn)制定位置打印制定符號(hào)。

    2,涉及一個(gè)結(jié)構(gòu)體,包含兩個(gè)元素坐標(biāo)元素和一個(gè)結(jié)構(gòu)體指針。

    3,結(jié)構(gòu)體串聯(lián)形成鏈表,遍歷獲取成員坐標(biāo),打印符號(hào)得到蛇身。

    4,不斷的加頭,去尾,重新遍歷坐標(biāo),再打印形成蛇的移動(dòng)。

    5,食物產(chǎn)生的位置判定,不能越界,也不能與蛇身體重合。

    6,蛇的轉(zhuǎn)向判定,一條規(guī)則,不允許倒退。

    7,轉(zhuǎn)向的實(shí)現(xiàn),跟行進(jìn)方向決定新的關(guān)節(jié)坐標(biāo)(當(dāng)前頭的上下左右)

    8,死亡檢測(cè),是否頭節(jié)點(diǎn)坐標(biāo)是否與墻壁重合,是否與身體其他關(guān)節(jié)重合。

    9,加速減速,設(shè)置刷新休眠時(shí)間實(shí)現(xiàn)。

    參考資料來(lái)源:百度百科-C語(yǔ)言



    代碼示例如下:

    使用了4個(gè)自定義函數(shù)來(lái)實(shí)現(xiàn)

    #include <stdio.h>

    #include <stdlib.h>

    #include <conio.h>

    #include <windows.h>

    #define High 20  // 游戲畫(huà)面尺寸

    #define Width 30

    // 全局變量

    int moveDirection; // 小蛇移動(dòng)位置,上下左右分別用1,2,3,4表示

    int food_x,food_y; // 食物的位置

    int canvas[High][Width] = {0}; // 二維數(shù)組存儲(chǔ)游戲畫(huà)布中對(duì)應(yīng)的元素

    // 0為空格0,-1為邊框#,-2為食物F,1為蛇頭@,大于1的正數(shù)為蛇身*

    void gotoxy(int x,int y)  //光標(biāo)移動(dòng)到(x,y)位置

    {

    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

    COORD pos;

    pos.X = x;

    pos.Y = y;

    SetConsoleCursorPosition(handle,pos);

    }

    // 移動(dòng)小蛇

    // 第一步掃描數(shù)組canvas所有元素,找到正數(shù)元素都+1

    // 找到最大元素(即蛇尾巴),把其變?yōu)?

    // 找到=2的元素(即蛇頭),再根據(jù)輸出的上下左右方向,把對(duì)應(yīng)的另一個(gè)像素值設(shè)為1(新蛇頭)

    void moveSnakeByDirection()

    {

    int i,j;

    for (i=1;i<High-1;i++)

    for (j=1;j<Width-1;j++)

    if (canvas[i][j]>0)

    canvas[i][j]++;

    int oldTail_i,oldTail_j,oldHead_i,oldHead_j;

    int max = 0;

    for (i=1;i<High-1;i++)

    for (j=1;j<Width-1;j++)

    if (canvas[i][j]>0)

    {

    if (max<canvas[i][j])

    {

    max = canvas[i][j];

    oldTail_i = i;

    oldTail_j = j;

    }

    if (canvas[i][j]==2)

    {

    oldHead_i = i;

    oldHead_j = j;

    }

    }

    int newHead_i,newHead_j;

    if (moveDirection==1) // 向上移動(dòng)

    {

    newHead_i = oldHead_i-1;

    newHead_j = oldHead_j;

    }

    if (moveDirection==2) // 向下移動(dòng)

    {

    newHead_i = oldHead_i+1;

    newHead_j = oldHead_j;

    }

    if (moveDirection==3) // 向左移動(dòng)

    {

    newHead_i = oldHead_i;

    newHead_j = oldHead_j-1;

    }

    if (moveDirection==4) // 向右移動(dòng)

    {

    newHead_i = oldHead_i;

    newHead_j = oldHead_j+1;

    }

    // 新蛇頭如果吃到食物

    if (canvas[newHead_i][newHead_j]==-2)

    {

    canvas[food_x][food_y] = 0;

    // 產(chǎn)生一個(gè)新的食物

    food_x = rand()%(High-5) + 2;

    food_y = rand()%(Width-5) + 2;

    canvas[food_x][food_y] = -2;

    // 原來(lái)的舊蛇尾留著,長(zhǎng)度自動(dòng)+1

    }

    else // 否則,原來(lái)的舊蛇尾減掉,保持長(zhǎng)度不變

    canvas[oldTail_i][oldTail_j] = 0;

    // 是否小蛇和自身撞,或者和邊框撞,游戲失敗

    if (canvas[newHead_i][newHead_j]>0 || canvas[newHead_i][newHead_j]==-1)

    {

    printf("游戲失敗!
    ");

    Sleep(2000);

    system("pause");

    exit(0);

    }

    else

    canvas[newHead_i][newHead_j] = 1;

    }

    void startup() // 數(shù)據(jù)初始化

    {

    int i,j;

    // 初始化邊框

    for (i=0;i<High;i++)

    {

    canvas[i][0] = -1;

    canvas[i][Width-1] = -1;

    }

    for (j=0;j<Width;j++)

    {

    canvas[0][j] = -1;

    canvas[High-1][j] = -1;

    }

    // 初始化蛇頭位置

    canvas[High/2][Width/2] = 1;

    // 初始化蛇身,畫(huà)布中元素值分別為2,3,4,5....

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

    canvas[High/2][Width/2-i] = i+1;

    // 初始小蛇向右移動(dòng)

    moveDirection = 4;

    food_x = rand()%(High-5) + 2;

    food_y = rand()%(Width-5) + 2;

    canvas[food_x][food_y] = -2;

    }

    void show()  // 顯示畫(huà)面

    {

    gotoxy(0,0);  // 光標(biāo)移動(dòng)到原點(diǎn)位置,以下重畫(huà)清屏

    int i,j;

    for (i=0;i<High;i++)

    {

    for (j=0;j<Width;j++)

    {

    if (canvas[i][j]==0)

    printf(" ");   //   輸出空格

    else if (canvas[i][j]==-1)

    printf("#");   //   輸出邊框#

    else if (canvas[i][j]==1)

    printf("@");   //   輸出蛇頭@

    else if (canvas[i][j]>1)

    printf("*");   //   輸出蛇身*

    else if (canvas[i][j]==-2)

    printf("F");   //   輸出食物F

    }

    printf("
    ");

    }

    Sleep(100);

    }

    void updateWithoutInput()  // 與用戶(hù)輸入無(wú)關(guān)的更新

    {

    moveSnakeByDirection();

    }

    void updateWithInput()  // 與用戶(hù)輸入有關(guān)的更新

    {

    char input;

    if(kbhit())  // 判斷是否有輸入

    {

    input = getch();  // 根據(jù)用戶(hù)的不同輸入來(lái)移動(dòng),不必輸入回車(chē)

    if (input == 'a') 

    {

    moveDirection = 3;   // 位置左移

    moveSnakeByDirection();

    }

    else if (input == 'd')

    {

    moveDirection = 4;  // 位置右移

    moveSnakeByDirection();

    }

    else if (input == 'w')

    {

    moveDirection = 1;  // 位置上移

    moveSnakeByDirection();

    }

    else if (input == 's')

    {

    moveDirection = 2;   // 位置下移

    moveSnakeByDirection();

    }

    }

    }

    int main()

    {

    startup();  // 數(shù)據(jù)初始化

    while (1) //  游戲循環(huán)執(zhí)行

    {

    show();  // 顯示畫(huà)面

    updateWithoutInput();  // 與用戶(hù)輸入無(wú)關(guān)的更新

    updateWithInput();  // 與用戶(hù)輸入有關(guān)的更新

    }

    return 0;

    }

    拓展資料

    C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā)。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。

    盡管C語(yǔ)言提供了許多低級(jí)處理的功能,但仍然保持著良好跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫(xiě)出的C語(yǔ)言程序可在許多電腦平臺(tái)上進(jìn)行編譯,甚至包含一些嵌入式處理器(單片機(jī)或稱(chēng)MCU)以及超級(jí)電腦等作業(yè)平臺(tái)。

    二十世紀(jì)八十年代,為了避免各開(kāi)發(fā)廠商用的C語(yǔ)言語(yǔ)法產(chǎn)生差異,由美國(guó)國(guó)家標(biāo)準(zhǔn)局為C語(yǔ)言制定了一套完整的美國(guó)國(guó)家標(biāo)準(zhǔn)語(yǔ)法,稱(chēng)為ANSI C,作為C語(yǔ)言最初的標(biāo)準(zhǔn)。  目前2011年12月8日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布的C11標(biāo)準(zhǔn)是C語(yǔ)言的第三個(gè)官方標(biāo)準(zhǔn),也是C語(yǔ)言的最新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更好的支持了漢字函數(shù)名和漢字標(biāo)識(shí)符,一定程度上實(shí)現(xiàn)了漢字編程。

    C語(yǔ)言是一門(mén)面向過(guò)程的計(jì)算機(jī)編程語(yǔ)言,與C++,Java等面向?qū)ο蟮木幊陶Z(yǔ)言有所不同。

    其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。



    /* 貪吃蛇程序 by champking */

    #define N 200

    #include <graphics.h>
    #include <stdlib.h>
    #include <dos.h>

    #define LEFT 0x4b00
    #define RIGHT 0x4d00
    #define DOWN 0x5000
    #define UP 0x4800
    #define ESC 0x011b

    int i,key;
    int score = 0;/*得分*/
    int gamespeed = 100000;/*游戲速度自己調(diào)整*/

    struct Food
    {
    int x;/*食物的橫坐標(biāo)*/
    int y;/*食物的縱坐標(biāo)*/
    int yes;/*判斷是否要出現(xiàn)食物的變量*/
    }food;/*食物的結(jié)構(gòu)體*/

    struct Snake
    {
    int x[N];
    int y[N];
    int node;/*蛇的節(jié)數(shù)*/
    int direction;/*蛇移動(dòng)方向*/
    int life;/* 蛇的生命,0活著,1死亡*/
    }snake;

    void Init(void);/*圖形驅(qū)動(dòng)*/
    void Close(void);/*圖形結(jié)束*/
    void DrawK(void);/*開(kāi)始畫(huà)面*/
    void GameOver(void);/*結(jié)束游戲*/
    void GamePlay(void);/*玩游戲具體過(guò)程*/
    void PrScore(void);/*輸出成績(jī)*/

    /*主函數(shù)*/
    void main(void)
    {
    Init();/*圖形驅(qū)動(dòng)*/
    DrawK();/*開(kāi)始畫(huà)面*/
    GamePlay();/*玩游戲具體過(guò)程*/
    Close();/*圖形結(jié)束*/
    }

    /*圖形驅(qū)動(dòng)*/
    void Init(void)
    {
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "c:\\tc");
    cleardevice();
    }
    /*開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/
    void DrawK(void)
    {
    /*setbkcolor(LIGHTGREEN);*/
    setcolor(11);
    setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*設(shè)置線型*/

    for(i = 50; i <= 600; i += 10)/*畫(huà)圍墻*/
    {
    rectangle(i, 40, i + 10, 49); /*上邊*/
    rectangle(i, 451, i + 10, 460);/*下邊*/
    }

    for(i = 40; i <= 450; i += 10)
    {
    rectangle(50, i, 59, i + 10); /*左邊*/
    rectangle(601, i, 610, i + 10);/*右邊*/
    }
    }
    /*玩游戲具體過(guò)程*/
    void GamePlay(void)
    {
    randomize();/*隨機(jī)數(shù)發(fā)生器*/
    food.yes = 1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
    snake.life = 0;/*活著*/
    snake.direction = 1;/*方向往右*/
    snake.x[0] = 100; snake.y[0] = 100;/*蛇頭*/
    snake.x[1] = 110; snake.y[1] = 100;
    snake.node = 2;/*節(jié)數(shù)*/
    PrScore();/*輸出得分*/

    while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
    {
    while(!kbhit())/*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/
    {
    if(food.yes == 1)/*需要出現(xiàn)新食物*/
    {
    food.x = rand() % 400 + 60;
    food.y = rand() % 350 + 60;

    while(food.x % 10 != 0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
    food.x++;
    while(food.y % 10 != 0)
    food.y++;
    food.yes = 0;/*畫(huà)面上有食物了*/
    }

    if(food.yes == 0)/*畫(huà)面上有食物了就要顯示*/
    {
    setcolor(GREEN);
    rectangle(food.x, food.y, food.x + 10, food.y - 10);
    }

    for(i = snake.node - 1; i > 0; i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
    {
    snake.x[i] = snake.x[i-1];
    snake.y[i] = snake.y[i-1];
    }

    /*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/
    switch(snake.direction)
    {
    case 1: snake.x[0] += 10; break;
    case 2: snake.x[0] -= 10; break;
    case 3: snake.y[0] -= 10; break;
    case 4: snake.y[0] += 10; break;
    }

    for(i = 3; i < snake.node; i++)/*從蛇的第四節(jié)開(kāi)始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)*/
    {
    if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
    {
    GameOver();/*顯示失敗*/
    snake.life = 1;
    break;
    }
    }

    if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
    snake.y[0]>455)/*蛇是否撞到墻壁*/
    {
    GameOver();/*本次游戲結(jié)束*/
    snake.life=1; /*蛇死*/
    }

    if(snake.life == 1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/
    break;

    if(snake.x[0] == food.x && snake.y[0] == food.y)/*吃到食物以后*/
    {
    setcolor(0);/*把畫(huà)面上的食物東西去掉*/
    rectangle(food.x, food.y, food.x + 10, food.y - 10);
    snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
    /*新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置*/
    snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
    food.yes = 1;/*畫(huà)面上需要出現(xiàn)新的食物*/
    score += 10;
    PrScore();/*輸出新得分*/
    }

    setcolor(4);/*畫(huà)出蛇*/

    for(i = 0; i < snake.node; i++)
    rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
    snake.y[i] - 10);

    delay(gamespeed);

    setcolor(0);/*用黑色去除蛇的的最后一節(jié)*/
    rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
    snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
    } /*endwhile(!kbhit)*/

    if(snake.life == 1)/*如果蛇死就跳出循環(huán)*/
    break;

    key = bioskey(0);/*接收按鍵*/

    if(key == ESC)/*按ESC鍵退出*/
    break;
    else
    if(key == UP&&snake.direction!=4)
    /*判斷是否往相反的方向移動(dòng)*/
    snake.direction=3;
    else
    if(key == RIGHT &&snake.direction != 2)
    snake.direction=1;
    else
    if(key == LEFT && snake.direction != 1)
    snake.direction = 2;
    else
    if(key == DOWN && snake.direction != 3)
    snake.direction = 4;
    }/*endwhile(1)*/
    }

    /*游戲結(jié)束*/
    void GameOver(void)
    {
    cleardevice();
    PrScore();
    setcolor(RED);
    settextstyle(0, 0, 4);
    outtextxy(200, 200, "GAME OVER");
    getch();
    }

    /*輸出成績(jī)*/
    void PrScore(void)
    {
    char str[10];
    setfillstyle(SOLID_FILL, YELLOW);
    bar(50, 15, 220, 35);
    setcolor(6);
    settextstyle(0,0,2);
    sprintf(str, "score:%d", score);
    outtextxy(55, 20, str);
    }

    /*圖形結(jié)束*/
    void Close(void)
    {
    getch();
    closegraph();
    }
    

    /*
    貪吃蛇程序
    by
    champking
    */
    #define
    N
    200
    #include
    <graphics.h>
    #include
    <stdlib.h>
    #include
    <dos.h>
    #define
    LEFT
    0x4b00
    #define
    RIGHT
    0x4d00
    #define
    DOWN
    0x5000
    #define
    UP
    0x4800
    #define
    ESC
    0x011b
    int
    i,key;
    int
    score
    =
    0;/*得分*/
    int
    gamespeed
    =
    100000;/*游戲速度自己調(diào)整*/
    struct
    Food
    {
    int
    x;/*食物的橫坐標(biāo)*/
    int
    y;/*食物的縱坐標(biāo)*/
    int
    yes;/*判斷是否要出現(xiàn)食物的變量*/
    }food;/*食物的結(jié)構(gòu)體*/
    struct
    Snake
    {
    int
    x[N];
    int
    y[N];
    int
    node;/*蛇的節(jié)數(shù)*/
    int
    direction;/*蛇移動(dòng)方向*/
    int
    life;/*
    蛇的生命,0活著,1死亡*/
    }snake;
    void
    Init(void);/*圖形驅(qū)動(dòng)*/
    void
    Close(void);/*圖形結(jié)束*/
    void
    DrawK(void);/*開(kāi)始畫(huà)面*/
    void
    GameOver(void);/*結(jié)束游戲*/
    void
    GamePlay(void);/*玩游戲具體過(guò)程*/
    void
    PrScore(void);/*輸出成績(jī)*/
    /*主函數(shù)*/
    void
    main(void)
    {
    Init();/*圖形驅(qū)動(dòng)*/
    DrawK();/*開(kāi)始畫(huà)面*/
    GamePlay();/*玩游戲具體過(guò)程*/
    Close();/*圖形結(jié)束*/
    }
    /*圖形驅(qū)動(dòng)*/
    void
    Init(void)
    {
    int
    gd
    =
    DETECT,
    gm;
    initgraph(&gd,
    &gm,
    "c:\\tc");
    cleardevice();
    }
    /*開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/
    void
    DrawK(void)
    {
    /*setbkcolor(LIGHTGREEN);*/
    setcolor(11);
    setlinestyle(SOLID_LINE,
    0,
    THICK_WIDTH);/*設(shè)置線型*/
    for(i
    =
    50;
    i
    <=
    600;
    i
    +=
    10)/*畫(huà)圍墻*/
    {
    rectangle(i,
    40,
    i
    +
    10,
    49);
    /*上邊*/
    rectangle(i,
    451,
    i
    +
    10,
    460);/*下邊*/
    }
    for(i
    =
    40;
    i
    <=
    450;
    i
    +=
    10)
    {
    rectangle(50,
    i,
    59,
    i
    +
    10);
    /*左邊*/
    rectangle(601,
    i,
    610,
    i
    +
    10);/*右邊*/
    }
    }
    /*玩游戲具體過(guò)程*/
    void
    GamePlay(void)
    {
    randomize();/*隨機(jī)數(shù)發(fā)生器*/
    food.yes
    =
    1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
    snake.life
    =
    0;/*活著*/
    snake.direction
    =
    1;/*方向往右*/
    snake.x[0]
    =
    100;
    snake.y[0]
    =
    100;/*蛇頭*/
    snake.x[1]
    =
    110;
    snake.y[1]
    =
    100;
    snake.node
    =
    2;/*節(jié)數(shù)*/
    PrScore();/*輸出得分*/
    while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
    {
    while(!kbhit())/*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/
    {
    if(food.yes
    ==
    1)/*需要出現(xiàn)新食物*/
    {
    food.x
    =
    rand()
    %
    400
    +
    60;
    food.y
    =
    rand()
    %
    350
    +
    60;
    while(food.x
    %
    10
    !=
    0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
    food.x++;
    while(food.y
    %
    10
    !=
    0)
    food.y++;
    food.yes
    =
    0;/*畫(huà)面上有食物了*/
    }
    if(food.yes
    ==
    0)/*畫(huà)面上有食物了就要顯示*/
    {
    setcolor(GREEN);
    rectangle(food.x,
    food.y,
    food.x
    +
    10,
    food.y
    -
    10);
    }
    for(i
    =
    snake.node
    -
    1;
    i
    >
    0;
    i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
    {
    snake.x[i]
    =
    snake.x[i-1];
    snake.y[i]
    =
    snake.y[i-1];
    }
    /*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/
    switch(snake.direction)
    {
    case
    1:
    snake.x[0]
    +=
    10;
    break;
    case
    2:
    snake.x[0]
    -=
    10;
    break;
    case
    3:
    snake.y[0]
    -=
    10;
    break;
    case
    4:
    snake.y[0]
    +=
    10;
    break;
    }
    for(i
    =
    3;
    i
    <
    snake.node;
    i++)/*從蛇的第四節(jié)開(kāi)始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)*/
    {
    if(snake.x[i]
    ==
    snake.x[0]
    &&
    snake.y[i]
    ==
    snake.y[0])
    {
    GameOver();/*顯示失敗*/
    snake.life
    =
    1;
    break;
    }
    }
    if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
    snake.y[0]>455)/*蛇是否撞到墻壁*/
    {
    GameOver();/*本次游戲結(jié)束*/
    snake.life=1;
    /*蛇死*/
    }
    if(snake.life
    ==
    1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/
    break;
    if(snake.x[0]
    ==
    food.x
    &&
    snake.y[0]
    ==
    food.y)/*吃到食物以后*/
    {
    setcolor(0);/*把畫(huà)面上的食物東西去掉*/
    rectangle(food.x,
    food.y,
    food.x
    +
    10,
    food.y
    -
    10);
    snake.x[snake.node]
    =-
    20;
    snake.y[snake.node]
    =-
    20;
    /*新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置*/
    snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
    food.yes
    =
    1;/*畫(huà)面上需要出現(xiàn)新的食物*/
    score
    +=
    10;
    PrScore();/*輸出新得分*/
    }
    setcolor(4);/*畫(huà)出蛇*/
    for(i
    =
    0;
    i
    <
    snake.node;
    i++)
    rectangle(snake.x[i],
    snake.y[i],
    snake.x[i]
    +
    10,
    snake.y[i]
    -
    10);
    delay(gamespeed);
    setcolor(0);/*用黑色去除蛇的的最后一節(jié)*/
    rectangle(snake.x[snake.node-1],
    snake.y[snake.node-1],
    snake.x[snake.node-1]
    +
    10,
    snake.y[snake.node
    -
    1]
    -
    10);
    }
    /*endwhile(!kbhit)*/
    if(snake.life
    ==
    1)/*如果蛇死就跳出循環(huán)*/
    break;
    key
    =
    bioskey(0);/*接收按鍵*/
    if(key
    ==
    ESC)/*按ESC鍵退出*/
    break;
    else
    if(key
    ==
    UP&&snake.direction!=4)
    /*判斷是否往相反的方向移動(dòng)*/
    snake.direction=3;
    else
    if(key
    ==
    RIGHT
    &&snake.direction
    !=
    2)
    snake.direction=1;
    else
    if(key
    ==
    LEFT
    &&
    snake.direction
    !=
    1)
    snake.direction
    =
    2;
    else
    if(key
    ==
    DOWN
    &&
    snake.direction
    !=
    3)
    snake.direction
    =
    4;
    }/*endwhile(1)*/
    }
    /*游戲結(jié)束*/
    void
    GameOver(void)
    {
    cleardevice();
    PrScore();
    setcolor(RED);
    settextstyle(0,
    0,
    4);
    outtextxy(200,
    200,
    "GAME
    OVER");
    getch();
    }
    /*輸出成績(jī)*/
    void
    PrScore(void)
    {
    char
    str[10];
    setfillstyle(SOLID_FILL,
    YELLOW);
    bar(50,
    15,
    220,
    35);
    setcolor(6);
    settextstyle(0,0,2);
    sprintf(str,
    "score:%d",
    score);
    outtextxy(55,
    20,
    str);
    }
    /*圖形結(jié)束*/
    void
    Close(void)
    {
    getch();
    closegraph();
    }
    



    相關(guān)評(píng)說(shuō):

  • 宓治19483002819: 貪吃蛇游戲用C語(yǔ)言怎么編寫(xiě)
    利通區(qū)裝配: ______ 在內(nèi)存中定義一個(gè)數(shù)組,存儲(chǔ)當(dāng)前局面(如果棋盤(pán)小(<15)可以選用unsigned char類(lèi)型,否則用int,蛇身就用1,2,3,4,5這樣的數(shù)字序列表示,每走一格,根據(jù)當(dāng)前方向?qū)⑾乱桓駭?shù)字變一下,把尾巴也處理一下,),每一秒刷新一下(向前走一格),每刷新一下,就重繪一遍當(dāng)前局面(可以用prinrf函數(shù),也可以用繪圖函數(shù)), 總之方法很多很多,自己下來(lái)可以思索一下
  • 宓治19483002819: 有沒(méi)有C語(yǔ)言的貪吃蛇代碼,跪求.我需要思路,之后我會(huì)自己碼,初學(xué)有大作業(yè),實(shí)在忙不開(kāi)了,謝謝 -
    利通區(qū)裝配: ______ 我可以給你思路,自己去寫(xiě),因?yàn)榫W(wǎng)上的代碼都是tc環(huán)境下的,現(xiàn)在基本不用那個(gè),你必須需要一個(gè)能在debug窗口中畫(huà)矩形的函數(shù),以及其他一些清除的函數(shù),調(diào)用api吧 然后就是按鍵檢測(cè)的api 檢測(cè)好之后,就是循環(huán)了 蛇用一個(gè)結(jié)構(gòu)體數(shù)組定義,然后每一次移動(dòng),后面的位置都等于前面的一個(gè)位置,而且因?yàn)樯哳^移動(dòng)一次所以蛇尾要用底色覆蓋掉,每次重畫(huà)只是畫(huà)蛇,并不重畫(huà)框架
  • 宓治19483002819: 怎么改c語(yǔ)言貪吃蛇源代碼才能讓貪吃蛇吃到自己尾巴后不死? -
    利通區(qū)裝配: ______ if snake[head].pos_x == snake[tail].pos_x && snake[head].pos_y == snake[tail].pos_y 代表頭尾相碰了 那么修改這個(gè)body中的實(shí)現(xiàn)代碼 原來(lái)肯定是顯示游戲結(jié)束 清除上下文 掛了一類(lèi)的,現(xiàn)在改成你想要的
  • 宓治19483002819: C語(yǔ)言小游戲貪吃蛇 如何實(shí)現(xiàn)顯示那條蛇,并讓它動(dòng)起來(lái)? 大概說(shuō)一下.(代碼也行但不要全部的貪吃蛇代碼) -
    利通區(qū)裝配: ______ 很土很簡(jiǎn)單的實(shí)現(xiàn)方式 顯示:在屏幕上的指定坐標(biāo)打印一些斷續(xù)的點(diǎn)(或其他字符),每個(gè)點(diǎn)之間用空格或者其他字符來(lái)分隔.移動(dòng):打印第一次后間隔一段時(shí)間,如0.5秒或1秒等,clrscr清屏,順序移動(dòng)貪吃蛇上所有節(jié)點(diǎn)坐標(biāo)后再次打印 ,簡(jiǎn)...
  • 宓治19483002819: 貪吃蛇的c語(yǔ)言代碼怎么編制成游戲? -
    利通區(qū)裝配: ______ C語(yǔ)言貪吃蛇源代碼必須經(jīng)過(guò)相應(yīng)的C/C++編譯器編譯成EXE文件后才能運(yùn)行.由于我們通常使用的操作系統(tǒng)是Windows系統(tǒng),而在該系統(tǒng)下最長(zhǎng)用的C/C++編譯器是VC++編譯器,目前在大專(zhuān)院校常用的版本還是VC++6.0 下面就以VC++6.0來(lái)說(shuō)明編譯過(guò)程:1.在VC++6.0中通過(guò)“File”菜單下的 “Open”子菜單打開(kāi)貪吃蛇代碼
  • 宓治19483002819: C語(yǔ)言做貪吃蛇用什么軟件編寫(xiě)? -
    利通區(qū)裝配: ______ 了解貪吃蛇設(shè)計(jì)思路 上圖中的紅色空心方框(□)表示邊框,是貪吃蛇的邊界,貪吃 蛇不能碰到它,否則就“死掉” ,游戲結(jié)束.綠色實(shí)心方框(■)表示 貪吃蛇的活動(dòng)范圍,貪吃蛇可以自由移動(dòng),食物(蘋(píng)果)也會(huì)隨機(jī)出 現(xiàn)在這個(gè)區(qū)域. 我...
  • 宓治19483002819: 貪吃蛇游戲 - ---《C程序設(shè)計(jì)課程設(shè)計(jì)》 -
    利通區(qū)裝配: ______ // Snake.h : main header file for the SNAKE application//#if !defined(AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_)#define AFX_SNAKE_...
  • 宓治19483002819: 急求C語(yǔ)言程序設(shè)計(jì)—貪吃蛇的總結(jié)·!! 不知道怎么寫(xiě).... -
    利通區(qū)裝配: ______ C++ #include using namespace std; char num[16] = { '0', '1', '2', '3', '4', '5...
  • 宓治19483002819: 我有C語(yǔ)言貪食蛇的代碼,怎么運(yùn)行啊 -
    利通區(qū)裝配: ______ 簡(jiǎn)單說(shuō)呢,你需要安裝C的開(kāi)發(fā)環(huán)境(需要注意你的代碼是哪個(gè)C:C++、C#、Turb C、MS C等),然后只需要啟動(dòng)C的主程序,將你的代碼Copy/Post到里面,在菜單中找到“運(yùn)行”之類(lèi)的命令就可以進(jìn)行編譯、聯(lián)接、與運(yùn)行了. GoodLuck!
  • 宓治19483002819: C語(yǔ)言可以編寫(xiě)貪吃蛇游戲嗎? -
    利通區(qū)裝配: ______ 當(dāng)然可以邊游戲了,漢字可以用點(diǎn)陣顯示,如果是windows c 的話顯示漢字就更簡(jiǎn)單了!游戲窗體可以用windows c 編程實(shí)現(xiàn)! 給你一個(gè)貪吃蛇的游戲吧,在tc 下編譯成功!可以q聊:969370950 #include #include #include #include ...
  • 成全视频在线观看更新时间| 最好看的2018中文在线观看| 无码视频免费一区二区三区| 久久精品国产亚洲AV麻豆长发| 尤物在线一区二区三区| 另类老妇性BBWBBW| 三年片在线观看免费观看高清电影| 日本IPHONEPROMAX70| 国产人成午夜免免费观看| 在线国产一区二区|