日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

小白入門——easyx界面版“貪吃蛇”的C語言實現(xiàn)(詳細(xì))

 Justmaye 2018-09-03

小白入門——easyx界面版“貪吃蛇”的C語言實現(xiàn)(詳細(xì))

作者:頑石

前言:C語言初學(xué)者都是在控制臺上開發(fā)一些小游戲什么,由于沒有界面(比如圖片、音樂,不能做出擁有自己風(fēng)格的程序)學(xué)起來比較乏味,很難堅持下去。所以我在這里就教大家使用簡單的圖形化工具——easyx圖形界面庫,開發(fā)貪吃蛇小游戲,讓初學(xué)者也能感受界面的魅力。做的不是很完善,希望大家可以自己動手完善它!

我們開始說思路。

1,我們需要一張地圖,圖形庫初始化的窗口是自帶坐標(biāo)的(左上角為0,0)。

2,我們需要一條蛇,這條蛇由蛇頭和蛇身組成(這里我們初始化三節(jié)蛇)。

3,我們需要食物,并且在蛇吃掉食物之后將蛇的身體變長,而且重新生成一個食物。

4,蛇需要移動,這應(yīng)該是最難實現(xiàn)的(實現(xiàn)蛇身坐標(biāo)的傳值,除蛇頭以外,每一節(jié)蛇的坐標(biāo)都是上節(jié)蛇的上一次運動之前的坐標(biāo),有點繞~)。

5,蛇撞到墻或者撞到自己的身體就會死亡(判斷坐標(biāo)是否重合就可以)。

6,我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯(lián)系。

下面我們來寫代碼。

首先是頭文件snake.h部分,我們把一些函數(shù)的申明,和結(jié)構(gòu)體的定義放在頭文件中:

#define _CRT_SECURE_NO_WARNINGS

#ifndef __SNAKE_H_

#define __SNAKE_H_

#define MAX 500

#pragma message("我的貪吃蛇!")

#include<stdio.h>

#include<conio.h>

#include<time.h>

//初始化蛇

void insnake();

//繪制蛇

void inisnake();

//蛇的移動

void way();

//蛇的方向

void snakemove();

//蛇的食物

void foodxy();

//食物繪制

void inifood();

//判斷蛇是否吃掉食物

void eatfood();

//判斷蛇是否吃掛掉

void snakedie();

//游戲過程中,按 空格 可以對游戲進(jìn)行暫停、開始

void again();

//存儲蛇的坐標(biāo)的結(jié)構(gòu)體

typedef struct coor

{

int x;

int y;

}coor;

//蛇的基本屬性

struct snake

{

int num;//蛇的總節(jié)數(shù)

coor xy[MAX];//存儲蛇的坐標(biāo)的結(jié)構(gòu)體數(shù)組

char way;

}snake;

//食物的基本屬性

struct food

{

coor fdxy;

int flag=0;

int eatgrade = 0;

}food;

//方向枚舉

enum way

{

right=72,

left=75,

down=77,

up=80

};

#endif

OK,頭文件部分完畢,接下來進(jìn)入snake.cpp代碼編寫環(huán)節(jié)。

(圖形庫需要在xxx.CPP下編寫,在xxx.C可能會出錯)

#include"snake.h"

#include<graphics.h>//easyx圖形庫頭文件

#define Azure 0xA4D3EE//自己定義的一個顏色 忘記了...

int main()

{

srand((unsigned int)time(NULL));//隨機(jī)數(shù)種子,后面隨機(jī)產(chǎn)生蛇的食物要用到

insnake();

while (1)

{

cleardevice();

if (food.flag == 0)

{

foodxy();

}

inifood();

inisnake();

snakedie();

eatfood();

way();

Sleep(100);

while (_kbhit())//這里是按上下左右鍵控制蛇的移動

{

again();

snakemove();

}

}

while (1);

closegraph();

return 0;

}

//初始化蛇

void insnake(){

initgraph(640, 480);

setbkcolor(Azure);

snake.xy[2].x = 0;

snake.xy[2].y = 0;

snake.xy[1].x = 10;

snake.xy[1].y = 0;

snake.xy[0].x = 20;

snake.xy[0].y = 0;

snake.num = 3;

snake.way = right;

food.flag = 0;

}

//繪制蛇

void inisnake()

{

for (int i = 0; i < snake.num; i++)

{

setlinecolor(BLUE);

setfillcolor(YELLOW);

fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);

}

}

//蛇的移動

void way()

{

//除了第一節(jié)蛇,后面每節(jié)都是前面一節(jié)蛇的前一次坐標(biāo)

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

{

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

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

}

switch (snake.way)

{

case right:

snake.xy[0].x += 10;

break;

case left:

snake.xy[0].x -= 10;

break;

case down:

snake.xy[0].y += 10;

break;

case up:

snake.xy[0].y -= 10;

break;

default:

break;

}

}

//蛇的方向控制

void snakemove()

{

char ch = 0;

ch = _getch();

switch (ch)

{

case 72:

if (snake.way != down)

snake.way = up;

break;

case 75:

if (snake.way != right)

snake.way = left;

break;

case 77:

if (snake.way != left)

snake.way = right;

break;

case 80:

if (snake.way != up)

snake.way = down;

break;

default:

break;

}

}

//食物坐標(biāo)獲取

void foodxy()

{

//蛇坐標(biāo) 0 10 20 30 n*10

//食物 如果 rand() % 650 那么坐標(biāo)0 1 2 3 4 蛇將吃不到食物 坐標(biāo)重合低

food.fdxy.x = rand() % 65 * 10;

food.fdxy.y = rand() % 48 * 10;

food.flag = 1;

for (int i = 0; i > snake.num; i++)

{

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

{

food.fdxy.x = rand() % 65 * 10;

food.fdxy.y = rand() % 48 * 10;

}

}

}

//繪制食物

void inifood()

{

fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);

}

//吃食物的判斷

void eatfood()

{

if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)

{

snake.num++;

food.eatgrade += 10;

food.flag = 0;

}

}

//判斷蛇是否死亡

void snakedie()

{

{ //分?jǐn)?shù)

char grade[100] = { 0 };

sprintf(grade, "%d", food.eatgrade);

setbkmode(0);//文字背景透明

outtextxy(570, 20, "分?jǐn)?shù):");

outtextxy(610, 20, grade);

}

if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y<0)

{

outtextxy(240, 320, "撞墻了,游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun231662552");

MessageBox(0, "撞墻了!游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun231662552", "暴力提示!", 0);

getchar();

}

for (int i = 1; i < snake.num; i++)

{

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

{

outtextxy(240, 320, "你咬死了自己,游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun231662552");

getchar();

}

}

}

void again()

{

if (_getch() == 32)

{

while (getch() != 32);

}

}

好了貪吃蛇代碼寫完了,我們來看一下效果:

IMG_256

蛇開始是一直向右運動的!我們按下下方向鍵:

IMG_257

看見沒有,我順便完了兩下,吃了食物蛇是不是變長了!

來,我們?nèi)プ蚕聣Α酒?span lang="EN-US">~】:

IMG_258

哎呀,我去,本來是撞墻的,結(jié)果自己咬死了自己!

好了,還沒看過癮的,趕快自己去編寫實現(xiàn)吧!有問題或要圖形庫的可以加上面圖片里的交流qun!拜拜!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約