前言:C語言初學者都是在控制檯上開發一些小遊戲什麼,由於沒有界面(比如圖片、音樂,不能做出擁有自己風格的程序)學起來比較乏味,很難堅持下去。所以我在這裏就教大家使用簡單的圖形化工具——easyx圖形界面庫,開發貪吃蛇小遊戲,讓初學者也能感受界面的魅力。做的不是很完善,希望大家可以自己動手完善它!
我們開始說思路。
1,我們需要一張地圖,圖形庫初始化的窗口是自帶座標的(左上角爲0,0)。
2,我們需要一條蛇,這條蛇由蛇頭和蛇身組成(這裏我們初始化三節蛇)。
3,我們需要食物,並且在蛇吃掉食物之後將蛇的身體變長,而且重新生成一個食物。
4,蛇需要移動,這應該是最難實現的(實現蛇身座標的傳值,除蛇頭以外,每一節蛇的座標都是上節蛇的上一次運動之前的座標,有點繞~)。
5,蛇撞到牆或者撞到自己的身體就會死亡(判斷座標是否重合就可以)。
6,我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯繫。
下面我們來寫代碼。
首先是頭文件snake.h部分,我們把一些函數的申明,和結構體的定義放在頭文件中:
#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();
//遊戲過程中,按 空格 可以對遊戲進行暫停、開始
void again();
//存儲蛇的座標的結構體
typedef struct coor
{
int x;
int y;
}coor;
//蛇的基本屬性
struct snake
{
int num;//蛇的總節數
coor xy[MAX];//存儲蛇的座標的結構體數組
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,頭文件部分完畢,接下來進入snake.cpp代碼編寫環節。
(圖形庫需要在xxx.CPP下編寫,在xxx.C可能會出錯)
#include"snake.h"
#include<graphics.h>//easyx圖形庫頭文件
#define Azure 0xA4D3EE//自己定義的一個顏色 忘記了...
int main()
{
srand((unsigned int)time(NULL));//隨機數種子,後面隨機產生蛇的食物要用到
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()
{
//除了第一節蛇,後面每節都是前面一節蛇的前一次座標
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;
}
}
//食物座標獲取
void foodxy()
{
//蛇座標 0 10 20 30 n*10
//食物 如果 rand() % 650 那麼座標0 1 2 3 4 蛇將吃不到食物 座標重合低
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()
{
{ //分數
char grade[100] = { 0 };
sprintf(grade, "%d", food.eatgrade);
setbkmode(0);//文字背景透明
outtextxy(570, 20, "分數:");
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, "撞牆了,遊戲結束!加C/C++學習交流Qun:231662552");
MessageBox(0, "撞牆了!遊戲結束!加C/C++學習交流Qun:231662552", "暴力提示!", 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, "你咬死了自己,遊戲結束!加C/C++學習交流Qun:231662552");
getchar();
}
}
}
void again()
{
if (_getch() == 32)
{
while (getch() != 32);
}
}
好了貪吃蛇代碼寫完了,我們來看一下效果:
蛇開始是一直向右運動的!我們按下下方向鍵:
看見沒有,我順便完了兩下,吃了食物蛇是不是變長了!
來,我們去撞下牆:
哎呀,我去,本來是撞牆的,結果自己咬死了自己!
好了,還沒看過癮的,趕快自己去編寫實現吧!有問題或要圖形庫的可以加上面圖片裏的交流qun!拜拜!