📄 experiment.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 + -