📄 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"
//定义框架,为其他显示内容提供相对坐标
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_Hori2_Start={INSIDE_HORI2_STARTx,INSIDE_HORI2_STARTy};
structPOINT pI_Hori2_End={INSIDE_HORI2_ENDx,INSIDE_HORI2_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 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 pText5_Start={TEXT5_STARTx,TEXT5_STARTy};
structPOINT pRF_Hori1_Start={RIGHT_HORI1_STARTx,RIGHT_HORI1_STARTy};
structPOINT pRF_Hori1_End={RIGHT_HORI1_ENDx,RIGHT_HORI1_ENDy};
structPOINT pRF_Hori2_Start={RIGHT_HORI2_STARTx,RIGHT_HORI2_STARTy};
structPOINT pRF_Hori2_End={RIGHT_HORI2_ENDx,RIGHT_HORI2_ENDy};
//全局变量
PListCtrl2 pGameMenu;
structRECT Menu_Rect={242,190,300,240};//井字棋右下脚的两个按钮
structRECT Frame_Left={FRAME_HORI1_STARTx,FRAME_HORI1_STARTy,FRAME_HORI2_ENDx,FRAME_HORI2_ENDy};
structRECT Frame_Right={RIGHT_HORI1_STARTx,RIGHT_HORI1_STARTy,RIGHT_HORI2_ENDx,RIGHT_HORI2_ENDy};
PTextCtrl pTextCtrl1,pTextCtrl2,pTextCtrl3,pTC_Winner1,pTC_Winner2;
U8 ChessBoardMap[9]={0,0,0,0,0,0,0,0,0};//用于指示棋盘上
//落棋的情况,1表示该位置为微笑的苹果,
// 2表示该位置为悠闲的小鸟
//0 表示该位置为空
char cAd_Pic[12]={'6','8','_','7','0',' ',' ',' ','B','M','P',0}; //图片
char Chess1_Pic[12]={'6','0','_','6','0',' ',' ',' ','B','M','P',0}; //微笑的苹果图片
char Chess2_Pic[12]={'6','0','_','6','1',' ',' ',' ','B','M','P',0}; //悠闲的小鸟图片
char Winner_Apple_Pic[12]={'0','0','_','0','0',' ',' ',' ','B','M','P',0};
char Winner_Bird_Pic[12]={'0','0','_','0','1',' ',' ',' ','B','M','P',0};
char GAME_Menu_0[]="Game Start"; // 游戏开始
char GAME_Menu_1[]="Chess Down"; // 落棋位置确定
char *GAME_Menu[]={GAME_Menu_0,GAME_Menu_1};
char Text1[15]="FIRST:APPLE";
char Text2[15]="NOW: APPLE";
char Text3[30]="Winner:";
char*Text[]={Text1,Text2,Text3};
extern int Tag_Glint_Position;
extern structPOINT* Tag_Glint_StartPoints[9];
U8 WhoToPlay=0; //判断当前该由谁下的一个变量
U8 Chess_No=0; // 棋盘上棋子的总数目
BOOLEAN Chess_End=FALSE;
void InitInterface()
{
InitFrameLeft(); //画棋盘
InitFrameRight(); //画右边的界面
InitPicture(); //显示图片
InitMenu();
InitText();
}
//初始化程序全局数据
void InitData(){
U16 winner[15];
int i;
for(i=0;i<9;i++)
ChessBoardMap[i]=0;
Tag_Glint_Position=4;
WhoToPlay=0;
Chess_No=0;
Chess_End=FALSE;
strChar2Unicode(winner, "");
SetWndCtrlFocus(NULL,ID_TEXTCtrl4);
SetTextCtrlText(pTC_Winner1, winner, TRUE);
DrawTextCtrl(pTC_Winner1);
strChar2Unicode(winner, "");
SetWndCtrlFocus(NULL,ID_TEXTCtrl5);
SetTextCtrlText(pTC_Winner2, winner, TRUE);
DrawTextCtrl(pTC_Winner2);
}
//初始化控件: 帮助列表框
void InitText()
{
U16 str1[30],str2[30],str3[10];
structRECT rect1,rect2,rect3,rect4,rect5;
SetRect(&rect1, pText1_Start.x,pText1_Start.y,pText1_Start.x+73,pText1_Start.y+18); //矩形左上角作为起始点
pTextCtrl1=CreateTextCtrl(ID_TEXTCtrl1, &rect1, FONTSIZE_SMALL, CTRL_STYLE_3DUPFRAME, 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+25);
pTextCtrl2=CreateTextCtrl(ID_TEXTCtrl2,&rect2,FONTSIZE_SMALL,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+60,pText3_Start.y+25);
pTextCtrl3=CreateTextCtrl(ID_TEXTCtrl3,&rect3,FONTSIZE_SMALL,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+50,pText4_Start.y+25);
pTC_Winner1=CreateTextCtrl(ID_TEXTCtrl4,&rect4,FONTSIZE_SMALL,CTRL_STYLE_NOFRAME,NULL,NULL);
SetRect(&rect5,pText5_Start.x,pText5_Start.y,pText5_Start.x+50,pText5_Start.y+25);
pTC_Winner2=CreateTextCtrl(ID_TEXTCtrl5,&rect5,FONTSIZE_SMALL,CTRL_STYLE_NOFRAME,NULL,NULL);
}
void InitMenu()
{
structRECT rect;
int i=0;
U16 str[15];
SetRect(&rect, Menu_Rect.left,Menu_Rect.top,Menu_Rect.right-20,Menu_Rect.bottom); //矩形左上角作为起始点
//PListCtrl pHelp;
pGameMenu=(PListCtrl2)CreateListCtrl(ID_GAME_MENU, &rect, 2, FONTSIZE_SMALL, CTRL_STYLE_NOFRAME, NULL);
CreateListCtrl2Patch(pGameMenu, 10, FALSE);
while(i<2){
strChar2Unicode(str, GAME_Menu[i]);
AddStringListCtrl((PListCtrl)pGameMenu,str);
i++;
}
DrawListCtrl2(pGameMenu);
}
void InitFrameLeft()
{
PDC pdc;
structRECT rect;
pdc=CreateDC();
CopyRect(&rect, &Frame_Left);
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);
HorizonLine(pdc,INSIDE_HORI1_STARTx,INSIDE_HORI1_STARTy,INSIDE_HORI1_ENDx,INSIDE_HORI1_ENDy);
HorizonLine(pdc,INSIDE_HORI2_STARTx,INSIDE_HORI2_STARTy,INSIDE_HORI2_ENDx,INSIDE_HORI2_ENDy);
DestoryDC(pdc);
}
void InitFrameRight(){
PDC pdc;
structRECT rect;
pdc=CreateDC();
CopyRect(&rect,&Frame_Right);
DrawDBFrameRect2(pdc, &rect);
DestoryDC(pdc);
}
void InitPicture() //显示图片
{
PDC pdc;
pdc=CreateDC();
FillRect( pdc,240+6,6,320-6,80,GRAPH_MODE_NORMAL, COLOR_WHITE);
ShowBmp( pdc, cAd_Pic,240+6,6);
DestoryDC(pdc);
}
void DrawChess(){
PDC pdc;
S32 Startx,Starty;
char temp1[15]="NOW:APPLE";
char temp2[15]="NOW:BIRD";
U16 text[15];
pdc=CreateDC();
Startx=Tag_Glint_StartPoints[Tag_Glint_Position]->x;
Starty=Tag_Glint_StartPoints[Tag_Glint_Position]->y-60;
if(ChessBoardMap[Tag_Glint_Position]==0&&Chess_End!=TRUE){
Chess_No++;
pdc=CreateDC();
Startx=Tag_Glint_StartPoints[Tag_Glint_Position]->x;
Starty=Tag_Glint_StartPoints[Tag_Glint_Position]->y-60;
if(WhoToPlay==0){
strChar2Unicode(text, temp2);
SetWndCtrlFocus(NULL,ID_TEXTCtrl2);
SetTextCtrlText(pTextCtrl2,text,TRUE);
DrawTextCtrl(pTextCtrl2);
ChessBoardMap[Tag_Glint_Position]=1;
FillRect( pdc,Startx,Starty,Startx+60,Starty+60,GRAPH_MODE_NORMAL, COLOR_WHITE);
ShowBmp( pdc, Chess1_Pic,Startx,Starty);
WhoToPlay=1;
}
else{
//Text2="NOW:APPLE";
strChar2Unicode(text, temp1);
SetWndCtrlFocus(NULL,ID_TEXTCtrl2);
SetTextCtrlText(pTextCtrl2,text,TRUE);
DrawTextCtrl(pTextCtrl2);
ChessBoardMap[Tag_Glint_Position]=2;
FillRect( pdc,Startx,Starty,Startx+60,Starty+60,GRAPH_MODE_NORMAL, COLOR_WHITE);
ShowBmp( pdc, Chess2_Pic,Startx,Starty);
WhoToPlay=0;
}
DestoryDC(pdc);
WhoWins();
}
}
void ClearOldTag(){
U8 Position;
PDC pdc;
pdc=CreateDC();
SetPenColor(pdc,RGB(255,255,255));
Position=Tag_Glint_Position;
MoveTo(pdc,Tag_Glint_StartPoints[Position]->x,Tag_Glint_StartPoints[Position]->y);
LineTo(pdc,Tag_Glint_StartPoints[Position]->x+60,Tag_Glint_StartPoints[Position]->y);
MoveTo(pdc,Tag_Glint_StartPoints[Position]->x,Tag_Glint_StartPoints[Position]->y+1);
LineTo(pdc,Tag_Glint_StartPoints[Position]->x+60,Tag_Glint_StartPoints[Position]->y+1);
MoveTo(pdc,Tag_Glint_StartPoints[Position]->x,Tag_Glint_StartPoints[Position]->y+2);
LineTo(pdc,Tag_Glint_StartPoints[Position]->x+60,Tag_Glint_StartPoints[Position]->y+2);
DestoryDC(pdc);
}
//自行编制的消息响应函数
void onKey(int nkey, int fnkey )
{ U8 Position;
PDC pdc;
switch(nkey){
case 1:
Position=Tag_Glint_Position;
if(Position>2){
ClearOldTag();
Tag_Glint_Position-=3; //光标上移一格
}
break;
case 4:
Position=Tag_Glint_Position;
if(Position!=0&&Position!=3&&Position!=6){
ClearOldTag();
Tag_Glint_Position-=1;}
break;
case 6:
Position=Tag_Glint_Position;
if(Position!=2&&Position!=5&&Position!=8){
ClearOldTag();
Tag_Glint_Position++;
}
break;
case 9:
Position=Tag_Glint_Position;
if(Position<6){
ClearOldTag();
Tag_Glint_Position+=3;
}
break;
case 3:
ListCtrl2SelMove(pGameMenu, -1, TRUE);
break;
case 7:
ListCtrl2SelMove(pGameMenu, 1, TRUE);
break;
case 11:
SelectOK((PListCtrl2)pGameMenu);
break;
}
}
void SelectOK(PListCtrl2 plc){
PDC pdc;
structRECT rect;
if(plc->CtrlID==ID_GAME_MENU){
if(plc->CurrentSel==Menu_GameStart){
InitData();
pdc=CreateDC();
rect=Frame_Left;
FillRect2(pdc, &rect,GRAPH_MODE_NORMAL||COLOR_WHITE,RGB(255,255,255));
DestoryDC(pdc);
InitFrameLeft();
}
else
DrawChess();
}
}
void SmillingAppleWins(){
U16 winner[10];
PDC pdc;
strChar2Unicode(winner, "Apple");
SetWndCtrlFocus(NULL,ID_TEXTCtrl4);
SetTextCtrlText(pTC_Winner1, winner, TRUE);
DrawTextCtrl(pTC_Winner1);
Chess_End=TRUE;
pdc=CreateDC();
ShowBmp( pdc, Winner_Apple_Pic,30,50);
DestoryDC(pdc);
}
void LeisurefulBirdWins(){
U16 winner[10];
PDC pdc;
strChar2Unicode(winner, "Bird");
SetWndCtrlFocus(NULL,ID_TEXTCtrl5);
SetTextCtrlText(pTC_Winner2, winner, TRUE);
DrawTextCtrl(pTC_Winner2);
Chess_End=TRUE;
pdc=CreateDC();
ShowBmp( pdc, Winner_Bird_Pic,130,50);
DestoryDC(pdc);
}
void WhoWins(){
BOOLEAN BothWins=TRUE;
//以下为纵向的判断
if((Tag_Glint_Position<3)&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+3]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+6]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
else if((Tag_Glint_Position>5)&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-3]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-6]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
else if(ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-3]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+3]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
//以下为横向的的判断
if((Tag_Glint_Position%3==0)&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+1]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+2]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
else if((Tag_Glint_Position%3==1)&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-1]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position+1]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins();BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
else if(ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-1]
&&ChessBoardMap[Tag_Glint_Position]==ChessBoardMap[Tag_Glint_Position-2]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
//以下为交叉方向的判断
if((Tag_Glint_Position==4||Tag_Glint_Position==0||Tag_Glint_Position==8)&&ChessBoardMap[4]==ChessBoardMap[0]
&&ChessBoardMap[4]==ChessBoardMap[8]){
if(ChessBoardMap[Tag_Glint_Position]==1) {SmillingAppleWins();BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
else if((Tag_Glint_Position==4||Tag_Glint_Position==2||Tag_Glint_Position==6)&&ChessBoardMap[4]==ChessBoardMap[2]
&&ChessBoardMap[4]==ChessBoardMap[6]){
if(ChessBoardMap[Tag_Glint_Position]==1){ SmillingAppleWins(); BothWins=FALSE;}
else if(ChessBoardMap[Tag_Glint_Position]==2){ LeisurefulBirdWins(); BothWins=FALSE;}
}
//和棋
if(Chess_No==9&&BothWins==TRUE){
SmillingAppleWins();
LeisurefulBirdWins();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -