2012年2月9日 星期四

[C/C++演算法]-五子棋

 [C/C++演算法]-五子棋 



 


本篇要分享五子棋的演算法程式,有興趣的(C/P)同好,歡迎來(C/P)一下 ^ ^


 












程式碼



#include <iostream>

#include <conio.h>

#include <windows.h>

usingnamespace std;

/*

關於遊戲控制

wasd上左下右  j 下棋

另外這是兩人對戰的~~(小弟不會寫AI= ="

學了一下class 寫個五子棋

*/

class object

{

    int map;    //private

    

    public:

    int **array;

    int player;

    object()

    {   int i=0;

      player=0;

  

    for(;;)

   {

     cout<<"請輸入所要的地圖大小:X x X\n";

          cin>>map;

    

    if(map < 10 || map >30)

          cout<<"請輸入適合的數字 10~30\n";

      else

      {

        system("cls");

     array= newint* [map];

           for(i=0;i<map;i++)

     array[i]= newint [map];

         

     break;

      }

   }

}

//void test(){ cout<<map;}; 

void print();

void process(int *x,int *y); 

void gotoxy(int x,int y);  

int check();

};

void object::print()

{

  int i,j; 

  

  for(i=0;i<map;i++)

   {

for(j=0;j<map;j++)

    array[i][j]=0;

   }

     for(i=0;i<map;i++)

  {

      for(j=0;j<map;j++)

   {

     if(i==0 && j==0) cout<<"┌";

     elseif(i==0 && j==(map-1)) cout<<"┐";

  elseif(i==0) cout<<"┬";

     

     if(j==0 && i!=0 && i!=map-1) cout<<"├";

  elseif( i!=map-1 && i!= 0 && j==map-1) cout<<"┤";

  if(i!=0 && j!=0 && i!=map-1 && j!=map-1) cout<<"┼";

  if(i==map-1 && j==0) cout<<"└";

  if(i==map-1&& j!=0 && j!=map-1) cout<<"┴";

  if(i==map-1 && j==map-1) cout<<"┘";

   }

  

   cout<<"\n";

  }

   cout<<"玩家1●"<<"   "<<"玩家2○";

}

void object::process(int *x,int *y)

{

  char ch;

  ch=_getch();

  

   switch (ch)

  {

  case 'w': if(*y>0)

   (*y)--;

         break;

   

  case 'a': if(*x>0)

   (*x)=(*x)-2;

         break;

   

  case 's': if(*y<map-1)

   (*y)++;

         break;

   

  case 'd': if(*x/2<map-1)

   (*x)=(*x)+2;

            break;

   

  

  case 'j': if(player%2==0 && array[*x/2][*y]==0)

   {

   cout<<"●";

            array[*x/2][*y]=1;

            player++;

   }

   if(player%2==1 && array[*x/2][*y]==0)

   {

            cout<<"○";

   array[*x/2][*y]=2;

   player++;

   }

            break;

  

  default : break;

  }

 

 

}

void object::gotoxy(int x, int y){

static HANDLE hConsole = 0; //初始值

staticint instanceCount = 0;

COORD coord;

  if( instanceCount == 0 ){

  //取得螢幕的控制

  hConsole = GetStdHandle( STD_OUTPUT_HANDLE );

  instanceCount = 1;

}

coord.X = x ;

coord.Y = y ;

//將游標移至所指定的座標位置

SetConsoleCursorPosition( hConsole, coord );

}

int object::check()

{ 

   int i,j;

   int set=(player+1)%2+1; 

for(i=0;i<map;i++)

{ 

   for(j=0;j<map;j++)

   {

  

  if(array[i][j]==set && array[i+1][j]==set && array[i+2][j]==set && array[i+3][j]==set && array[i+4][j]==set)

  { cout<<"玩家"<<set<<"贏了!!"; return 0;}

     if(array[i][j]==set && array[i][j+1]==set && array[i][j+2]==set && array[i][j+3]==set && array[i][j+4]==set)

  { cout<<"玩家"<<set<<"贏了!!";  return 0;}

     if(array[i][j]==set && array[i+1][j+1]==set && array[i+2][j+2]==set && array[i+3][j+3]==set && array[i+4][j+4]==set )

  { cout<<"玩家"<<set<<"贏了!!"; return 0;}

     if(array[i][j]==set && array[i+1][j-1]==set && array[i+2][j-2]==set && array[i+3][j-3]==set && array[i+4][j-4]==set )

  { cout<<"玩家"<<set<<"贏了!!"; return 0;}

  

}

}

return 1;

}

int main()

{

int x=0,y=0;

object s1;

// s1.test(); //雖然無法用 s1.map的方式改變其值,因為他是private屬性,但卻可利用外在函數改變他,似乎初始化一次後,

//就不會讓你再初始話一次

 

s1.print();

 

do

{

 

s1.gotoxy(x,y);

s1.process(&x,&y);

}while(s1.check());

 

system("pause");

return (0);

}

 



 


 




沒有留言:

張貼留言