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

📄 experiment.c

📁 综合实验源代码-汉诺塔
💻 C
字号:
/*
 *汉诺塔实验程序
 *Experiment.c
 */

#include"..\ucos-ii\includes.h"          
#include "..\ucos-ii\add\osaddition.h"
#include"..\inc\osfile.h"
#include"..\inc\drv\rtc.h"
#include "..\inc\drv.h"
#include <string.h>
#include "..\ucos-ii\add\list.h"
#include "..\inc\drv\figure.h"
#include "..\inc\drv\display.h"
#include "..\inc\maro.h"
#include "..\template.h"
#include"..\inc\experiment.h"

char picturetest[12]={'T','E','S','T','1',' ',' ',' ','B','M','P',0};


//定义框架,为其他显示内容提供相对坐标
structPOINT pF_Hori1_Start={FRAME_HORI1_STARTx,FRAME_HORI1_STARTy};
structPOINT pF_Hori1_End={FRAME_HORI1_ENDx,FRAME_HORI1_ENDy};
structPOINT pF_Hori2_Start={FRAME_HORI2_STARTx,FRAME_HORI2_STARTy};
structPOINT pF_Hori2_End={FRAME_HORI2_ENDx,FRAME_HORI2_ENDy};

structPOINT pI_Hori1_Start={INSIDE_HORI1_STARTx,INSIDE_HORI1_STARTy};
structPOINT pI_Hori1_End={INSIDE_HORI1_ENDx,INSIDE_HORI1_ENDy};

structPOINT pI_Vert1_Start={INSIDE_VERT1_STARTx,INSIDE_VERT1_STARTy};
structPOINT pI_Vert1_End={INSIDE_VERT1_ENDx,INSIDE_VERT1_ENDy};
structPOINT pI_Vert2_Start={INSIDE_VERT2_STARTx,INSIDE_VERT2_STARTy};
structPOINT pI_Vert2_End={INSIDE_VERT2_ENDx,INSIDE_VERT2_ENDy};
structPOINT pI_Vert3_Start={INSIDE_VERT3_STARTx,INSIDE_VERT3_STARTy};
structPOINT pI_Vert3_End={INSIDE_VERT3_ENDx,INSIDE_VERT3_ENDy};

structPOINT pText1_Start={TEXT1_STARTx, TEXT1_STARTy};
structPOINT pText2_Start={TEXT2_STARTx,TEXT2_STARTy};
structPOINT pText3_Start={TEXT3_STARTx,TEXT3_STARTy};
structPOINT pText4_Start={TEXT4_STARTx,TEXT4_STARTy};

structPOINT pRF_Hori1_Start={RIGHT_HORI1_STARTx,RIGHT_HORI1_STARTy};
structPOINT pRF_Hori1_End={RIGHT_HORI1_ENDx,RIGHT_HORI1_ENDy};

//全局变量
PListCtrl2 pGameMenu;
structRECT Menu_Rect={25,30,120,105};//右上角的两个按钮
structRECT Frame_Down={INSIDE_HORI1_STARTx,INSIDE_HORI1_STARTy,FRAME_HORI2_ENDx,FRAME_HORI2_ENDy};
structRECT Frame_Up={FRAME_HORI1_STARTx,FRAME_HORI1_STARTy,INSIDE_HORI1_ENDx,INSIDE_HORI1_ENDy};
PTextCtrl  pTextCtrl1,pTextCtrl2,pTextCtrl3,pTextCtrl4;
U8 PillarA[MAX_LEVEL];
U8 PillarB[MAX_LEVEL];
U8 PillarC[MAX_LEVEL];

char GAME_Menu_0[]="Game Start";    //  游戏开始     
char GAME_Menu_1[]="Set  Level";    //  设定层数   
char *GAME_Menu[]={GAME_Menu_0,GAME_Menu_1}; 

char Text1[10]="LEVEL:";
char Text2[10]="MOVES:";
char Text3[5]="3";
char Text4[5]="0";
char*Text[]={Text1,Text2,Text3,Text4};

U8 Height=3;		//游戏层数
U8 Count;			//移动次数

BOOLEAN  Game_End=TRUE;		//游戏状态

void init()		//数据初始化
{
	int i;
	for(i=0;i<MAX_LEVEL;i++)
	{
		PillarA[i]=0;
		PillarB[i]=0;
		PillarC[i]=0;
	}
}

void show()		//重新绘图
{
	int i;
	int j;

	PDC pdc;
	pdc=CreateDC();

	OSTimeDly(1000);


	InitFrameDown();

	for(i=0;i<MAX_LEVEL;i++)
	{
		if(PillarA[i]!=0)
		{
			FillRect(pdc, (INSIDE_VERT1_STARTx-12-PillarA[i]*5),(215-i*17),
				(INSIDE_VERT1_STARTx+18+PillarA[i]*5), (230-i*17) ,0x00,0x00000000);
		}
	}

	for(i=0;i<MAX_LEVEL;i++)
	{	
		if(PillarB[i]!=0)
		{
			FillRect(pdc, (INSIDE_VERT2_STARTx-12-PillarB[i]*5),(215-i*17),
				(INSIDE_VERT2_STARTx+18+PillarB[i]*5), (230-i*17) ,0x00,0x00000000);
		}
	}

	for(i=0;i<MAX_LEVEL;i++)
	{	
		if(PillarC[i]!=0)
		{
			FillRect(pdc, (INSIDE_VERT3_STARTx-12-PillarC[i]*5),(215-i*17),
				(INSIDE_VERT3_STARTx+18+PillarC[i]*5), (230-i*17) ,0x00,0x00000000);
		}
	}


	DestoryDC(pdc);
}

void hanoii()		//汉诺塔主程序入口
{

	int i;
	for(i=0;i<Height;i++)
		PillarA[i]=MAX_LEVEL-i;
	show();
	showCount();
	hanoi(PillarA,PillarB,PillarC,Height);
	Game_End=TRUE;
	Count=0;
}

void hanoi(U8* a,U8* b,U8* c,U8 h)		//汉诺塔递归程序
{
	if(h==1)
		move(a,c);
	else
	{
		hanoi(a,c,b,h-1);
		move(a,c);
		hanoi(b,a,c,h-1);
	}
}

void move(U8* x,U8* y)		//移动盘子
{
	int temp;
	int i;
	Count=Count+1;
	for(i=MAX_LEVEL-1;i>=0;i--)
	{
		if(x[i]>0)
		{
			temp=x[i];
			x[i]=0;
			break;
		}
	}
	for(i=0;i<MAX_LEVEL;i++)
	{
		if(y[i]==0)
		{
			y[i]=temp;
			break;
		}
	}
	show();
	showCount();
}

void setHeight(U8 h)	//设定层数
{
    U16 str3[5];
	  
	Int2Unicode((int)h,str3);
    SetWndCtrlFocus(NULL,ID_TEXTCtrl3);
    SetTextCtrlText(pTextCtrl3, str3, TRUE);
    DrawTextCtrl(pTextCtrl3);

	Height=h;
}

void showCount()		//刷新移动次数
{
    U16 str4[10];
	  
	Int2Unicode((int)Count,str4);
    SetWndCtrlFocus(NULL,ID_TEXTCtrl4);
    SetTextCtrlText(pTextCtrl4, str4, TRUE);
    DrawTextCtrl(pTextCtrl4);
}

void InitInterface()	//界面初始化
{      
     InitFrameDown();   //画游戏框    
     InitFrameUp();     //画控制框
     InitCtrl();
     InitText();
}

//初始化控件:
 void InitText()		//文本框初始化  
{
      U16 str1[30],str2[30],str3[10],str4[10];
      structRECT rect1,rect2,rect3,rect4;
	  
      SetRect(&rect1, pText1_Start.x,pText1_Start.y,pText1_Start.x+60,pText1_Start.y+30); //矩形左上角作为起始点
      pTextCtrl1=CreateTextCtrl(ID_TEXTCtrl1, &rect1, FONTSIZE_MIDDLE, CTRL_STYLE_NOFRAME, NULL, NULL);
      strChar2Unicode(str1, Text1);
      SetWndCtrlFocus(NULL,ID_TEXTCtrl1);
      SetTextCtrlText(pTextCtrl1, str1, TRUE);
      DrawTextCtrl(pTextCtrl1);
     
      SetRect(&rect2, pText2_Start.x,pText2_Start.y,pText2_Start.x+60,pText2_Start.y+30);
      pTextCtrl2=CreateTextCtrl(ID_TEXTCtrl2,&rect2,FONTSIZE_MIDDLE,CTRL_STYLE_NOFRAME,NULL,NULL);
      strChar2Unicode(str2, Text2);
      SetWndCtrlFocus(NULL,ID_TEXTCtrl2);
      SetTextCtrlText(pTextCtrl2,str2,TRUE);
      DrawTextCtrl(pTextCtrl2); 
	
      SetRect(&rect3,pText3_Start.x,pText3_Start.y,pText3_Start.x+40,pText3_Start.y+30);
      pTextCtrl3=CreateTextCtrl(ID_TEXTCtrl3,&rect3,FONTSIZE_MIDDLE,CTRL_STYLE_NOFRAME,NULL,NULL);
      strChar2Unicode(str3,Text3);
      SetWndCtrlFocus(NULL,ID_TEXTCtrl3);
      SetTextCtrlText(pTextCtrl3,str3,TRUE);
      DrawTextCtrl(pTextCtrl3); 

      SetRect(&rect4,pText4_Start.x,pText4_Start.y,pText4_Start.x+40,pText4_Start.y+30);
      pTextCtrl4=CreateTextCtrl(ID_TEXTCtrl4,&rect4,FONTSIZE_MIDDLE,CTRL_STYLE_NOFRAME,NULL,NULL);
      strChar2Unicode(str4,Text4);
      SetWndCtrlFocus(NULL,ID_TEXTCtrl4);
      SetTextCtrlText(pTextCtrl4,str4,TRUE);
      DrawTextCtrl(pTextCtrl4);

}

void InitCtrl()			//菜单初始化
{
      structRECT rect;
      int i=0;
      U16 str[15];
      SetRect(&rect, Menu_Rect.left,Menu_Rect.top,Menu_Rect.right,Menu_Rect.bottom); //矩形左上角作为起始点

      pGameMenu=(PListCtrl2)CreateListCtrl(ID_GAME_MENU, &rect, 2, FONTSIZE_MIDDLE, CTRL_STYLE_NOFRAME, NULL);
      CreateListCtrl2Patch(pGameMenu, 10, FALSE);
      while(i<2)
	  {
		strChar2Unicode(str, GAME_Menu[i]);
      	AddStringListCtrl((PListCtrl)pGameMenu,str);
      	i++;
      }
	DrawListCtrl2(pGameMenu);
} 

void InitFrameDown()		//游戏框初始化
{ 
      PDC pdc;
      structRECT rect;
      
      pdc=CreateDC();
      CopyRect(&rect, &Frame_Down);
	  FillRect2(pdc,&rect,0x00,0x00ffffff);
      DrawDBFrameRect2( pdc, &rect);//画棋盘的边框
      VerticalLine(pdc,INSIDE_VERT1_STARTx,INSIDE_VERT1_STARTy,INSIDE_VERT1_ENDx,INSIDE_VERT1_ENDy);
      VerticalLine(pdc,INSIDE_VERT2_STARTx,INSIDE_VERT2_STARTy,INSIDE_VERT2_ENDx,INSIDE_VERT2_ENDy);
      VerticalLine(pdc,INSIDE_VERT3_STARTx,INSIDE_VERT3_STARTy,INSIDE_VERT3_ENDx,INSIDE_VERT3_ENDy);

      DestoryDC(pdc);
}

void InitFrameUp()		//控制框初始化
{
	PDC pdc;
	structRECT rect;

	pdc=CreateDC();
	CopyRect(&rect,&Frame_Up);
	DrawDBFrameRect2(pdc, &rect);
	DestoryDC(pdc);
}


//自行编制的消息响应函数

void onKey(int nkey, int fnkey )
{
	PListCtrl2 plc=(PListCtrl2)pGameMenu;

    switch(nkey){
	case 2:
		if(plc->CurrentSel==Menu_GameSet)
		{
			setHeight(3);
		}
		break;
	case 4:
		if(plc->CurrentSel==Menu_GameSet)
		{
			setHeight(4);
		}
		break;
	case 5:
		if(plc->CurrentSel==Menu_GameSet)
		{
			setHeight(5);
		}
		break;
	case 6:
        if(plc->CurrentSel==Menu_GameSet)
		{
			setHeight(6);
		}
		break;	
	case 3:
		ListCtrl2SelMove(pGameMenu, -1, TRUE);
		break;
	case 7:
		ListCtrl2SelMove(pGameMenu, 1, TRUE);
		break;
    case 11:
		SelectOK(plc);
		break;
		
		}
}

void SelectOK(PListCtrl2 plc)		//确定键响应
{
	
	if(plc->CtrlID==ID_GAME_MENU)	
	{
		if(plc->CurrentSel==Menu_GameStart)
		{
			ListCtrl2SelMove(pGameMenu, 1, TRUE);
			init();
			hanoii();		//开始游戏
		}
	}
}

⌨️ 快捷键说明

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