小時候經常玩的貪喫蛇遊戲

完成基本貪喫蛇遊戲元素

初始化函數

源代碼

運行結果

蛇 食物 地圖

void init()
{
	//生成食物要用到隨機種子
	srand((unsigned int)time(NULL));
	initgraph(640, 480);
	setbkcolor(BLUE);
	//要初始化蛇 食物
	for (int i = 0; i < 3; i++) //xy[0]這個位置做蛇頭
	{
		snake.xy[2 - i].x = 10 * i;
		snake.xy[2 - i].y = 0;
	}
	snake.num = 3;
	snake.direction = right;
	food();
}

蛇 我們要用到數據 數據首先得存
變量 數組 結構體
蛇 一節一節的軀幹 用圖形畫出來
每一節軀幹都是一樣的 長得一毛一樣
有什麼不一樣? 位置不一樣 數組存什麼?
int a[100]={0}; //位置是x,y
結構體
食物自己長在地上 隨機的 隨機數
a[1]=a[0] 001 蛇的每一節被後一節代替

void draw()
{
	//蛇 食物
	//蛇的軀幹有個座標//fillrectangle
	for (int i = 0; i < snake.num; i++)//畫蛇
	{
		setlinecolor(RED);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
	//畫食物
	fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}

蛇的移動 通過什麼?鍵盤
繪蛇和食物graphics.h
循環以上

void move()
{
	//移動蛇
	for (int i = snake.num; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	switch (dir = snake.direction)
	{
	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;
	}
}

判斷遊戲的結束 蛇自食 蛇撞牆
我們沒按鍵的時候 蛇動不動?
_getch()阻塞式 _kbhit()非阻塞 有按鍵它的返回值就非0 鍵盤監聽
無按鍵它的返回值就是0
while(_kbhit()) 當鍵盤沒有按的時候
{ _getch();}

void over()
{
	//遊戲結束
	//蛇自食 撞牆
	if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		MessageBox(GetHWnd(), L"遊戲失敗!!", L"遊戲結束", 0);
		exit(0);
	}
	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)
	{
		MessageBox(GetHWnd(), L"遊戲失敗!!", L"遊戲結束", 0);
		exit(0);
	}
}

我們要通過按鍵改變蛇的方向

二;源代碼

#include<stdio.h>
#include<conio.h>//按鍵
#include<graphics.h>//畫蛇專用
#include<time.h>//隨機種子 隨機數
#include<stdlib.h>
#include<mciapi.h>
#pragma comment(lib,"winmm.lib")
#define MAX 100
typedef struct { int x; int y; }PLACE;//位置
struct mySnake//蛇
{
	int num;       //記蛇體節數
	PLACE xy[MAX];//蛇皮數組
	char direction;//方向
}snake;
PLACE foodxy;//食物位置
enum direction{ up, down, left, right };
//函數聲明 函數原型
char dir;//上一次方向
void init();//初始化
void food();//生成食物
void keyDown();//蛇頭動向
void move();//移動蛇
void draw();//繪蛇和食物
void eat();//蛇恰飯
void over();//遊戲結束判斷
void run();//運行
int main()
{
	run();
	return 0;
}
void init()
{
	//生成食物要用到隨機種子
	srand((unsigned int)time(NULL));
	initgraph(640, 480);
	setbkcolor(BLUE);
	//要初始化蛇 食物
	for (int i = 0; i < 3; i++) //xy[0]這個位置做蛇頭
	{
		snake.xy[2 - i].x = 10 * i;
		snake.xy[2 - i].y = 0;
	}
	snake.num = 3;
	snake.direction = right;
	food();
}
void keyDown()
{
	//確定方向
	//順序結構 循環結構 分支結構
	switch (_getch())//wa 這個問題的根源在哪
	{
	case 'w'://蛇先往右 還沒動就往左了 把原先的方向改變了 但是還沒動
	case 'W':if (dir != down)
		snake.direction = up; break;
	case 's':
	case 'S':if (dir != up)
		snake.direction = down; break;
	case 'a':
	case 'A':if (dir != right)
		snake.direction = left; break;
	case 'd':
	case 'D':if (dir != left)
		snake.direction = right; break;
	}
}
void move()
{
	//移動蛇
	for (int i = snake.num; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	switch (dir = snake.direction)
	{
	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;
	}
}
void draw()
{
	//蛇 食物
	//蛇的軀幹有個座標//fillrectangle
	for (int i = 0; i < snake.num; i++)//畫蛇
	{
		setlinecolor(RED);
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
	//畫食物
	fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}
void food()
{
	foodxy.x = rand() % 64 * 10;
	foodxy.y = rand() % 48 * 10;
	//食物不能長在蛇的身上
	int i = 0;
	while (i < snake.num)
	if (foodxy.x == snake.xy[i++].x&&foodxy.y == snake.xy[i++].y)
	{
		foodxy.x = rand() % 64 * 10;
		foodxy.y = rand() % 48 * 10;
		i = 0;
	}
}
void eat()
{
	if (snake.xy[0].x == foodxy.x&&snake.xy[0].y == foodxy.y)
	{
		snake.num++;
		food();
	}
}
void over()
{
	//遊戲結束
	//蛇自食 撞牆
	if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		MessageBox(GetHWnd(), L"遊戲失敗!!", L"遊戲結束", 0);
		exit(0);
	}
	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)
	{
		MessageBox(GetHWnd(), L"遊戲失敗!!", L"遊戲結束", 0);
		exit(0);
	}
}
void run()
{
	init();
	mciSendString(L"open mm.mp3", 0, 0, 0);
	mciSendString(L"play mm.mp3", 0, 0, 0);
	while (1)
	{
		cleardevice();//清除圖形屏幕
		while (_kbhit())//無按鍵返回0,按鍵返回 !0 
			keyDown();
		move();
		eat();
		over();
		draw();
		Sleep(300);//蛇移動間隔時間
	}//當蛇往右走的時候 按了wa
}

三;運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章