mfc贪吃蛇源代码(MFC贪吃蛇)
admin 发布:2022-12-19 15:06 108
今天给各位分享mfc贪吃蛇源代码的知识,其中也会对MFC贪吃蛇进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
求c++MFC贪吃蛇代码
#include "stdafx.h"
#include "SnakeGame.h"
#include "Resource.h"
#include "Rule.h"
#include "HeroDlg.h"
CSnakeGame::CSnakeGame()
{
m_nScore = 0;
m_psFood.x = 30;
m_psFood.y = 30;
m_nHighScore = 0;
}
CSnakeGame::~CSnakeGame()
{
}
// 消息映射表
BEGIN_MESSAGE_MAP( CSnakeGame, CWnd )
//{{AFX_MSG_MAP(CSnakeGame)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_KEYUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
// 初始化果实
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::InitFoods()
{
int m_ysX,m_ysY;
while(1)
{
m_ysX=rand()%28; //随机生成横坐标使其与贪吃蛇的身体可以接上
m_ysY=rand()%28; //随机生成纵坐标使其与贪吃蛇的身体可以接上
for(int i=0;i=m_body.GetUpperBound();i++)
{
CPoint ysPoint1=m_body.GetAt(i); //获取贪吃蛇的身体坐标
if(ysPoint1.x!=m_ysX||ysPoint1.y!=m_ysY)//如果身体的横坐标或纵坐标与果实的横纵坐标相同
{
m_psFood = CPoint(m_ysX, m_ysY);//将随机出现的坐标记录为果实坐标
return;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
// 设置游戏等级
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::SetGameLevel(int level)
{
m_nlevel = level;
}
//////////////////////////////////////////////////////////////////////////
// 开始游戏函数
//////////////////////////////////////////////////////////////////////////
BOOL CSnakeGame::GameStart()
{
int nSleep = LOW_LEVEL_SLEEP;
char pszTmp[128] = {0};
switch(m_nlevel)
{
case GAME_LEVEL_HIGH:
nSleep = HIGH_LEVEL_SLEEP;
break;
case GAME_LEVEL_NOR:
nSleep = NOR_LEVEL_SLEEP;
break;
}
GetPrivateProfileString("HERO", "score", "0",
pszTmp, 127, ".\\hero.ini");
m_nHighScore = atoi(pszTmp);
SetTimer(1, nSleep, NULL);
InitGame();
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// 处理WM_PAINT消息
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnPaint()
{
CPaintDC dc( this );
CDC MemDC;
MemDC.CreateCompatibleDC( dc );
// 装载背景
CBitmap bmp;
CPen pen;
bmp.LoadBitmap( IDB_BMP_BJ );
pen.CreatePen( PS_SOLID, 1, 0xff );
MemDC.SelectObject( bmp );
MemDC.SelectObject( pen );
MemDC.SetROP2( R2_NOTXORPEN );
CString ysStr; //定义字符串用于显示游戏时间得分等字
MemDC.SetBkMode(TRANSPARENT); //设置字体背景
MemDC.SetTextColor(67); //设置字体颜色
ysStr.Format("当前得分:%d",m_nScore); //初始化字符串
MemDC.TextOut(30,50,ysStr); //输出文本
switch(m_nlevel) //根据等级判断
{
case GAME_LEVEL_LOW: //如果是初级
ysStr.Format("当前等级: 初 级");
break;
case GAME_LEVEL_NOR: //如果是中级
ysStr.Format("当前等级: 中 级");
break;
case GAME_LEVEL_HIGH: //如果是高级
ysStr.Format("当前等级: 高 级");
break;
}
MemDC.TextOut(30,30,ysStr);
//绘制蛇的样式
CPen yspen;
yspen.CreatePen(1,1,RGB(255,255,255)); //定义白色画笔绘制蛇的边框
MemDC.SelectObject(yspen);
CBrush ysbrush;
//
int k=m_body.GetUpperBound()+2; //设置一个变量存储贪吃蛇的身体长度
if(k=10) //如果小于10,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(0,255,0));
MemDC.SelectObject(ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else if(k10k=20) //如果在10和20之间,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(0,0,255));
MemDC.SelectObject(ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else if(k20k=30) //如果在20和30之间,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(255,255,0));
MemDC.SelectObject(ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else //其余情况均为红色
{
ysbrush.CreateSolidBrush(RGB(255,0,0));
MemDC.SelectObject(ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
//初始化点数组
for(int i=0;i=m_body.GetUpperBound();i++)
{
CPoint ysPoint=m_body.GetAt(i);
MemDC.Rectangle(
CRect(10+ysPoint.y*10,
120+ysPoint.x*10,
10+(ysPoint.y+1)*10,
120+(ysPoint.x+1)*10)
);
}
dc.BitBlt( 0, 0, 325, 425, MemDC,0, 0, SRCCOPY );
}
//////////////////////////////////////////////////////////////////////////
// 处理按键消息
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP: //按向上键
m_nDirect=DIREC_UP; //控制方向变量为DIREC_UP
break;
case VK_DOWN: //按向下键
m_nDirect=DIREC_DOWN; //控制方向变量为DIREC_DOWN
break;
case VK_LEFT: //按向左键
m_nDirect=DIREC_LEFT; //控制方向变量为DIREC_LEFT
break;
case VK_RIGHT: //按向右键
m_nDirect=DIREC_RIGHT; //控制方向变量为DIREC_RIGHT
break;
default:
break;
}
}
//////////////////////////////////////////////////////////////////////////
// 定时器响应函数
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnTimer(UINT nIDEvent)
{
CPoint ysPoint=m_body.GetAt(0); //获取蛇身的第一个点坐标
BOOL bTag = FALSE; //定义判断死亡的变量
CRule rule; //游戏规则类
switch(m_nDirect) //根据键盘按下键来选择蛇移动的方向
{
case DIREC_DOWN: //方向变量向下
ysPoint.x++; //点纵坐标自加
break;
case DIREC_UP: //方向变量向上
ysPoint.x--; //点纵坐标自减
break;
case DIREC_RIGHT: //方向变量向右
ysPoint.y++; //点横坐标自加
break;
case DIREC_LEFT: //方向变量向左
ysPoint.y--; //点横坐标自减
break;
}
if(rule.IsOver(ysPoint, m_body)) //游戏结束
{
KillTimer(1); //关闭定时器
if(m_nScore m_nHighScore) //超过最高分
{
HeroWrite(); //写英雄榜
}
else
{
AfxMessageBox("游戏结束,你的分数太低了,没有能进入英雄榜");
}
}
else
{
m_body.InsertAt(0,ysPoint); //将新点添加到蛇的身体中
ReDrawBody(ysPoint); //重绘蛇的身体
if(ysPoint.x==m_psFood.xysPoint.y==m_psFood.y) //如果蛇的身体与果实坐标重合
{
int nlen=m_body.GetUpperBound();//获取蛇身体的长度
m_nScore = m_nlevel * (nlen-3)+999999+1;//统计分数
InitFoods(); //再出现下一个果实
Invalidate(); //窗口重绘
}
else
{
CPoint pt=m_body.GetAt(m_body.GetUpperBound());//将最后一个赋给pt
m_body.RemoveAt(m_body.GetUpperBound()); //将移出最后一个
ReDrawBody(pt); //重新绘制pt这点
}
}
}
//////////////////////////////////////////////////////////////////////////
// 初始化游戏
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::InitGame()
{
m_body.RemoveAll();
m_body.Add(CPoint(3, 8));
m_body.Add(CPoint(3, 7));
m_body.Add(CPoint(3, 6));
m_body.Add(CPoint(3, 5));
srand((unsigned)time(NULL)); //初始化随机数生成器
m_nDirect = DIREC_RIGHT; //初始时向右
m_nScore = 0; //初始化分数
InitFoods(); //初始化果实函数
Invalidate(); //重绘窗口
}
//////////////////////////////////////////////////////////////////
//重绘指定点
//////////////////////////////////////////////////////////////////
void CSnakeGame::ReDrawBody(CPoint pt)
{
InvalidateRect(
CRect(10+pt.y*10,
120+pt.x*10,
10+(pt.y+1)*10,
120+(pt.x+1)*10)
);
}
//////////////////////////////////////////////////////////////////////////
// 英雄榜写入及弹出
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::HeroWrite()
{
CHeroDlg dlg;
dlg.SetWriteFlg(TRUE); //设置可标志
dlg.m_level = m_nlevel; //设置等级
dlg.m_score = m_nScore; //设置分数
dlg.DoModal(); //弹出对话框
}
C语言的贪吃蛇源代码
//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****
#include stdio.h
#include stdlib.h
#include conio.h
#include string.h
#include time.h
const int H = 8; //地图的高
const int L = 16; //地图的长
char GameMap[H][L]; //游戏地图
int key; //按键保存
int sum = 1, over = 0; //蛇的长度, 游戏结束(自吃或碰墙)
int dx[4] = {0, 0, -1, 1}; //左、右、上、下的方向
int dy[4] = {-1, 1, 0, 0};
struct Snake //蛇的每个节点的数据类型
{
int x, y; //左边位置
int now; //保存当前节点的方向, 0,1,2,3分别为左右上下
}Snake[H*L];
const char Shead = '@'; //蛇头
const char Sbody = '#'; //蛇身
const char Sfood = '*'; //食物
const char Snode = '.'; //'.'在地图上标示为空
void Initial(); //地图的初始化
void Create_Food(); //在地图上随机产生食物
void Show(); //刷新显示地图
void Button(); //取出按键,并判断方向
void Move(); //蛇的移动
void Check_Border(); //检查蛇头是否越界
void Check_Head(int x, int y); //检查蛇头移动后的位置情况
int main()
{
Initial();
Show();
return 0;
}
void Initial() //地图的初始化
{
int i, j;
int hx, hy;
system("title 贪吃蛇"); //控制台的标题
memset(GameMap, '.', sizeof(GameMap)); //初始化地图全部为空'.'
system("cls");
srand(time(0)); //随机种子
hx = rand()%H; //产生蛇头
hy = rand()%L;
GameMap[hx][hy] = Shead;
Snake[0].x = hx; Snake[0].y = hy;
Snake[0].now = -1;
Create_Food(); //随机产生食物
for(i = 0; i H; i++) //地图显示
{
for(j = 0; j L; j++)
printf("%c", GameMap[i][j]);
printf("\n");
}
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
getch(); //先接受一个按键,使蛇开始往该方向走
Button(); //取出按键,并判断方向
}
void Create_Food() //在地图上随机产生食物
{
int fx, fy;
while(1)
{
fx = rand()%H;
fy = rand()%L;
if(GameMap[fx][fy] == '.') //不能出现在蛇所占有的位置
{
GameMap[fx][fy] = Sfood;
break;
}
}
}
void Show() //刷新显示地图
{
int i, j;
while(1)
{
_sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图
Button(); //先判断按键在移动
Move();
if(over) //自吃或碰墙即游戏结束
{
printf("\n**游戏结束**\n");
printf(" _\n");
getchar();
break;
}
system("cls"); //清空地图再显示刷新吼的地图
for(i = 0; i H; i++)
{
for(j = 0; j L; j++)
printf("%c", GameMap[i][j]);
printf("\n");
}
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
}
}
void Button() //取出按键,并判断方向
{
if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主
key = getch(); //将按键从控制台中取出并保存到key中
switch(key)
{ //左
case 75: Snake[0].now = 0;
break;
//右
case 77: Snake[0].now = 1;
break;
//上
case 72: Snake[0].now = 2;
break;
//下
case 80: Snake[0].now = 3;
break;
}
}
}
void Move() //蛇的移动
{
int i, x, y;
int t = sum; //保存当前蛇的长度
//记录当前蛇头的位置,并设置为空,蛇头先移动
x = Snake[0].x; y = Snake[0].y; GameMap[x][y] = '.';
Snake[0].x = Snake[0].x + dx[ Snake[0].now ];
Snake[0].y = Snake[0].y + dy[ Snake[0].now ];
Check_Border(); //蛇头是否越界
Check_Head(x, y); //蛇头移动后的位置情况,参数为: 蛇头的开始位置
if(sum == t) //未吃到食物即蛇身移动哦
for(i = 1; i sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照
{
if(i == 1) //尾节点设置为空再移动
GameMap[ Snake[i].x ][ Snake[i].y ] = '.';
if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理
{
Snake[i].x = x;
Snake[i].y = y;
Snake[i].now = Snake[0].now;
}
else //其他蛇身即走到前一个蛇身位置
{
Snake[i].x = Snake[i+1].x;
Snake[i].y = Snake[i+1].y;
Snake[i].now = Snake[i+1].now;
}
GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身
}
}
void Check_Border() //检查蛇头是否越界
{
if(Snake[0].x 0 || Snake[0].x = H
|| Snake[0].y 0 || Snake[0].y = L)
over = 1;
}
void Check_Head(int x, int y) //检查蛇头移动后的位置情况
{
if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.') //为空
GameMap[ Snake[0].x ][ Snake[0].y ] = '@';
else
if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*') //为食物
{
GameMap[ Snake[0].x ][ Snake[0].y ] = '@';
Snake[sum].x = x; //新增加的蛇身为蛇头后面的那个
Snake[sum].y = y;
Snake[sum].now = Snake[0].now;
GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';
sum++;
Create_Food(); //食物吃完了马上再产生一个食物
}
else
over = 1;
}
贪吃蛇游戏的源代码
?
贪吃蛇源码:
!doctype html
html
body style='overflow:hidden'
canvas id="can" width="400" height="400" style="background:Black;display: block;margin:20px auto;"/canvas
script
var sn = [ 42, 41 ], dz = 43, fx = 1, n, ctx = document.getElementById("can").getContext("2d");
function draw(t, c) {
ctx.fillStyle = c;
ctx.fillRect(t % 20 * 20 + 1, ~~(t / 20) * 20 + 1, 18, 18);
}
document.onkeydown = function(e) {
fx = sn[1] - sn[0] == (n = [ -1, -20, 1, 20 ][(e || event).keyCode - 37] || fx) ? fx : n
};
!function() {
sn.unshift(n = sn[0] + fx);
if (sn.indexOf(n, 1) 0 || n0||n399 || fx == 1 n % 20 == 0 || fx == -1 n % 20 == 19)
return alert("GAME OVER");
draw(n, "Lime");
if (n == dz) {
while (sn.indexOf(dz = ~~(Math.random() * 400)) = 0);
draw(dz, "Yellow");
} else
draw(sn.pop(), "Black");
setTimeout(arguments.callee, 130);
}();
/script
/body
/html
用mfc设计贪吃蛇游戏源代码,最好有解析
1.算法
1. 首先,用一个结构体数组来标记蛇的X位置和Y位置,还有每一节的方向。用一变量标识蛇的长度。
2. 在蛇非转弯的移动时用定时器来自动移动,不管蛇是哪种形状,都只需在每次移动时先将各节向后移动(蛇尾舍弃,新的蛇尾由蛇尾的上一节代替):如蛇本身为snake[0]到snake[3],就是将snake[0]到snake[2]一起移动到snake[1]到snake[3]: 将 snake[2]的XY坐标赋值snake[3]的XY坐标 ,snake[1]的XY坐标 赋值给snake[2]的XY坐标 ,snake[0]的XY坐标 赋值给snake[1]的XY坐标 。再判断蛇头的方向,然后将蛇头顺着这个方向向前移动一格就是蛇头snake[0]的XY坐标 。而蛇除蛇头外各节的方向由函数SetDirection()来确定(明显此种情况,蛇头的方向不变),SetDirection()的思想是根据蛇的每一节的前一节的相对位置来确定本节的方向。(其实这个函数是多余的,真正用到的只有蛇头的方向)。
3. 蛇在转弯时,也是各节一次向后移,蛇头的位置顺着转弯的方向移动,方向由转弯方向确定。
4. 蛇在吃到食物时,长度加一,蛇头的位置变成食物的位置,方向不变。蛇的本身每节的XY位置都向后移。如蛇本身为snake[0]到snake[3], 就是将snake[0]到snake[3]一起移动到snake[1]到snake[4]。
5. 基于对话框的应用程序,响应按键消息需在PreTranslateMessage里,而不是像文档视图模式那样在OnKeyDown里响应。
6. 每次蛇在转弯时只能有一种方向按键能响应,即要么左右转,要么上下转。蛇头方向向左或向右时,只能上下转;蛇头方向向上或向下时,只能左右转。
7. 食物的位置由rand函数随机产生。
2.添加如下函数和变量
1 void HuaFangGe(int bianChang, int gridShumu); //如在400*400的方格里绘制20*20个格子,则bianChang = 400;gridShumu = 20;
2 void InitSnackSite(); //初始化蛇的位置
3
4 int snakeLength; //表示蛇的长度
5 int foodX; //食物的X位置
6 int foodY; //食物的Y位置
7 bool start; //标志是否开始
8 bool reStart; //标志是否重新开始
9
10 struct SNAKE
11 {
12 int x;
13 int y;
14 char direction; //某位置的方向为前一个位置相对于该位置的方向,由SetDirection()确定
15 }snake[200];
16
17 void DrawRed(int x, int y); //指定点0*0到20*20,画相应颜色,下同(红头绿身蓝尾)
18 void DrawGreen(int x, int y);
19 void DrawBlue(int x, int y);
20 void DrawBlack(int x, int y); //根据SetFoodXY()所确定的foodX和foodY来画食物。
21
22 void DrawSnakeFood(); //根据数组snakeSite数组的标识信息类绘制蛇的形状位置颜色。
23 void SetFoodXY(); //随机绘制食物的XY位置
24
25 bool leftRight; //确定是否能上下走(蛇本身在上下走,再按上下就无用了)
26 bool upDown; //确定是否能左右走(蛇本身在左右走,再按左右就无用了)
27
28 void MoveSite(); //蛇移动过程中,设置“除蛇头”外各节的x和y的位置,顺序前移。
29 void SetDirection(); //蛇移动过程中,设置“除蛇头”外各节的方向
30
31 void TurnLeft(); //当蛇左转时
32 void TurnRight(); //当蛇右转时
33 void GoUp(); //当蛇向上时
34 void GoDown(); //当蛇向下时
可以参考这里:
【原创】基于MFC的 贪吃蛇 小游戏的实现,附源码下载
mfc贪吃蛇源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于MFC贪吃蛇、mfc贪吃蛇源代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-07pb超级报表源代码(pb报表工具)[20240507更新]
- 05-07简历源代码可以上传照片的简单介绍[20240507更新]
- 05-07广告切换源代码免费下载(广告切换源代码免费下载安装)[20240507更新]
- 05-06阁楼网源代码(阁楼是什么网站)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06人脸识别源代码pdf的简单介绍[20240506更新]
- 05-06包含超市管理系统java源代码的词条[20240506更新]
- 05-06商城app源代码免费(商城App源码)[20240506更新]
- 05-06包含游戏源代码不同的模式的词条[20240506更新]
- 05-06matlab写的图象灰度切分源代码(matlab灰度图像分段线性变换)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接