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

📄 main.c

📁 基于arm平台的五子棋
💻 C
字号:
#include"..\ucos-ii\includes.h"               /* uC/OS interface */
#include "..\ucos-ii\add\osaddition.h"
#include "..\inc\drv.h"

#include <string.h>

#pragma import(__use_no_semihosting_swi)  // ensure no functions that use semihosting 
#define WIDTH 20

///******************任务定义***************///
OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Main_Task(void *Id);             //Main_Test_Task
#define Main_Task_Prio     12

OS_STK Control_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Control_Task(void *Id);             //Main_Test_Task
#define Control_Task_Prio     13

/**************已经定义的OS任务*************
tcp监控任务		11
以太网物理层监控任务	8
触摸屏任务		9
键盘任务		10
lcd刷新任务		59
系统任务		1
*****************************************************/

int X=5;
int Y=5;
int flag=0;
int Chess[10][10];
int count;
int blackorwhite=1;
int iswin=0;
///*****************事件定义*****************///
OS_EVENT *Nand_Rw_Sem;                   //Nand_Flash读写控制权旗语
//and you can use it as folloeing:
//    Nand_Rw_Sem=OSSemCreate(1);        //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Nand_Rw_Sem,0,&err);
//    OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem;                   //Uart读写控制权旗语
//and you can use it as folloeing:
//    Uart_Rw_Sem=OSSemCreate(1);        //创建Uart读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Uart_Rw_Sem,0,&err);
//    OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////

void recordinit() //数组的初始化
{int i,j;
 for(i=0;i<10;i++){
  for(j=0;j<10;j++){
    Chess[i][j]=0;
   }
 }
}

int judge(int blackorwhite)//交换权限
{
  if(blackorwhite==1) return 2;
  else return 1;
}
int borw(int  blackorwhite)//判断是白方还是黑方
{
 int chess;
  if(blackorwhite==1)
         {chess=1;}  //blackorwrithe为真的时候为黑方
      else if(blackorwhite==2)
         {chess=2;}  //blackorwrithe为假的时候为白方
 return chess;
 
}
void record(int x,int y,int blackorwhite)//对数组进行记录
{
 int chess;
 chess=borw(blackorwhite);
 Chess[x][y]=chess;
}

int scan(int x,int y,int blackorwrithe){ //对棋盘对应的二维向量进行扫描并判断输2赢1
         int chess;
         chess=borw(blackorwrithe);
         while(Chess[x][y]==chess){
             count++;
             x--;
             if(x<0) break;


         }
         if(count>=5){
             //win
             count=0;
             //扫描在同一x上有无可能组成连续的5个棋子1
             return 1;

         }else{ //扫描在同一x上有无可能组成连续的5个棋子
             x=X+1;
             while(Chess[x][y]==chess){
                 count++;
                 x++;
                 if(x>9) break;

             }
         if(count>=5){
             //扫描在同一x上有无可能组成连续的5个棋子2
             count=0;
             return 1;
         }else{  //扫描在同一y上有无可能组成连续的5个棋子
             count=0;
             x=X;
             while(Chess[x][y]==chess){
                 y++; 
                 count++;
                 if(y>9) break;
             }
             if(count>=5){
                 //扫描在同一y上有无可能组成连续的5个棋子1;
                 count=0;
                 return 1;
             }else{
                 y=Y-1;
                 while(Chess[x][y]==chess){
                  y--; 
 		  count++;
                  if(y<0) break;
              }
             if(count>=5){
                 //win
                 //扫描在同一y上有无可能组成连续的5个棋子2;
                 count=0;
                 return 1;
             }else{  //扫描在同一(x-1,y-1)(x+1,y+1)上有无可能组成连续的5个棋子
                 count=0;
                 x=X;
                 y=Y;
                 while(Chess[x][y]==chess){
                     x--; y--; count++;
                     if(x<0&&y<0) break;
                 }
                 if(count>=5){
                     //win
                     //扫描在同一(x-1,y-1)(x+1,y+1)上有无可能组成连续的5个棋子1;
                     count=0;
                     return 1;
                 }else{
                     x=X+1;
                     y=Y+1;
                     while(Chess[x][y]==chess){
                      x++; y++; count++;
                      if(x>9&&y>9) break;
                    }

                 }
                 if(count>=5){
                     //win
                     //扫描在同一(x-1,y-1)(x+1,y+1)上有无可能组成连续的5个棋子2;
                     count=0;
                     return 1;
                 }else{  //扫描在同一(x-1,y+1)(x+1,y-1)上有无可能组成连续的5个棋子
                     count=0;
                     x=X;
                     y=Y;
                     while(Chess[x][y]==chess){
                     x--;
                     y++; 
                     count++;
                     if(x<0&&y>9) break;
                     }
                     if(count>=5){
                     //win
                     //扫描在同一(x-1,y+1)(x+1,y-1)上有无可能组成连续的5个棋子1;
                     count=0;
                     return 1;
                    }else{
                      x=X+1;
                       y=Y-1;
                       while(Chess[x][y]==chess){
                        x++; y--; count++;
                        if(x>9&&y<0) break;
                       }

                     }
                      if(count>=5){
                        //win
                        //扫描在同一(x-1,y+1)(x+1,y-1)上有无可能组成连续的5个棋子2;
                        count=0;
                        return 1;
                      }else{
                          count=0;
                          return 2;
                      }


                 }

             }
             }
         }
         }
     }


void initOSGUI()	//初始化操作系统的图形界面
{
	initOSMessage();
	initOSList();
	initOSDC();
	initOSCtrl();
	initOSFile();
}
/////////////////////////////////////////////////////
//                  Main function.                //
////////////////////////////////////////////////////

int main(void)
{
	ARMTargetInit(); //开发板初始化
	OSInit(); //操作系统初始化      
	uHALr_ResetMMU();//复位MMU
	LCD_Init();             //初始化LCD模块
	LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据
	LCD_printf("320 x 240  Text Mode\n");
	initOSGUI();//初始化图形界面
	LoadFont();//调Unicode字库
	LoadConfigSys();//使用config.sys文件配置系统设置
	LCD_printf("Create task on uCOS-II...\n");
	
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务
   // OSTaskCreate(Control_Task,  (void *)0,  (OS_STK *)&Control_Stack[STACKSIZE*8-1],  Control_Task_Prio);// 创建系统任务
	OSAddTask_Init();//创建系统附加任务
	LCD_printf("Starting uCOS-II...\n");
	LCD_printf("Entering graph mode...\n");
	LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
	InitRtc();//初始化系统时钟
	Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
	OSStart();//操作系统任务调度开始
	//不会执行到这里
	return 0;
}


char KeyTable[]={'N','/','*','-','7','8','9','+','4','5','6','1','2','3','E','0','.'};
char* red="red win!";
char* green="green win!";

void Main_Task(void *Id)             //Main_Test_Task
{
	POSMSG pMsg=0;//创建消息指针
	U16 red16[20];
	U16 green16[20];
	int oldx,oldy;//用来保存原来坐标系位置
	PDC pdc;//定义绘图设备上下文结构
	
        int i;
       // for(;;){
 L:       ClearScreen();
        recordinit();
        Delay(5000);
        pdc=CreateDC();
        SetPenWidth(pdc,1);
        SetPenColor(pdc,0x000000);
        MoveTo(pdc,10,20);
        LineTo(pdc,210,20);
        MoveTo(pdc,10,20);
        LineTo(pdc,10,220);
        for(i=1;i<=10;i++)
        {
           MoveTo(pdc,10+i*WIDTH,20);
           LineTo(pdc,10+i*WIDTH,220);
        }
        for(i=1;i<=10;i++)
        {
           MoveTo(pdc,10,20+i*WIDTH);
           LineTo(pdc,210,20+i*WIDTH);
        }
        
        
        OSTimeDly(500);
       // ClearScreen();
        for(;;){
		     pMsg=WaitMessage(0); //等待消息
		     switch(pMsg->Message){
		     case OSM_KEY://键盘消息
			     // onKey(pMsg->WParam,pMsg->LParam);
			     // Uart_Printf("key=%c\n",KeyTable[pMsg->WParam]);//向串口发送按键值对应的ASCII吗
	             // strChar2Unicode(ch,KeyTable[pMsg->WParam]);//将整形数据转化成Unicode
	             // TextOut(pdc, 150, 100, ch, TRUE, FONTSIZE_MIDDLE);//文本模式下显示文
	             SetPenWidth(pdc,2);
                 SetPenColor(pdc,0xffffff);
                 SetDrawOrg(pdc,10,20,&oldx,&oldy);
                 DrawRectFrame(pdc,X*20+2,Y*20+2,X*20+18,Y*20+18);
	              
	              if(KeyTable[pMsg->WParam]=='8')
	              {
	                 Y--;
                     if(Y<0)
                     Y=9;
	              }
	              else if(KeyTable[pMsg->WParam]=='2')
	              {
	 
                     Y++;
                     if(Y>9)
                     Y=0;
                  }
                  else if(KeyTable[pMsg->WParam]=='4')
                  {
                      X--;
                     if(X<0)
                     X=9;
                  }
                  else if(KeyTable[pMsg->WParam]=='6')
                  {    
                      X++;
                      if(X>9)
                      X=0;
                  }
	              else if(KeyTable[pMsg->WParam]=='5')
	              {
	                if(Chess[X][Y]==0)
                    {
                     record(X,Y,blackorwhite);
                     if(blackorwhite==1){
                        SetPenWidth(pdc,3);
                        SetPenColor(pdc,0x00ff00);
                        Circle(pdc,X*20+10,Y*20+10,7);
                     }
                     else
                     {
                        SetPenWidth(pdc,3);
                        SetPenColor(pdc,0x0000ff);
                        Circle(pdc,X*20+10,Y*20+10,7);
                     }
                     SetPenColor(pdc,0xffffff);
                     iswin=scan(X,Y,blackorwhite);
                     if(iswin==1) {
                          ClearScreen();
                          if(blackorwhite==1)
                          {
                               strChar2Unicode(green16,green);//将整形数据转化成Unicode
	                           TextOut(pdc, 150, 100, green16, TRUE, FONTSIZE_MIDDLE);//文本模式下显示文
                          }
                          else
                          {
                               strChar2Unicode(red16,red);//将整形数据转化成Unicode
	                           TextOut(pdc, 150, 100, red16, TRUE, FONTSIZE_MIDDLE);//文本模式下显示文
	        
                          }
                           OSTimeDly(5000);
                           goto L;
                     
                      }//赢界面
                     else
                        blackorwhite=judge(blackorwhite);
                    }
                 
	              }
                 //	else   break;
                // ClearScreen();
                 if(iswin!=1){
                    SetPenWidth(pdc,2);
                    SetPenColor(pdc,0x0000FF);
                    SetDrawOrg(pdc,10,20,&oldx,&oldy);
                    DrawRectFrame(pdc,X*20+2,Y*20+2,X*20+18,Y*20+18);
                 }
                
	              
			      OSTimeDly(50);
			      break;
		     }
		     DeleteMessage(pMsg);//删除消息,释放资源
	    }
	    DestoryDC(pdc);
	   // Delay(5000);
	   // }
       
}

⌨️ 快捷键说明

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