c语言小项目贪吃蛇源码,C语言项目 [一] | ——— | 贪吃蛇源码+讲解

贪吃蛇

PS:此贪吃蛇是利用结构体数组的方式实现的!

贪吃蛇项目开发平台:

VS2017 + 图形库

一、在VS2017中添加图形库,具体方法见如下文章

如何在VS2017中添加 ”graphics.h” 头文件? So easy

二、贪吃蛇的框架

1.蛇的属性

蛇的属性包括蛇的长度+蛇的坐标+蛇的方向

2.食物的属性

食物的坐标

3.蛇的初始化

初始化开始时蛇的方向和长度

4.在窗口绘制蛇和食物

利用图形库自带的函数绘制蛇和食物

5.蛇的移动和食物的随机出现

利用四个方向上蛇坐标的变化来实现蛇的运动,利用随机数来实现食物的随机出现

6.蛇的方向

利用_getch()输入来判断和改变蛇的方向

7.蛇的死亡条件

利用条件语句来判断蛇是否撞墙和咬尾

8.暂停、继续和退出

利用_getch()输入来暂停、继续或者退出游戏!

9.还有很多的功能可以DIY!

贴代码时刻:

在贴代码之前有一段说明:

#include

#pragma comment(lib,"winmm.lib")

//初始化音乐

//PlaySound();//WAV

mciSendString("open 遥不可及的你.mp3 alias BGM", 0, 0, 0);//向底层声卡驱动发送字符串消息

mciSendString("play BGM", 0, 0, 0);

这些代码是用来播放音乐的API接口

遥不可及的你.mp3这个文件就是播放音乐的文件,大家可以下载我的演示视频观看就知道怎么回事了.

视频链接   :  https://pan.baidu.com/s/1BEge-PZxsMvZ17blgvg8qw

提  取  码   :  yie0

snack.h文件

#include

#include

#include

#include

#include

#pragma comment(lib,"winmm.lib")

//蛇的最大长度

#define SNACK_LENTH 500

//方向

enum Ch {

up = 72,

down = 80,

left = 75,

right = 77,

backspase = 32,

esc = 27

};

//坐标

struct Coor {

int x;

int y;

};

struct Snack

{

//一条蛇的属性

int n;

Coor szb[SNACK_LENTH];

Ch ch;

}snack;

struct Food {

Coor fzb;

int flag;

}food;

void InitSnack();

void DrawSnack();

void MoveSnack();

void ChangeSnackCh();

void CoorFood();

void DrawFood();

void EatFood();

void ExitSystem();

snack.cpp文件

#include "snack.h" // 引用图形库头文件

int move;

int main()

{

InitSnack();//1.初始化蛇

/*

按键之前.程序在做什么?

移动+绘图(循环)

//按键

改变蛇的方向.按键之后

移动+绘图(循环)

*/

while (1) {

while (!_kbhit())

{

if (food.flag==0) {

CoorFood();

}

cleardevice();

MoveSnack();

DrawFood();

DrawSnack();

EatFood();

ExitSystem();

Sleep(100);

}

ChangeSnackCh();

}

system("pause");

return 0;

}

void InitSnack() {

//初始化窗口

initgraph(640,480);

srand((unsigned int)time(NULL));

//初始化音乐

//PlaySound();//WAV

mciSendString("open 遥不可及的你.mp3 alias BGM", 0, 0, 0);//向底层声卡驱动发送字符串消息

mciSendString("play BGM", 0, 0, 0);

//初始化蛇

snack.n = 3;

snack.ch = right;

snack.szb[0].x = 100;

snack.szb[0].y = 100;

snack.szb[1].x = 90;

snack.szb[1].y = 100;

snack.szb[2].x = 80;

snack.szb[2].y = 100;

/*

snack.szb[0].x = 20;

snack.szb[0].y = 0;

snack.szb[1].x = 10;

snack.szb[1].y = 0;

snack.szb[2].x = 0;

snack.szb[2].y = 0;

*/

}

void DrawSnack() {

setlinecolor(GREEN);//线条的颜色

setfillcolor(BLUE);//填充的颜色

//遍历数组的方式,去访问数组中每一个元素的值,绘制出每一个元素所对应的矩形

for (int i = 0;i < snack.n;i++) {

fillrectangle(snack.szb[i].x, snack.szb[i].y,

snack.szb[i].x + 10, snack.szb[i].y + 10);

}

}

void MoveSnack() {

for (int i = snack.n - 1;i > 0;i--) {

snack.szb[i].x = snack.szb[i - 1].x;

snack.szb[i].y = snack.szb[i - 1].y;

}

switch (snack.ch) {

case up:

snack.szb[0].y -= 10;

break;

case down:

snack.szb[0].y += 10;

break;

case left:

snack.szb[0].x -= 10;

break;

case right:

snack.szb[0].x += 10;

break;

}

}

void ChangeSnackCh() {

move = _getch();

switch (move)

{

case up:

if (snack.ch != down)

snack.ch = up;

break;

case down:

if (snack.ch != up)

snack.ch = down;

break;

case left:

if (snack.ch != right)

snack.ch = left;

break;

case right:

if (snack.ch != left)

snack.ch = right;

break;

}

}

void CoorFood() {

food.fzb.x = rand() % 64 * 10;

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

food.flag = 1;

}

void DrawFood() {

fillroundrect(food.fzb.x, food.fzb.y, food.fzb.x + 10, food.fzb.y + 10,10,10);

}

void EatFood() {

if (snack.szb[0].x == food.fzb.x&&snack.szb[0].y == food.fzb.y) {

snack.n++;

food.flag = 0;

}

else if (snack.szb[0].x == 0 || snack.szb[0].x + 10 == 640 || snack.szb[0].y == 0 || snack.szb[0].y + 10 == 480) {

outtextxy(150, 240, "Against the wall,Game Over!");

system("pause");

exit(0);

}

for (int i = 3;i < snack.n;i++) {

if ((snack.szb[0].y == snack.szb[i].y + 10 && snack.szb[0].x == snack.szb[i].x&&snack.ch == down) || (snack.szb[0].y == snack.szb[i].y + 10 && snack.szb[0].x == snack.szb[i].x&& snack.ch == up) || (snack.szb[0].x == snack.szb[i].x + 10 && snack.szb[0].y == snack.szb[i].y&& snack.ch == right) || (snack.szb[0].x == snack.szb[i].x + 10 && snack.szb[0].y == snack.szb[i].y&& snack.ch == left)) {

outtextxy(150, 240, "Bite into your own body,Game Over!");

system("pause");

exit(0);

}

}

}

void ExitSystem() {

switch (move) {

case backspase:

//按空格键暂停,按非空格键继续!

outtextxy(150, 240, "Pause, press any key to continue!");

_getch();

break;

case esc:

outtextxy(150, 240, "Exit System,thanks you play!");

system("pause");

exit(0);

}

}

PS:这是贪吃蛇的基础版本,可变的是实现的效果,不变的是实现的思维

理解代码最好的方法就是多敲几遍,并且理解敲的代码有何作用

另外,今天了解到正点原子要出Linux系列的开发板了,很期待!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用windows api 做的贪吃蛇 #include #include"resource.h" #include"Node.h" #include #include TCHAR szAppname[] = TEXT("Snack_eat"); #define SIDE (x_Client/80) #define x_Client 800 #define y_Client 800 #define X_MAX 800-20-SIDE //点x的范围 #define Y_MAX 800-60-SIDE //点y的范围 #define TIME_ID 1 #define SECOND 100 #define NUM_POINT 10 //点的总个数 #define ADD_SCORE 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; //窗口句柄 MSG msg; //消息 WNDCLASS wndclass; //窗口类 HACCEL hAccel;//加速键句柄 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口的水平和垂直尺寸被改变时,窗口被重绘 wndclass.lpfnWndProc = WndProc; //窗口过程为WndProc函数 wndclass.cbClsExtra = 0; //预留额外空间 wndclass.cbWndExtra = 0; //预留额外空间 wndclass.hInstance = hInstance; //应用程序的实例句柄,WinMain的第一个参数 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //设置图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //载入预定义的鼠标指针 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置画刷 wndclass.lpszMenuName = szAppname; //设置菜单 wndclass.lpszClassName = szAppname; //设置窗口类的名字 if (!RegisterClass(&wndclass))//注册窗口类 { MessageBox(NULL, TEXT("这个程序需要windows NT!"), szAppname, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppname, TEXT("Snack_eat"),//CreateWindow函数调用时,WndProc将受到WM_CREATE WS_OVERLAPPEDWINDOW&~WS_THICKFRAME& ~WS_MAXIMIZEBOX,//普通的层叠窗口&禁止改变大小&禁止最大化 CW_USEDEFAULT, //初始x坐标(默认) CW_USEDEFAULT, //初始y坐标 x_Client, //初始x方向尺寸 770 y_Client, //初始y方向尺寸 750 NULL, //父窗口句柄 NULL, //窗口菜单句柄 hInstance, //程序实例句柄 WinMain函数中第二个参数 NULL); //创建参数 ShowWindow(hwnd, iCmdShow);//显示窗口,iCmdShow是WinMain的第四个参数,决定窗口在屏幕中的初始化显示形式,例:SW_SHOWNORMAL表示正常显示 UpdateWindow(hwnd);//使窗口客户区重绘,通过向WndProc发送一条WM_PAINT消息而完成的 hAccel = LoadAccelerators(hInstance, szAppname);//加载加速键 while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }/* while (GetMessage(&msg, NULL, 0, 0))//GetMessage函数从消息队列中得到消息,填充msg。如果msg.message等于WM_QUIT,返回0,否则返回非0 { TranslateMessage(&msg);//将msg返回给windows已进行某些键盘消息的转换 DispatchMessage(&msg);//将msg再次返回给windows }*/ return msg.wParam;//msg.wParam是PostQuitMessage函数的参数值,通常是0 } ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值