⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snakeview.cpp

📁 贪吃蛇源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
m_Box[10][31]=PLAYER1COLOR;
m_player1.snake.pos[2].x=10;
m_player1.snake.pos[2].y=32;
m_Box[10][32]=PLAYER1COLOR;
}

void CSnakeView::InitPlayer2()
{
m_player2.snake.position=UP_POS;
m_player2.snake.len=3;
m_player2.snake.pos[0].x=39;
m_player2.snake.pos[0].y=30;
m_Box[39][30]=PLAYER2COLOR;
m_player2.snake.pos[1].x=39;
m_player2.snake.pos[1].y=31;
m_Box[39][31]=PLAYER2COLOR;
m_player2.snake.pos[2].x=39;
m_player2.snake.pos[2].y=32;
m_Box[39][32]=PLAYER2COLOR;
}
//**************************

long i,j;
int pos,ii,jj;

void CSnakeView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	//移动蛇一
    if(m_Pause) return;
	CClientDC dc(this);

	if(m_player1.life>=1)
	{
		pos=m_player1.snake.position;
		if(pos==0) {ii=0;jj=-1;}
		else
		if(pos==1) {ii=1;jj=0;}
		else
		if(pos==2) {ii=0;jj=1;}
		else
		{ii=-1;jj=0;}
         
        i=m_player1.snake.pos[0].x;
		j=m_player1.snake.pos[0].y;
		if(i+ii>=50 || i+ii<0 || j+jj>=38 || j+jj<0)
		{
       m_player1.life--;

       for(int m=m_player1.snake.len-1;m>=0;m--)
			m_Box[m_player1.snake.pos[m].x][m_player1.snake.pos[m].y]=BACKCOLOR;
       if (m_player1.life>=1) InitPlayer1();
	   else
	   //处理game over
	   {
	   if(m_GameMode==FALSE || m_player2.life<=0)
	   {
       m_GameOver=TRUE;
	   m_mid.Open("lost.mid");
	   m_mid.Play();
	   }
	   }
        Invalidate(FALSE);
		}
		else
        //空格
	    if(m_Box[i+ii][j+jj]==BACKCOLOR)
		{
	    m_Box[m_player1.snake.pos[m_player1.snake.len-1].x][m_player1.snake.pos[m_player1.snake.len-1].y]=BACKCOLOR;
        DrawBox(&dc,m_player1.snake.pos[m_player1.snake.len-1].x,m_player1.snake.pos[m_player1.snake.len-1].y,BACKCOLOR);

        for(int m=m_player1.snake.len-1;m>=1;m--)
			m_player1.snake.pos[m]=m_player1.snake.pos[m-1];
            
		m_player1.snake.pos[0].x+=ii;
		m_player1.snake.pos[0].y+=jj;

        m_Box[i+ii][j+jj]=PLAYER1COLOR;
        DrawBox(&dc,i+ii,j+jj,PLAYER1COLOR);
		}
		else
        //蚕
        if(m_Box[i+ii][j+jj]==FOODCOLOR)
		{
        DrawBox(&dc,m_player1.snake.pos[m_player1.snake.len-1].x,m_player1.snake.pos[m_player1.snake.len-1].y,BACKCOLOR);
        m_player1.snake.len++;
		m_player1.score+=10;
		if(m_player1.score>=m_tempplayer1score+500)
		{
		m_player1.life++;
        m_tempplayer1score=m_player1.score;
		m_wave.Close();
		m_wave.Load("add.wav");
		m_wave.Play();
		}
		m_LeftFood--;
	
        for(int m=m_player1.snake.len-1;m>=1;m--)
			m_player1.snake.pos[m]=m_player1.snake.pos[m-1];

		m_player1.snake.pos[0].x+=ii;
		m_player1.snake.pos[0].y+=jj;

        m_Box[i+ii][j+jj]=PLAYER1COLOR;
        DrawBox(&dc,i+ii,j+jj,PLAYER1COLOR);
		DrawView();
	    if(m_LeftFood<=0)//过关
		{
		m_Stage++;
		m_PassStage=TRUE;
		m_Pause=TRUE;
	    if(m_Stage!=33)
        m_mid.Open("pass.mid");
        else m_mid.Open("win.mid");
	    m_mid.Play();
		Invalidate(FALSE);
		return;
		}

		}
	    else
        //玩者二 
        if(m_Box[+ii][j+jj]==PLAYER2COLOR)
        {
        m_player1.life--;
		m_player2.life--;

       for(int m=m_player1.snake.len-1;m>=0;m--)
			m_Box[m_player1.snake.pos[m].x][m_player1.snake.pos[m].y]=BACKCOLOR;
       for(m=m_player2.snake.len-1;m>=0;m--)
			m_Box[m_player2.snake.pos[m].x][m_player2.snake.pos[m].y]=BACKCOLOR;
       if (m_player1.life>=1) InitPlayer1();
	   if (m_player2.life>=1) InitPlayer2();
	   //处理game over
	   if (m_player1.life<=0 && m_player2.life<=0)
	   {
        m_GameOver=TRUE;
		m_mid.Open("lost.mid");
		m_mid.Play();
	   }
       Invalidate(FALSE);
		}
		//障碍物,自已
		else
		{
       m_player1.life--;

       for(int m=m_player1.snake.len-1;m>=0;m--)
			m_Box[m_player1.snake.pos[m].x][m_player1.snake.pos[m].y]=BACKCOLOR;
       if (m_player1.life>=1) InitPlayer1();
	   else
	   //处理game over
	   if (m_player1.life<=0)
	   {
	   if(m_GameMode==FALSE || m_player2.life<=0)
	   {
       m_GameOver=TRUE;
	   m_mid.Open("lost.mid");
	   m_mid.Play();
	   }
	   }
	     Invalidate(FALSE);
		}
	}
    //****************************************************************

	if(m_GameMode && m_player2.life>=1)
	{
		pos=m_player2.snake.position;
		if(pos==0) {ii=0;jj=-1;}
		else
		if(pos==1) {ii=1;jj=0;}
		else
		if(pos==2) {ii=0;jj=1;}
		else
		{ii=-1;jj=0;}
         
        i=m_player2.snake.pos[0].x;
		j=m_player2.snake.pos[0].y;
		if(i+ii>=50 || i+ii<0 || j+jj>=38 || j+jj<0)
		{
       m_player2.life--;

       for(int m=m_player2.snake.len-1;m>=0;m--)
			m_Box[m_player2.snake.pos[m].x][m_player2.snake.pos[m].y]=BACKCOLOR;
       if (m_player2.life>=1) InitPlayer2();
	   else
	   //处理game over
	   {
       if(m_GameMode==FALSE || m_player1.life<=0)
	   {
       m_GameOver=TRUE;
	   m_mid.Open("lost.mid");
	   m_mid.Play();
	   }
	   }
        Invalidate(FALSE);
		}
		else
        //空格
	    if(m_Box[i+ii][j+jj]==BACKCOLOR)
		{
	    m_Box[m_player2.snake.pos[m_player2.snake.len-1].x][m_player2.snake.pos[m_player2.snake.len-1].y]=BACKCOLOR;
        DrawBox(&dc,m_player2.snake.pos[m_player2.snake.len-1].x,m_player2.snake.pos[m_player2.snake.len-1].y,BACKCOLOR);

        for(int m=m_player2.snake.len-1;m>=1;m--)
			m_player2.snake.pos[m]=m_player2.snake.pos[m-1];
            
		m_player2.snake.pos[0].x+=ii;
		m_player2.snake.pos[0].y+=jj;

        m_Box[i+ii][j+jj]=PLAYER2COLOR;
        DrawBox(&dc,i+ii,j+jj,PLAYER2COLOR);
		}
		else
        //蚕
        if(m_Box[i+ii][j+jj]==FOODCOLOR)
		{
        DrawBox(&dc,m_player2.snake.pos[m_player2.snake.len-1].x,m_player2.snake.pos[m_player2.snake.len-1].y,BACKCOLOR);
        m_player2.snake.len++;
		m_player2.score+=10;
	    if(m_player2.score>=m_tempplayer2score+500)
		{
		m_player2.life++;
        m_tempplayer2score=m_player2.score;
		}
		m_LeftFood--;
	
        for(int m=m_player2.snake.len-1;m>=1;m--)
			m_player2.snake.pos[m]=m_player2.snake.pos[m-1];

		m_player2.snake.pos[0].x+=ii;
		m_player2.snake.pos[0].y+=jj;

        m_Box[i+ii][j+jj]=PLAYER2COLOR;
        DrawBox(&dc,i+ii,j+jj,PLAYER2COLOR);
		DrawView();
	    if(m_LeftFood<=0)//过关
		{
		m_Stage++;
		m_PassStage=TRUE;
		m_Pause=TRUE;
        if(m_Stage!=33)
        m_mid.Open("pass.mid");
        else m_mid.Open("win.mid");
	    m_mid.Play();
		Invalidate(FALSE);
		return;
		}

		}
	    else
        //玩者二 
        if(m_Box[+ii][j+jj]==PLAYER1COLOR)
        {
        m_player1.life--;
		m_player2.life--;

       for(int m=m_player1.snake.len-1;m>=0;m--)
			m_Box[m_player1.snake.pos[m].x][m_player1.snake.pos[m].y]=BACKCOLOR;
       for(m=m_player2.snake.len-1;m>=0;m--)
			m_Box[m_player2.snake.pos[m].x][m_player2.snake.pos[m].y]=BACKCOLOR;
       if (m_player1.life>=1) InitPlayer1();
	   if (m_player2.life>=1) InitPlayer2();
	   //处理game over
	   if (m_player1.life<=0 && m_player2.life<=0)
	   {
        m_GameOver=TRUE;
		m_mid.Open("lost.mid");
		m_mid.Play();
	   }
       Invalidate(FALSE);
		}
		//障碍物,自已
		else
		{
       m_player2.life--;

       for(int m=m_player2.snake.len-1;m>=0;m--)
			m_Box[m_player2.snake.pos[m].x][m_player2.snake.pos[m].y]=BACKCOLOR;
       if (m_player2.life>=1) InitPlayer2();
	   else
	   //处理game over
	   if (m_player2.life<=0)
	   {
       if(m_GameMode==FALSE || m_player1.life<=0)
       m_GameOver=TRUE;
	   m_mid.Open("lost.mid");
	   m_mid.Play();
	   }
	     Invalidate(FALSE);
		}
	}


	CView::OnTimer(nIDEvent);
}

void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_GameStart)
	{
	if(m_GameOver)
	{
		m_mid.Close();
		int max;
		if (m_player1.score>m_player2.score)
			max=m_player1.score;
		else
			max=m_player2.score;
		if(max>m_Hiscore)
		{
		m_Hiscore=max;
		SaveHiscore();
		}
		m_GameStart=FALSE;
		Invalidate();
		return;
	}
	if(m_PassStage)
	{
		//加入初始化下一关数据
		m_mid.Close();
        if(m_Stage!=33)
		InitGameDat();
		else m_GameStart=FALSE;
		Invalidate(FALSE);
		return;
	}
	switch(nChar)
	{
	//控制蛇一
	case 87:
	case 119:
		if(m_player1.snake.position!=2)
		m_player1.snake.position=0;
		break;
    case 68:
	case 100:
        if(m_player1.snake.position!=3)
		m_player1.snake.position=1;
		break;
	case 83:
	case 115:
        if(m_player1.snake.position!=0)
		m_player1.snake.position=2;
		break;
    case 65:
	case 97:
        if(m_player1.snake.position!=1)
		m_player1.snake.position=3;
		break;
	//控制蛇二
	case VK_UP:
        if(m_player2.snake.position!=2)
		m_player2.snake.position=0;
		break;
	case VK_RIGHT:
        if(m_player2.snake.position!=3)
		m_player2.snake.position=1;
		break;
	case VK_DOWN:
        if(m_player2.snake.position!=0)
		m_player2.snake.position=2;
		break;
	case VK_LEFT:
        if(m_player2.snake.position!=1)
		m_player2.snake.position=3;
		break;
    case VK_ESCAPE://退出游戏
		InitGameDat();
        m_GameStart=FALSE;
		KillTimer(IDT_MOVE);
		Invalidate(FALSE);
		break; 
	case VK_RETURN://暂停游戏
		m_Pause=1-m_Pause;
		Invalidate(FALSE);
		break;
	default:
		break;
	}

	}
	else
	{
	switch(nChar)
	{
    case VK_UP:
		if(m_GameMode)
		{
		CClientDC dc(this);
	    CPen pen;
		CBrush brush;
	    brush.CreateSolidBrush(RGB(0,0,0));
        dc.SelectObject(&brush);
	    dc.Ellipse(PLAYER2POSX-PLAYERPOSR,PLAYER2POSY-PLAYERPOSR,PLAYER2POSX+PLAYERPOSR,PLAYER2POSY+PLAYERPOSR);
		
		pen.CreatePen(PS_SOLID,1,SELECTCOLOR);
		dc.SelectObject(&pen);
		brush.DeleteObject();
		brush.CreateSolidBrush(SELECTCOLOR);
		dc.SelectObject(&brush);
		dc.Ellipse(PLAYER1POSX-PLAYERPOSR,PLAYER1POSY-PLAYERPOSR,PLAYER1POSX+PLAYERPOSR,PLAYER1POSY+PLAYERPOSR);
		
		pen.DeleteObject();
		brush.DeleteObject();
		m_GameMode=FALSE;
		}
		break;
	case VK_DOWN:
		if(m_GameMode==FALSE)
		{
	    CClientDC dc(this);
	    CPen pen;
		CBrush brush;
	    brush.CreateSolidBrush(RGB(0,0,0));
        dc.SelectObject(&brush);
	  	dc.Ellipse(PLAYER1POSX-PLAYERPOSR,PLAYER1POSY-PLAYERPOSR,PLAYER1POSX+PLAYERPOSR,PLAYER1POSY+PLAYERPOSR);
		pen.CreatePen(PS_SOLID,1,SELECTCOLOR);
		dc.SelectObject(&pen);
		brush.DeleteObject();
		brush.CreateSolidBrush(SELECTCOLOR);
		dc.SelectObject(&brush);
		dc.Ellipse(PLAYER2POSX-PLAYERPOSR,PLAYER2POSY-PLAYERPOSR,PLAYER2POSX+PLAYERPOSR,PLAYER2POSY+PLAYERPOSR);
	
		pen.DeleteObject();
		brush.DeleteObject();

		m_GameMode=TRUE;
		}
	    break;
	case VK_ESCAPE:
		PostQuitMessage(0);
		break;
	case VK_RETURN://进入游戏
        m_Stage=1;
		InitGameDat();
        m_GameStart=TRUE;
		Invalidate(FALSE);
		CSnakeView::SetTimer(IDT_MOVE,m_Speed,NULL);
		break;
	default:
		break;
	}
	}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -