C++프로 그래 밍-오목

12430 단어 오목
앞에서 말 했 듯 이 프로 그래 밍 을 접 한 많은 사람들 이 프로그램 을 어떻게 작성 해 야 할 지 모 릅 니 다.특히 새로운 지식 을 배 웠 습 니 다.무슨 소 용이 있 는 지 모 르 겠 습 니 다.그러면 본 고 는 간단 한 저장 구조 와 간단 한 연산,조건 문,분기 문,순환 문 구 를 결합 시 켜 2 인 대전 판 오목 을 가 져 올 것 입 니 다.이것 은 간단 한 모델 입 니 다.오목 의 가장 기본 적 인 기능 을 실 현 했 고 보완 해 야 할 부분 도 많 습 니 다.예 를 들 어 경계 문제,디자인 문제,게임 논리 문제 등 은 독자 가 읽 은 후에 주의 하 시기 바 랍 니 다.자신의 노력 을 통 해 이 를 보완 하고 각종 기능 도 확대 할 수 있 습 니 다.예 를 들 어 바둑 을 뉘 우 치고 인터넷 대전 등 입 니 다.가끔 은 프로그램 을 쓰 는 것 이 작은 생명 과 마찬가지 로 점점 성장 할 수 있 습 니 다.그리고 우 리 는'부모'로 서 자신의 아이 가 유용 한 인재 가 되 는 것 을 보 았 습 니 다.과정의 기쁨 은 매우 좋 습 니 다!다음 문제!
수요 분석:C++언어 를 통 해 windows 콘 솔 을 전시 플랫폼 으로 하 는 간단 한 오목 프로그램 을 실현 합 니 다.그 중에서 키보드 입력 을 통 해 게임 의 행동(커서 이동,낙 자,확인)을 제어 합 니 다.규칙 은 한 측 이 가로 세로 방향 에서 5 개 또는 5 개 이상 본인 이 가지 고 있 는 바둑 알 을 연속 으로 존재 하여 승리 하도록 요구한다.

프로 세 스 설계:
게임 프로 세 스 분석:  

우리 가 이미 존재 하 는 프로그램 을 찾 으 려 고 할 때(어떤 것 은 오목 프로그램 이 고 인터넷 에서 많은 것 을 찾 을 수 있다)우 리 는 그의 UI 에 착안 하여 우리 가 관찰 한 것,느 낀 것,사용 한 서 비 스 를 통 해 소프트웨어 를 분석 하여 상기 절 차 를 얻 을 수 있 지만 우리 가 수 요 를 코드 로 바 꾸 어야 할 때우리 의 디자인 은 더 많이 고려 해 야 한다.
그러면 우 리 는 하나의 능력-추상 이 필요 하 다.
1.우선,우 리 는 바둑판 이 필요 합 니 다.그러면 나 는 C++의 무엇 을 사용 하여 바둑판 을 저장 하고 표시 할 수 있 습 니까?추상 을 통 해 바둑판 은 2 차원 도형 이기 때문에 저 는 2 차원 배열 을 사용 하 는 것 을 추천 합 니 다.만약 에 우리 가 19 줄*19 열 바둑판 을 구축한다 고 가정 합 니 다.
실현:

 int qiPan[19][19];  //    19 19          
 for(int h=0;h<19;h++) //       ,         (  ),   0  
 {
 for(int l=0;l<19;l++)
 {
  qiPan[h][l]=0; //          (  ),   0 
 }
 }
for(int h=0;h<19;h++) //   
{
 for(int l=0;l<19;l++)
 {
 switch(qiPan[h][l])
 {
  case 0:  //          0 ,     ・      
  cout<<"・";
  break;
 } 
 }
 cout<<endl;
}
이상 의 코드 를 실행 하면 우 리 는 바둑판 을 얻 을 수 있다.
2.그러면 바둑판 을 가 진 후에 우 리 는 커서 를 가지 고 타 자 를 고정 시 켜 야 한다.그러면 나 는 어떻게 표시 할 것 인가?우 리 는 바둑판 에서 점 을 찾 을 수 있다.즉,배열 이 대응 하 는 위치 에서 요 소 를 찾 아 그의 값 을 바 꿀 수 있다.우 리 는 8 로 커서 를 표시 하고 이 요 소 를 찾 으 려 면 가로 좌표 값 을 알 아야 한다.우 리 는 두 개의 int 변수 로 표시 해 야 한다.

 int X=9;   //2.              
 int Y=9;   
 qiPan[9][9]=8;  //              8
인쇄 할 때,우 리 는 switch 문장 에 case 옵션 8 을 추가 하면 됩 니 다.

 case 8:  //          0 ,     ・      
 cout<<"╋"; 
 break;
커서 를 얻 은 후에 우 리 는 어떻게 그 를 이동 합 니까?그러면 우 리 는 키보드 가 입력 한 문 자 를 받 아들 여 커서 의 이동 을 제어 할 수 있 습 니 다.이 예 에서 W 상,S 하,A 좌,D 우 를 사용 하여 커서 를 이동 할 수 있 습 니 다.

 char xx=getch();  //               (  )
 switch(xx)   //  
 {
  case 'w':  // 
  Y=Y-1;  //      -1 
  qiPan[Y][X]=8; //        
  qiPan[Y+1][X]=0; //          
  break;
  case 's':  // 
  Y=Y+1;
  qiPan[Y][X]=8;
  qiPan[Y-1][X]=0; 
  break; 
  case 'a':  // 
  X=X-1;
  qiPan[Y][X]=8;
  qiPan[Y][X+1]=0; 
  break;
  case 'd':  // 
  X=X+1;
  qiPan[Y][X]=8;
  qiPan[Y][X-1]=0; 
  break;    
 }
3.이때 우 리 는 커서 의 이동 을 제어 할 수 있 습 니 다.그 다음 에 낙 자 조작 을 실현 하려 면 바둑 알 은 어떻게 표시 합 니까?
우 리 는 두 개의 int 형식의 값 을 사용 하여 백자-1,흑점-2 를 표시 할 수 있 습 니 다.그러면 우 리 는 바둑판 에서 커서 가 있 는 위치 요소 의 값 을 1 또는 2 로 바 꾸 면 됩 니 다.그러면 우 리 는 이렇게 하면 됩 니까?
커서 가 이동 하 는 코드 를 돌 이 켜 보면 커서 의 이동 이 요소 의 변화 에 영향 을 줄 수 있다 는 것 을 알 수 있 습 니 다.그러면 우리 가 바둑판 에서 타 자 를 한 후에 커서 가 다시 이동 하면 기 록 된 타 자 정 보 를 바 꿀 수 있 습 니 다.커서 와 바둑 알 이 충돌 하지 않도록 두 개의 그림 을 사용 하여 같은 바둑판 을 표시 합 니 다.

그러면 나 는 바둑판 하 나 를 더 설명해 야 한다.방법 은 1 중 과 같다.

 int qiPanTwo[19][19]; //    19 19          
 for(int h=0;h<19;h++) //       ,         (  ),   0  
 {
 for(int l=0;l<19;l++)
 {
  qiPanTwo[h][l]=0; //          (  ),   0 
 }
 }
자,바둑판 2 가 이미 세 워 졌 습 니 다.그러면 우 리 는 어떻게 합 니까?우 리 는 반드시 바둑 을 두 는 쪽 을 선택 한 후에 커서 위치 에서 키보드 로 입력 한 j 타 자 를 받 아야 합 니 다.그러면 우 리 는 2.중 switch 구문 에 분기 case'j'를 추가 하면 됩 니 다.그러면 우 리 는 하나의 변 수 를 사용 하여 유 저 를 표시 해 야 합 니 다.우 리 는 프로그램 이 시작 되 자마자 정의 할 수 있 습 니 다.

int player=1;//              
case 'j':   //   
 if(player==1)  //            
 {
 qiPanTwo[Y][X]=1; //    1          2
//        1,       
 player=2;  //            
 }
 else if(player==2) 
 {
 qiPanTwo[Y][X]=2;
 player=1;   
 }
break;
낙자 가 성공 하면 다음 에 우 리 는 그것 을 보 여줄 수 있 습 니 다.이때 우 리 는 두 바둑판 을 통일 적 으로 인쇄 해 야 하기 때문에 우 리 는 swicth 를 사용 하면 통 일 된 분기 선택 을 할 수 없습니다.이때 우 리 는 1.중의 인쇄 내용 을 다음 과 같이 바 꿔 야 합 니 다.

 if(qiPan[h][l]==8) //                 ,      。
 {
  cout<<"╋";
 }
 else if(qiPanTwo[h][l]==0)
 {
  cout<<"・";
 }
 else if(qiPanTwo[h][l]==1)
 {
  cout<<"●";
 }
 else if(qiPanTwo[h][l]==2)
 {
  cout<<"○";
 }
4.게임 규칙,우리 가 탈락 한 후에 판단 을 해 야 합 니 다.승리 여 부 를 어떻게 판단 합 니까?  
이때 우 리 는 게임 규칙 을 사용 하여 알고리즘 을 분석 해 야 한다.낙자 위치 가 가로,세로,경사 5 칸 에 서로 연 결 된 다섯 개의 같은 종류의 바둑 알 이 있 을 때 우 리 는 이 바둑 을 든 사람 이 이 겼 다 고 생각 할 수 있 기 때문에 우 리 는 각 방향 에서 판단 해 야 한다.

 int shu=1,heng=1,pie=1,na=1;//       ,   5               
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y+i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  shu++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y-i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  shu++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  heng++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  heng++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y+i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  pie++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y-i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  pie++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y+i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  na++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y-i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  na++;
  else
  break; 
 }
 if(shu==5||heng==5||pie==5||na==5)
 {
  if(qiPanTwo[Y][X]==1)
  {
   cout<<"    !";
   system("pause");
   break;
  }
  else 
  {
   cout<<"    !";
   system("pause");
   break;
  }
 }
 shu=1,heng=1,pie=1,na=1; 
자,이 단 계 를 완성 할 때 우리 의 프로그램 은 기본적으로 해결 되 었 습 니 다.나머지 는 시작 하 는 절차 에 따라 연결 하 는 것 입 니 다.그 중에서 우 리 는 화면 을 인쇄 하기 전에 지난번 인쇄 결 과 를 지우 고 함 수 를 사용 해 야 합 니 다.system(“cls”);// 완성 할 수 있 습 니 다.
 전체 코드(실행 가능):

#include<iostream>
#include<string> 
#include<windows.h> 
#include<conio.h>
using namespace std;
int main()
{
 int player=1;  //      , 1    ,2     
 //................................  1..............................................
 int qiPan[19][19];  //1.    19 19          1 
 for(int h=0;h<19;h++) //       ,         (  ),   0  
 {
 for(int l=0;l<19;l++)
 {
  qiPan[h][l]=0; //          (  ),   0 
 }
 }
 //...............................  2................................................
 int qiPanTwo[19][19]; //    19 19          2
 for(int h=0;h<19;h++) //       ,         (  ),   0  
 {
 for(int l=0;l<19;l++)
 {
  qiPanTwo[h][l]=0; //          (  ),   0 
 }
 }
 //...............................    .............................................
 int X=9;   //2.              
 int Y=9;   
 qiPan[9][9]=8;
 //..............................  ...................................................
 for(int h=0;h<19;h++) 
 {
  for(int l=0;l<19;l++)
  {
  if(qiPan[h][l]==8)
  {
   cout<<"╋";
  }
  else if(qiPanTwo[h][l]==0)
  {
   cout<<"・";
  }
  else if(qiPanTwo[h][l]==1)
  {
   cout<<"●";
  }
  else if(qiPanTwo[h][l]==2)
  {
   cout<<"○";
  } 
  }
  cout<<endl;
 }
 //..............................    ...............................................
 while(true)
 {
 char xx=getch();  //             
 switch(xx)   //  
 {
  case 'w':  // 
  Y=Y-1;  //      -1 
  qiPan[Y][X]=8; //        
  qiPan[Y+1][X]=0; //          
  break;
  case 's':  // 
  Y=Y+1;
  qiPan[Y][X]=8;
  qiPan[Y-1][X]=0; 
  break; 
  case 'a':  // 
  X=X-1;
  qiPan[Y][X]=8;
  qiPan[Y][X+1]=0; 
  break;
  case 'd':  // 
  X=X+1;
  qiPan[Y][X]=8;
  qiPan[Y][X-1]=0; 
  break; 
  case 'j':   //   
  if(player==1)  //            
  {
   qiPanTwo[Y][X]=1; //    1          2        1,       
   player=2;  //            
  }
  else if(player==2) 
  {
   qiPanTwo[Y][X]=2;
   player=1;   
  }
  break;    
 }
 //................................    ................................................ 
 system("cls");  
 //...............................  .....................................................
 for(int h=0;h<19;h++) 
 {
  for(int l=0;l<19;l++)
  {

  if(qiPan[h][l]==8)
  {
   cout<<"╋";
  }
  else if(qiPanTwo[h][l]==0)
  {
   cout<<"・";
  }
  else if(qiPanTwo[h][l]==1)
  {
   cout<<"●";
  }
  else if(qiPanTwo[h][l]==2)
  {
   cout<<"○";
  } 
  }
  cout<<endl;
 }
 //.........................    ..............................................
 int shu=1,heng=1,pie=1,na=1;//     
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y+i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  shu++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y-i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  shu++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  heng++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //  
 {
  if(qiPanTwo[Y][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  heng++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y+i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  pie++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y-i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  pie++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y+i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  na++;
  else
  break; 
 }
 for(int i=1;i<=4;i++) //   
 {
  if(qiPanTwo[Y-i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
  na++;
  else
  break; 
 }
 if(shu==5||heng==5||pie==5||na==5)
 {
  if(qiPanTwo[Y][X]==1)
  {
   cout<<"    !";
   system("pause");
   break;
  }
  else 
  {
   cout<<"    !";
   system("pause");
   break;
  }
 }
 } 
 return 0; 
}
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기