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

📄 experiment.c

📁 基于44B0X的井字棋游戏
💻 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 + -