当前位置:首页 > 代码 > 正文

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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/9836.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载