c语言控制台的俄罗斯方块

转载 2013年12月01日 23:33:21
#include "stdafx.h"
#include "plane.h"
#include "myPlane.h"
#include "missile.h"
#define NUM 3
LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM );
HWND hwnd;
HDC hdc;
plane p[NUM];
myPlane *my_plane = new myPlane((COLS-3)/2,ROWS-3);
missile *ml = new missile((COLS-3)/2,ROWS-3);
UINT timer_id = 0;
UINT timer_missile = 0;
int interval_base=100;
HBRUSH h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),
	h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );

byte g_panel[ROWS][COLS] = {0};
int main()
{
	HINSTANCE hInstance=GetModuleHandle ( NULL );
	TCHAR szAppName[]=TEXT ( "teris" );
	MSG msg;
	WNDCLASS wc;
	srand ( time (  NULL ) );
	int temp2 = 0,temp1 = 0;
	for(int i = 0; i<NUM; i++)
	{
 		p[i].cur_top=-(rand()%10);
 		p[i].cur_left = rand()%15;		

	}

	wc.style=CS_HREDRAW|CS_VREDRAW;
	wc.lpfnWndProc=WndProc;
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hIcon=LoadIcon ( NULL,IDI_APPLICATION );
	wc.hCursor=LoadCursor ( NULL,IDC_ARROW );
	wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
	wc.lpszMenuName=NULL;
	wc.lpszClassName=szAppName;
	if ( !RegisterClass ( &wc ) )
	{
		printf ( "RegisterClass occur errors!" );
		return 0;
	}
	hwnd=CreateWindow ( szAppName,TEXT ( "Teris Demo" ),
		WS_OVERLAPPEDWINDOW,
		0,0,0,0,
		NULL,
		NULL,
		hInstance,
		NULL );
	ShowWindow ( hwnd,SW_SHOW );
	UpdateWindow ( hwnd );
	while ( GetMessage ( &msg,NULL,0,0 ) )
	{
		TranslateMessage ( &msg );
		DispatchMessage ( &msg );
	}
	return msg.wParam;
}

void DrawPanel ( HDC hdc )  		//绘制游戏面板
{
	int x,y;
	RECT rect;

	for ( y=0; y<ROWS; y++ )
	{
		for ( x=0; x<COLS; x++ )
		{
			//计算方块的边框范围
			rect.top=y*CELL+1;
			rect.bottom= ( y+1 ) *CELL-1;
			rect.left=x*CELL+1;
			rect.right= ( x+1 ) *CELL-1;
			FrameRect ( hdc,&rect, ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) );
		}
	}
}
void RefreshPanel( HDC hdc )
{
	int x,y;
	RECT rect;

	//先刷屏
	for ( y=0; y<ROWS; y++ )
	{
		for ( x=0; x<COLS; x++ )
		{ 
			//为避免刷掉方块的边框,rect范围必须比边框范围小1
			rect.top=y*CELL+2;
			rect.bottom= ( y+1 ) *CELL-2;
			rect.left=x*CELL+2;
			rect.right= ( x+1 ) *CELL-2;
			if ( 1 == g_panel[y][x] )
				FillRect ( hdc,&rect,h_bSolid);
			else
			{
				FillRect ( hdc,&rect,h_bEmpty);
				//MessageBox(NULL,"123","123",NULL);
			}
		}
	}
	//再定位方块
	for(int i=0; i<NUM; i++)
	{
		if ( NULL==p[i].block ) 
		{
			//printf("%d\n",i);
			continue;
		}
		p[i].drawPlane(hdc,h_bSolid);
		//printf("%d\n",i);
	}
	
	my_plane->drawPlane(hdc,h_bSolid);
	ml->drawMissile(hdc);
	//my_plane1.drawPlane(hdc,h_bSolid);
	
}
void CALLBACK myFunc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
	
	hdc=GetDC ( hwnd );
	p[idEvent].flight(hwnd,hdc);
	RefreshPanel ( hdc );
	ReleaseDC ( hwnd,hdc );

}
void CALLBACK SendMissle(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
	hdc = GetDC(hwnd);
	my_plane->ShootMissile(hdc);
	RefreshPanel(hdc);
	ReleaseDC(hwnd,hdc);
}
LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
	PAINTSTRUCT ps;
	switch ( message )
	{
	case WM_CREATE:
		MoveWindow ( hwnd,400,10,CELL*30,CELL*40,FALSE );		//补齐宽度和高度
		for(int i=0; i<NUM;i++)
			timer_id=SetTimer ( hwnd,i,interval_base,(TIMERPROC)myFunc);
		
		//SetTimer(hwnd,100,interval_base,(TIMERPROC)SendMissle);
		return 0;
 	case WM_KEYDOWN:
 		hdc=GetDC ( hwnd );
 		switch ( wParam )
 		{
  		case VK_LEFT:							//左移
  			 my_plane->DoLeftShift ( hdc );
  			break;
  		case VK_RIGHT:							//右移
  			 my_plane->DoRightShift ( hdc );
  			break;
  		case VK_UP:								//转向
  			 my_plane->DoUpShift ( hdc );
  			break;
  		case VK_DOWN:							//加速
  			 my_plane->DoDownShift( hdc );
  			break;
 		case VK_SPACE:	//发射
			
			if(ml->m_block)
				timer_missile = SetTimer ( hwnd,100,interval_base,(TIMERPROC)SendMissle);
			else
			{
				missile *ml = new missile((COLS-3)/2,ROWS-3);
				ml->drawMissile(hdc);
				timer_missile = SetTimer ( hwnd,100,interval_base,(TIMERPROC)SendMissle);
			}
			//timer_missile = SetTimer ( hwnd,100,interval_base,(TIMERPROC)myFunc);
//  			isPause=!isPause;
//  			if ( isPause )
//  			{
//  				if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
//  				timer_id=0;
//  			}
//  			else
//  			{
//  				timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,FALSE );
//  			}
			//my_plane->ShootMissile(hdc);
 			break;
  		}
  		ReleaseDC ( hwnd,hdc );
  		return 0;
	case WM_PAINT:
		hdc=BeginPaint ( hwnd,&ps );
		DrawPanel ( hdc );			//绘制面板
		RefreshPanel ( hdc );		//刷新
		EndPaint ( hwnd,&ps );
		return 0;
	case WM_DESTROY:
		//if ( block ) free ( block );
		if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
		PostQuitMessage ( 0 );
		return 0;
	}
	return DefWindowProc ( hwnd,message,wParam,lParam );
}
	

C语言-控制台俄罗斯方块

求改进
  • Bugggget
  • Bugggget
  • 2017年04月03日 16:38
  • 1626

纯C语言实现的控制台俄罗斯方块

  • 2017年04月17日 21:12
  • 10KB
  • 下载

C语言图形编程--俄罗斯方块制作(一)详解

效果图   用C语言实现俄罗斯方块,需要先解决下面几个问题: 1、如何用C语言绘制图形界面 EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。   包含库#in...
  • yang_yulei
  • yang_yulei
  • 2013年12月29日 22:38
  • 118444

C语言版 彩色俄罗斯方块 控制台输出

源码:  ///////////////////////////////////////////////////////////////////////////////////////////////...
  • u014726694
  • u014726694
  • 2015年10月28日 14:52
  • 2456

VC++ 6.0 C语言实现俄罗斯方块教程

今天把我之前写的大作业分享一下吧,并教你们如何实现,希望你们看了前面的教程也能自己写一个。 1.要先下载一个 graphics.h 的头文件来绘图。 2.初始化窗口:initgraph(x, y);这...
  • ZengAMing
  • ZengAMing
  • 2015年08月19日 20:29
  • 9408

C语言-控制台俄罗斯方块

求改进
  • Bugggget
  • Bugggget
  • 2017年04月03日 16:38
  • 1626

LOVE 彩色控制台俄罗斯方块(WIN32 C语言)v1.13

  • 2015年07月04日 20:42
  • 15KB
  • 下载

LOVE 彩色控制台俄罗斯方块(WIN32 C语言)v1.12

  • 2015年07月02日 09:20
  • 747KB
  • 下载

纯C语言实现的控制台俄罗斯方块

  • 2017年04月17日 21:12
  • 10KB
  • 下载

LOVE 彩色控制台俄罗斯方块(WIN32 C语言)v1.13.1

  • 2015年07月05日 14:33
  • 55KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言控制台的俄罗斯方块
举报原因:
原因补充:

(最多只允许输入30个字)