贪吃蛇游戏c语言编程心得体会,C语言开发实现贪吃蛇游戏

本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

1、最好用VS运行

2、用到的函数有:_kbhit _getch EasyX图形库内一系列函数

3、蛇身与食物用矩形画的

代码如下:

#include

#include //easyx头文件

#include

#include

/********************设置各种属性**********************/

//坐标属性

typedef struct point {

int x, y;

}PYINT;

//蛇

struct snake {

PYINT xy[100]; //蛇的每节坐标放到数组中

int position; //方向

int num; //长度

}SNAKE;

//食物

struct food{

PYINT fdxy;

int flag; //是否存在

int grade; //成绩

}FOOD;

//枚举:方向

//也可用宏 #define

enum position

{

up, down, left, right

};

/**********************对蛇的操作*****************************/

//初始化蛇

//蛇的每节为 10x10填充的矩形

void initsnake()

{

SNAKE.xy[0].x = 0;

SNAKE.xy[0].y = 0;

//数组第一个元素为蛇头

SNAKE.xy[1].x = 10;

SNAKE.xy[1].y = 0;

SNAKE.xy[2].x = 20;

SNAKE.xy[2].y = 0;

SNAKE.position = right; //方向 (随便给)

SNAKE.num = 3; //数量 (随便给)

}

//画蛇

void Drawsnake()

{

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

{

setlinecolor(BLACK);

setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));

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

}

}

//使蛇动起来

/*

蛇头每向前动一格,其后紧随蛇头:

我们把蛇的每节坐标放到数组里(蛇头坐标放在数组的第一个),移动时,只需使蛇头(数组第一个元素)改变,其后与前面交换;

*/

void Movesnake()

{

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 (SNAKE.position)

{

case up:

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

break;

case down:

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

break;

//上下移动 X坐标不发生改变

case left:

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

break;

case right:

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

break;

//左右移动 Y坐标不发生改变

}

}

/******************************按键操作*****************************************/

//当蛇向上运动时,按向下键无效(其他三个相同)

void Keydown()

{

char ch = _getch();

switch (ch)

{

case 'W':

case 'w':

case 72: //小键盘上的“向上”

if (SNAKE.position != down) //是否向下

SNAKE.position = up;

break;

case 'S':

case 's':

case 80: //小键盘上的“向下”

if (SNAKE.position != up) //是否向上

SNAKE.position = down;

break;

case 'A':

case 'a':

case 75: //小键盘上的“向左”

if (SNAKE.position != right) //是否向右

SNAKE.position = left;

break;

case 'D':

case 'd':

case 77: //小键盘上的“向右”

if (SNAKE.position != left) //是否向左

SNAKE.position = right;

break;

}

}

/******************************食物操作**************************************/

//初始化食物

void initfood()

{

FOOD.fdxy.x = rand() % 60 * 10;

FOOD.fdxy.y = rand() % 40 * 10; //把食物的坐标控制在游戏界面内

FOOD.flag = 1; //1代表存在食物

//FOOD.grade = 0;

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

if (FOOD.fdxy.x == SNAKE.xy[i].x&&FOOD.fdxy.y == SNAKE.xy[i].y) //如果食物出现在蛇身上,重新产生X Y的值

{

FOOD.fdxy.x = rand() % 60 * 10;

FOOD.fdxy.y = rand() % 40 * 10;

}

}

}

//画食物

void Drawfood()

{

setlinecolor(BLACK);

setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));

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.flag = 0; //食物存在的标记(1:存在 0;不存在)

FOOD.grade += 10; //每吃一个食物分数加10 (每个食物是10分,可随意改变)

}

}

/*************************************显示分数*************************************************/

void putgrade()

{

char str[20] = " ";

sprintf_s(str, "greade: %d", FOOD.grade);

settextcolor(RED); //设置字体颜色

outtextxy(500, 50, str);

}

/***********************************游戏结束***************************************************/

//当蛇头撞墙(蛇头撞上自身)

//只分析一种情况

int gameover()

{

if (SNAKE.xy[0].x > 600 || SNAKE.xy[0].x < 0 | SNAKE.xy[0].y>400 || SNAKE.xy[0].y < 0) //撞墙

{

initgraph(800, 600);

settextcolor(RED);

outtextxy(600, 400, "你撞墙了");

settextcolor(YELLOW);

settextstyle(50, 50, "楷体"); //字体样式

outtextxy(200, 250, "GAME OVER"); //指定位置输出字符串

return 1;

}

return 0;

}

/*****************************************************************************************/

int main()

{

initgraph(600, 400);

setbkcolor(BLACK); //背景颜色

cleardevice(); //清屏:刷新屏幕

srand((unsigned int)time(NULL)); //随机数种子

initsnake();

Drawsnake();

while (1)

{

cleardevice(); //清屏

Movesnake();

Drawsnake();

if (FOOD.flag == 0) {

initfood();

}

Drawfood();

if (_kbhit()) { //_kbhit: 检测是否有按键动作

Keydown();

}

if (gameover()) { //若函数返回1:结束游戏

break;

}

eatfood();

putgrade();

Sleep(100); //延长时间 (即蛇移动的速度)

}

_getch(); //防止闪屏

closegraph(); //关闭窗口

return 0;

}

/**********************************************************/

//RGB(rand() % 255, rand() % 255, rand() % 255) 在三基色范围内随机产生

//记得安装EasyX插件

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程圈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值