C++프로 그래 밍-오목
12430 단어 오목
수요 분석: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;
}
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
오목 AI 알고리즘 6 편 - 반복 심화교체 심화 란 2 층 부터 승리 의 방법 을 찾 거나 깊이 제한 에 도달 할 때 까지 검색 깊이 를 점차 늘 리 는 것 이다.예 를 들 어 우리 가 6 층 깊이 를 검색 하면 우 리 는 먼저 2 층 을 시도 하고 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.