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

📄 game.c

📁 labview程序编程技巧演示
💻 C
字号:
#include <ansi_c.h>
#include <utility.h>
#include "game.h"
static int i = 0;
static char *data ;
static int hh = 9;
static int vv = -8;

//定义ball,bar,panel1为结构体类型变量
struct porperty{
	int left;
	int top;
	int width;
	int height;
}ball,bar,panel1;
static int setpanelhandle;  
static int panelHandle;
int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "game.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);

	//获得面板的高,并将其值传给panel1.height
	GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);   
	
	//设置bar的高为panel的高减去20
	SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, panel1.height-20);
	RunUserInterface ();
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK panelcb (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	int lowerasc;
	int vk;
	int asc;
	int barleft; 
	switch (event)
	{
		//响应键盘事件
		case EVENT_KEYPRESS:
		
			//按键ASCII码值
			vk=eventData1 & VAL_VKEY_MASK;	
			
			//虚拟键的键值
			asc=eventData1 & VAL_ASCII_KEY_MASK;
			
			//如果按键为大写字母则将其转换为小写
			lowerasc = tolower (asc);
			switch (vk)
			{
				//如果按键为虚拟键→,则将bar右移40
				case VAL_RIGHT_ARROW_VKEY:
					GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
					SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft+40);
					break;
				
				//如果按键为虚拟键←,则将bar左移40	
				case VAL_LEFT_ARROW_VKEY:
					GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
					SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft-40);   					
					break;
			}
			switch (lowerasc)
			{
				//如果按下的键为"d",则将bar右移40
				case 'd':
					GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
					SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft+40);   					
					break;
				
				//如果按下的键为"a",则将bar左移40	
				case 'a':
					GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &barleft);
					SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, barleft-40);   					
					break;
			}
			break;
		case EVENT_CLOSE:
			QuitUserInterface (0);
			break;
		case EVENT_PANEL_SIZE:
			
			//当面板的尺寸发生改变,则重新获取面板的高度,将bar的高度改为当前面板的高度减去20
	        GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);   
	        SetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, panel1.height-20);
			break;
	}
	return 0;
}

int CVICALLBACK timer (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_TIMER_TICK: 
			 i++;
			 
			 //每隔设定的时间,对bar、ball、panel重新获得位置属性
			 GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_LEFT, &bar.left);
			 GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_TOP, &bar.top);
			 GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_HEIGHT, &bar.height);
			 GetCtrlAttribute (panelHandle, PANEL_BAR, ATTR_WIDTH, &bar.width);
			 GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, &ball.left);
			 GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, &ball.top);
			 GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_HEIGHT, &ball.height);
			 GetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_WIDTH, &ball.width);
			 GetPanelAttribute (panelHandle, ATTR_WIDTH, &panel1.width);
			 GetPanelAttribute (panelHandle, ATTR_HEIGHT, &panel1.height);
			 
			  //如果ball弹到面板的左右两臂则按相反方向弹回
			 if ((ball.left <= 0) || ((ball.left+ball.width) >= panel1.width))
			 {
				
				//改变方向
				hh = hh * (-1); 
				
				//响声
				Beep();
			 }
			 
			 //如果ball弹到面板的上部或是谈到bar上面,则按相反方向弹回
			 if ((ball.top <= 0) || ((ball.top >= bar.top-10) && (ball.left >= bar.left) && (ball.left <= bar.left+bar.width))						  )
			 {
				vv = vv * (-1); 
				Beep();
			 }
			 ball.left = ball.left+hh;
			 ball.top = ball.top+vv;
			 SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, ball.left);
			 SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, ball.top);
			 
			  //当ball未被bar接住,而弹出面板,则弹出面板PANEL_SET
			 if (ball.top > bar.top + 40)
			 {
				 SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);
				 
				 //将面板PANEL_SET载入
				 setpanelhandle = LoadPanel (0, "game.uir", PANEL_SET);
				 
				 //弹出面板PANEL_SET
				 InstallPopup (setpanelhandle);
				 
				 //将当前timer回调函数所执行的次数计作分数赋值给PANEL_SET_NUMERIC
				 SetCtrlVal (setpanelhandle, PANEL_SET_NUMERIC, (int) (i / 20));  
				 
				 //获取当前的日期
				 data = DateStr ();
				 SetCtrlVal (setpanelhandle, PANEL_SET_STRING, data ); 
			 }		 
			break;
	}
	return 0;
}

int CVICALLBACK ok (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
            hh = 9;
            vv = -8;
			SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_TOP, 50);
			SetCtrlAttribute (panelHandle, PANEL_BALL, ATTR_LEFT, 50);
			SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1);
			DiscardPanel (setpanelhandle); 
			break;
	}
	return 0;
}

int CVICALLBACK exitsys (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			 QuitUserInterface (0);
			break;
	}
	return 0;
}

⌨️ 快捷键说明

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