游戏编程笔记-起步

3.贪吃蛇游戏实现

代码下载:http://download.csdn.net/detail/you_lan_hai/3738025

核心代码实现如下,算法描述见 “起步(一)”:

#include "app.h"
#include <string.h>
#include <stdlib.h>int g_map[100][100];//2维地图int g_nWidth = 610; //窗口宽度
int g_nHeight = 514;//窗口高度int g_rows = 0;     //地图行数
int g_cols = 0;     //地图列数
int g_nSize = 30;   //地图方格尺寸struct Point//二维点
{int r;//行int c;//列
};Point   g_snake[1000];  //蛇
int     g_nLength = 0;  //蛇的长度
int     g_nSpeed;
bool    g_bLive = true; //是否存活
int     g_nSnakeDir = 0;    //蛇的当前移动方向。0-左,1-右,2-上,3-下const Point g_direction[4] = {{0,-1},{0,1},{-1,0},{1,0}};//四个方向运动增量。Point g_prizePos;       //奖子坐标bool g_bPause = true;   //是否暂停HBRUSH g_brushs[4];     //背景画刷void setSnakeDir(int dir)//设置蛇的运动方向。
{if ((dir==0 && g_nSnakeDir==1)|| (dir==1 && g_nSnakeDir==0)|| (dir==2 && g_nSnakeDir==3)|| (dir==3 && g_nSnakeDir==2))//反方向移动则令他暂停{g_bPause = true;return;//直接返回,什么也不做。}else{g_bPause = false;g_nSnakeDir = dir;}
}void resetLevel()//重置关卡
{/*初始化地图。将四边初始为障碍,即不可通过。* 0-可通过,1-障碍,2-奖子,3-蛇*/memset(g_map,0,sizeof(g_map));for (int r=0; r<g_rows; ++r){g_map[r][0] = 1;g_map[r][g_cols-1] = 1;}for (int c=0; c<g_cols; ++c){g_map[0][c] = 1;g_map[g_rows-1][c] = 1;}g_nSpeed = 500;g_bPause = true;//暂停g_nSnakeDir = 1;//向右。g_bLive = true;g_nLength = 3;//蛇初始有3个结点g_snake[0].r = 1;//蛇头g_snake[0].c = 3;g_snake[1].r = 1;g_snake[1].c = 2;g_snake[2].r = 1;g_snake[2].c = 1;//把初始状态写入地图for (int i=0; i<g_nLength; ++i){g_map[g_snake[i].r][g_snake[i].c] = 3;}//初始化奖子坐标g_prizePos.r = 1;g_prizePos.c = g_cols-2;
}void init()//游戏初始化
{g_brushs[0] = CreateSolidBrush(RGB(255,255,255));//白色画刷g_brushs[1] = CreateSolidBrush(RGB(0,0,255));//绘制障碍画刷g_brushs[2] = CreateSolidBrush(RGB(255,0,0));//绘制奖子画刷g_brushs[3] = CreateSolidBrush(RGB(0,255,0));//绘制蛇画刷srand(GetTickCount());//矫正窗口高度、宽度数据RECT rc;GetClientRect(getHWnd(),&rc);g_nWidth = rc.right - rc.left;g_nHeight = rc.bottom - rc.top;//计算行列值g_rows = g_nHeight / g_nSize;g_cols = g_nWidth / g_nSize;resetLevel();
}void update()//逻辑更新
{//时钟控制static int oldTime = 0;int curTime = GetTickCount();if (curTime - oldTime < g_nSpeed){return ;}oldTime = curTime;//static int lastOcurTime = 0;//奖子上次出现的时间if(curTime - lastOcurTime > 10000)//每隔10s更新一次位置。{//lastOcurTime不为-1表示,没有被吃掉,则将原来位置的奖子从地图擦掉。if (lastOcurTime != -1){g_map[g_prizePos.r][g_prizePos.c] = 0;}lastOcurTime = curTime;//随机产生奖子位置。bool flag = true;while(flag){g_prizePos.r = rand()%(g_rows-2)+1;g_prizePos.c = rand()%(g_cols-2)+1;if (g_map[g_prizePos.r][g_prizePos.c] == 0)//符合条件{flag = false;g_map[g_prizePos.r][g_prizePos.c] = 2;}}}if (!g_bLive || g_bPause)//死亡或暂停{return ;}//先判断是否可走,即是否撞死。Point newHead;newHead.r = g_snake[0].r + g_direction[g_nSnakeDir].r;newHead.c = g_snake[0].c + g_direction[g_nSnakeDir].c;if (g_map[newHead.r][newHead.c]==1 || g_map[newHead.r][newHead.c]==3){g_bLive = false;if(IDYES == MessageBox(getHWnd(),L"你撞死啦!是否重新来过?",L"撞死提示",MB_YESNO)){resetLevel();}else{PostQuitMessage(0);}return ;}else if (g_map[newHead.r][newHead.c] == 2)//遇到奖子{++g_nLength ;lastOcurTime = -1;g_nSpeed -= 10;}else{//撤销尾部在地图上遗留数据g_map[g_snake[g_nLength-1].r][g_snake[g_nLength-1].c] = 0;}memmove(g_snake+1,g_snake,sizeof(Point)*(g_nLength-1));//移动蛇的中间数据g_snake[0].r = newHead.r;g_snake[0].c = newHead.c;//添加蛇头数据g_map[g_snake[0].r][g_snake[0].c] = 3;//
}void render()//画面渲染
{HDC hDC = GetDC(getHWnd());       //获得系统绘图设备HDC memDC = CreateCompatibleDC(0);   //创建辅助绘图设备HBITMAP bmpBack = CreateCompatibleBitmap(hDC,g_nWidth,g_nHeight);//创建掩码位图(画布)SelectObject(memDC,bmpBack);  //将画布贴到绘图设备上HPEN penBack = CreatePen(PS_SOLID,1,RGB(255,0,255));//创建画笔SelectObject(memDC,penBack);    //将画笔选到绘图设备上//擦除背景RECT rcClient;//区域结构GetClientRect(getHWnd(),&rcClient);//获得客户区域HBRUSH brushTemp = (HBRUSH)GetStockObject(WHITE_BRUSH);//获得库存物体,白色画刷。FillRect(memDC,&rcClient,brushTemp);//填充客户区域。////绘制2维网格,矩形画法。for (int r=0; r<g_rows; ++ r){for (int c=0; c<g_cols; ++c){SelectObject(memDC,g_brushs[g_map[r][c]]);Rectangle(memDC,c*g_nSize,r*g_nSize,(c+1)*g_nSize,(r+1)*g_nSize);}}//BitBlt(hDC,0,0,g_nWidth,g_nHeight,memDC,0,0,SRCCOPY);//复制到系统设备上显示DeleteObject(penBack);  //释放画笔资源DeleteObject(bmpBack);  //释放位图资源DeleteDC(memDC);      //释放辅助绘图设备ReleaseDC(getHWnd(),hDC); //归还系统绘图设备Sleep(10);
}void clear()//资源释放
{//释放画刷资源for (int i=0; i<4; ++i){if(g_brushs != NULL){DeleteObject(g_brushs[i]);g_brushs[i] = NULL;}}
}/*窗口过程。如果没有处理消息请返回0,否则返回1。*/
LRESULT wndProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam )
{switch(uMsg){case WM_KEYDOWN:{switch(wParam){case VK_LEFT:  setSnakeDir(0); break; //向左case VK_RIGHT: setSnakeDir(1); break; //向右case VK_UP  :  setSnakeDir(2); break; //向上case VK_DOWN:  setSnakeDir(3); break; //向下case VK_ESCAPE: DestroyWindow(hwnd);break;}}break;default:return 0;}return 1;
}//主函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE , LPSTR , int  )
{if(!initApp(hInstance,L"贪吃蛇游戏",g_nWidth,g_nHeight)){return 0;}//初始化游戏init();//游戏循环mainLoop();//释放资源clear();return 0;
}

转载于:https://www.cnblogs.com/ygxsk/p/7694015.html

游戏编程笔记-起步(三)-贪吃蛇游戏实现相关推荐

  1. c语言贪吃蛇游戏编程视频教程,C语言贪吃蛇游戏精典源码 - 视频教程 - VC中文网-VC-MFC编程论坛 - Powered by Discuz!...

    19f700059b660539d5dc (38.08 KB, 下载次数: 0) 2017-11-14 16:28 上传 C语言贪吃蛇游戏精典源码 19f500058fe8fcaf675a (2.98 ...

  2. SwiftUI 游戏源码大全之贪吃蛇游戏基于GeometryReader和Preference

    实战需求 SwiftUI 游戏源码大全之贪吃蛇游戏基于GeometryReader和Preference 本文价值与收获 看完本文后,您将能够作出下面的界面 游戏规则 你抓住一个圆圈时,蛇会增长一段. ...

  3. 游戏编程笔记-起步(一)一个简单的游戏-贪吃蛇

    二 游戏编程起步 1.一个简单的游戏-贪吃蛇 1.贪吃蛇游戏剖析 1)游戏的目标.在不被撞死的前提下,吃掉奖子增加自己的长度,来完成升级. 2)游戏中的物体.蛇,墙壁,奖子. 3)动作.蛇移动,蛇吃奖 ...

  4. 好玩的c语言编程游戏,C语言写个贪吃蛇游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...

  5. python小游戏课程设计报告_贪吃蛇游戏课程设计报告

    贪吃蛇游戏程序设计 一.课程设计任务 贪吃蛇小游戏程序设计 二.设计要求 通过游戏程序设计,提高编程兴趣与编程思路,巩固 C 语言中所学的知识,合理的运 用资料,实现理论与实际相结合. ( 1 ) . ...

  6. 课程设计报告linux小游戏,嵌入式课程设计报告---贪吃蛇游戏.doc

    嵌入式课程设计报告---贪吃蛇游戏 嵌入式系统课程设计报告书 课题题目:贪吃蛇游戏 学 院:核自院 班 级:测控三班 学 号:9 姓 名: 马文铂 第一章 引言- 2 - 1.1关于题目- 2 - 1 ...

  7. JAVA游戏开发-超炫酷贪吃蛇游戏源码及教程

    一.前言 某日,看见隔壁家的小朋友在玩一款网络爆款贪吃蛇游戏,感觉很好玩.自己刚好正在学习JAVA编程,也想实现一个类似功能的游戏Demo练手,在网上查看了不少源码案例,全都是很古老的方块式贪吃蛇游戏 ...

  8. python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例

    这篇文章主要为大家详细介绍了Python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间 ...

  9. python写游戏脚本-python实现简单贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 代码: from turtle import * from random import randrange from ...

最新文章

  1. 《深入理解Java虚拟机》(第二版)学习3:垃圾收集器
  2. python登录系统简易框架
  3. Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发
  4. Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)
  5. codeup 1918 简单计算器
  6. STM32学习:串口通讯(proteus仿真)
  7. 启动不起来_汽车没电发动不起来咋办?老司机平时都用这几种方法,简单有效...
  8. MathType 7试用版写论文科研必备神器
  9. Vue3 Suspense 组件
  10. 性能测试:手机IOS性能测试
  11. 接口和抽象类练习:教练和运动员案例: (1)人员:乒乓球运动员和篮球运动员。乒乓球教练和篮球教练。 (2)为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识分析,设计类和接口。
  12. 校园二手平台使用说明
  13. Android与MVC设计模式相关操作
  14. 关于文件上传失败的问题
  15. VB和VBS、VBA的区别及作用
  16. 天津高一学业水平测试计算机,2019年1月天津高中学业水平考试标准
  17. 今日头条点击链接跳转微信公众号、加好友、小程序的方法(今日头条引流到微信公众号)
  18. java ssm oa_基于SSM的OA系统
  19. WinPE下无光驱安装XP原版需要注意的几点
  20. 磨刀不误砍柴工:优化你的工具AutoCAD2016,让运行速度更流畅

热门文章

  1. AI面试之SVM推导
  2. 小程序使用wxml2-canvans制作图片并下载
  3. 找到有趣发现好玩的应用 一个木函
  4. JZOJ5475.【NOIP2017提高组】day1T3逛公园
  5. stdio.h及cstdio的区别
  6. ossim mysql密码_OSSIM 4.1安装详解
  7. 2022年终回顾与总结:螃蟹走路-冲,撞
  8. 微信小程序:升级版王者荣耀铭文多功能助手小程序源码
  9. css 2倍行距,如何在css中设置行间距
  10. 手机获取百度地图定位