오목(2인용)(1차배열, 2차배열, 재귀)

#include <iostream>
#include <time.h>
#include <Windows.h>
#include <string.h>
using namespace std;
//오목 만들기 10 * 10
//재귀라는걸 이용하면 간단한데 아직 그 수준 아니다(쌤)
//중간에 넣는 경우의 수 구현 가능 하면 하고 아니면 끝에 놨을 때만 처리
//또는 2차원 배열 처리하는 방법도 있다.
//1.1차배열 2.2차배열 3.재귀
// < 재귀 >>
int winnerSelf(int omok[][11], int p1y, int p1x, int omok_num); //재귀 승패판단
// < 2차 배열 함수 선언 >>
int winner2d(int player_num, int turn, int omok[][11], int p1y, int p1x);//2차원 결과
void borad2d(int turn, int omok[][11]);//2차원 오목판
// < 1차 배열 함수 선언 >>
void input(int turn, int p1, int p2, int omok[], int p1temp, int p2temp);
void board(int omok[]); //오목 판 함수
int winner(int player_num, int p, int omok[], int ptemp); //승패 판단 함수
int main()
{
system(" mode con lines=60 cols=120 ");
int choice = 0;
cout << "로직을 선택 하세요." << endl;
cout << "1.1차배열 2.2차배열 3.재귀" << endl;
cin >> choice;
int p1 = 0; //1,2플레이어 입력 값
int p2 = 0; //1,2플레이어 입력 값
int p1temp = 0;
int p2temp = 0;
int turn = 0;
if (choice == 1)
{
//1.오목판 배열-完
int omok[100];
for (int i = 0; i < 100; i++) omok[i] = i;
//게임 반복
while (true)
{
turn++;
system("cls");
cout << "< 오목 게임(1.1차배열) >" << endl;
cout << turn << " 번 째 턴입니다." << endl << endl;
//4.p1 입력 값이 오목인지 체크(함수 처리)
winner(101, p1, omok, p1temp);
winner(102, p2, omok, p2temp);
//2.오목판 출력-完
board(omok);
//4.p1 오목이면 게임 종료
if (winner(101, p1, omok, p1temp) == 1127) break;
if (winner(102, p2, omok, p2temp) == 1127) break;
//3.p1 입력 받기(숫자로 입력 받자)
//5.p2 입력 받기
input(turn, p1, p2, omok, p1temp, p2temp);
continue;
}//end of while(game)
}
if (choice == 2)
{
//1.오목판 2차 배열-完
int omok[10][11];
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
omok[y][x] = y * 10 + x;
}
}
//게임 반복
while (true)
{
turn++;
int p1y = 0;
int p2y = 0;
int p1x = 0;
int p2x = 0;
//2.2차 배열 오목판 출력
borad2d(turn, omok);
//3.p1 입력 받기(숫자로 입력 받자)
if (turn % 2 == 1)
{
cout << "1 플레이어 차례입니다." << endl;
cin >> p1;
p1y = p1 / 10;
p1x = p1 % 10;
omok[p1y][p1x] = 101;
}
//4.p1 오목이면 게임 종료(결과 판단)
if (winner2d(101, turn, omok, p1y, p1x) == 1127) break;
//3.p1 입력 받기(숫자로 입력 받자)
if (turn % 2 == 0)
{
cout << "2 플레이어 차례입니다." << endl;
cin >> p2;
p2y = p2 / 10;
p2x = p2 % 10;
omok[p2y][p2x] = 102;
}
//4.p1 오목이면 게임 종료(결과 판단)
if (winner2d(102, turn, omok, p2y, p2x) == 1127) break;
continue;
}//end of while(game 2)
}
if (choice == 3)
{
int omok[10][11];
//오목판 배열(2차 배열로 갑시다.)
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
omok[y][x] = y * 10 + x;
//cout << "omok[y][x]" << " = " << y * 10 + x << endl;
}
}
//게임 반복
while (true)
{
turn++;
system("cls");
cout << "< 오목 게임(3.재귀) >" << endl;
cout << turn << " 번 째 턴입니다." << endl << endl;
//오목판 출력 해주기
for (int y = 0; y < 100; y = y + 10)
{
for (int x = 0; x < 10; x++)
{
if (omok[y / 10][x] == 101)
{
cout << 101 << "\t";
}
else if (omok[y / 10][x] == 102)
{
cout << 102 << "\t";
}
else
{
cout << y / 10;
cout << x << "\t";
}
}
cout << "\n\n\n" << endl;
}
//유저 입력
cout << "1 플레이어 유저 입력 : ";
cin >> p1;
//입력 값을 변환 해주기
int p1y = 0;
int p1x = 0;
p1y = p1 / 10;
p1x = p1 % 10;
omok[p1y][p1x] = 101;
//cout << omok[p1y][p1x] << " " << p1y << " " << p1x << endl;
//system("pause");
int omok_num = 1;
//결과 도출
//→
if (winnerSelf(omok, p1y, p1x, omok_num) == 1127) break;
}
}
return 99;
}//end of main
// < 재귀 부분 >
int winnerSelf(int omok[][11], int p1y, int p1x, int omok_num)
{
if (omok[p1y][p1x] == 101 && omok[p1y][p1x + 1] == 101)
{
omok_num++;
winnerSelf(omok, p1y, p1x + 1, omok_num);
if (omok_num == 5)
{
cout << "────── " << 1 << "P WINNER──────" << endl;
return 1127;
}
}
}
//< 2차 배열 부분 >
//4.p1 오목이면 게임 종료(결과 판단)
//→ //쭉 넘어갈 때 다음 라인으로 넘어가도 오목이 되는 이유: 2차원 배열이라도 실제 메모리 상에는 연결 되어 있기 때문 해결 해야 한다. 10번째 라인에 메모리 쓰레기 값을 넣도록 판 그릴때 11개까지 처리
int winner2d(int player_num, int turn, int omok[][11], int p1y, int p1x)
{
if (omok[p1y][p1x + 0] == player_num &&
omok[p1y][p1x + 1] == player_num &&
omok[p1y][p1x + 2] == player_num &&
omok[p1y][p1x + 3] == player_num &&
omok[p1y][p1x + 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//←
if (omok[p1y][p1x - 0] == player_num &&
omok[p1y][p1x - 1] == player_num &&
omok[p1y][p1x - 2] == player_num &&
omok[p1y][p1x - 3] == player_num &&
omok[p1y][p1x - 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↑
if (omok[p1y - 0][p1x] == player_num &&
omok[p1y - 1][p1x] == player_num &&
omok[p1y - 2][p1x] == player_num &&
omok[p1y - 3][p1x] == player_num &&
omok[p1y - 4][p1x] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↓
if (omok[p1y + 0][p1x] == player_num &&
omok[p1y + 1][p1x] == player_num &&
omok[p1y + 2][p1x] == player_num &&
omok[p1y + 3][p1x] == player_num &&
omok[p1y + 4][p1x] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↗
if (omok[p1y - 0][p1x + 0] == player_num &&
omok[p1y - 1][p1x + 1] == player_num &&
omok[p1y - 2][p1x + 2] == player_num &&
omok[p1y - 3][p1x + 3] == player_num &&
omok[p1y - 4][p1x + 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↙
if (omok[p1y + 0][p1x - 0] == player_num &&
omok[p1y + 1][p1x - 1] == player_num &&
omok[p1y + 2][p1x - 2] == player_num &&
omok[p1y + 3][p1x - 3] == player_num &&
omok[p1y + 4][p1x - 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↖
if (omok[p1y - 0][p1x - 0] == player_num &&
omok[p1y - 1][p1x - 1] == player_num &&
omok[p1y - 2][p1x - 2] == player_num &&
omok[p1y - 3][p1x - 3] == player_num &&
omok[p1y - 4][p1x - 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
//↘
if (omok[p1y + 0][p1x + 0] == player_num &&
omok[p1y + 1][p1x + 1] == player_num &&
omok[p1y + 2][p1x + 2] == player_num &&
omok[p1y + 3][p1x + 3] == player_num &&
omok[p1y + 4][p1x + 4] == player_num)
{
borad2d(turn, omok);
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//2.2차 배열 오목판 출력
void borad2d(int turn, int omok[][11])
{
system("cls");
cout << "< 오목 게임(2.2차배열) >" << endl;
cout << turn << " 번 째 턴입니다." << endl << endl;
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
if (omok[y][x] == 101)
{
cout << 101 << "\t";
}
else if (omok[y][x] == 102)
{
cout << 102 << "\t";
}
else cout << y << x << "\t";
}
cout << "\n\n\n" << endl;
}
}
//< 1차 배열 부분 >
//유저와 컴퓨터 입력
void input(int turn, int p1, int p2, int omok[], int p1temp, int p2temp)
{
//3.p1 입력 받기(숫자로 입력 받자)
if (turn % 2 == 1)
{
cout << "1 플레이어 차례입니다." << endl;
cin >> p1;
for (int i = 0; i < 100; i++)
{
if (p1 == omok[i])
{
p1temp = i;
omok[i] = 101;
break;
}
}
//continue;
}
//5.p2 입력 받기
if (turn % 2 == 0)
{
cout << "2 플레이어 차례입니다." << endl;
cin >> p2;
for (int i = 0; i < 100; i++)
{
if (p2 == omok[i])
{
p2temp = i;
omok[i] = 102;
break;
}
}
//continue;
}
}
//2.오목판 출력-完
void board(int omok[])
{
for (int y = 0; y < 100; y = y + 10)
{
for (int x = y; x < y + 10; x++)
{
if (omok[x] == 101)
{
//cout << static_cast<char>(64) << "\t";
cout << 101 << "\t";
}
else if (omok[x] == 102)
{
//cout << static_cast<char>(42) << "\t";
cout << 102 << "\t";
}
else cout << omok[x] << "\t";
}
cout << "\n\n\n" << endl;
}
}
//승패 판단 함수(1.1차배열)
int winner(int player_num, int p, int omok[], int ptemp)
{
//→ 10으로 나누고 5로 나눈 몫이 1이 안되는 애들??
if (p % 10 / 6 != 1)
{
if (omok[ptemp + 0] == player_num &&
omok[ptemp + 1] == player_num &&
omok[ptemp + 2] == player_num &&
omok[ptemp + 3] == player_num &&
omok[ptemp + 4] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//← 10으로 나누고 4로 나눈 나머지가 1 이상이면
if (p % 10 / 4 == 1)
{
if (omok[ptemp - 0] == player_num &&
omok[ptemp - 1] == player_num &&
omok[ptemp - 2] == player_num &&
omok[ptemp - 3] == player_num &&
omok[ptemp - 4] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↑ 40으로 나눈 나머지가 1일때
if (p % 40 >= 1)
{
if (omok[ptemp - 0] == player_num &&
omok[ptemp - 10] == player_num &&
omok[ptemp - 20] == player_num &&
omok[ptemp - 30] == player_num &&
omok[ptemp - 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↓
if (p / 60 == 0)
{
if (omok[ptemp + 0] == player_num &&
omok[ptemp + 10] == player_num &&
omok[ptemp + 20] == player_num &&
omok[ptemp + 30] == player_num &&
omok[ptemp + 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↗
if (p / 40 >= 1 && p % 10 / 6 == 0)
{
if (omok[ptemp + 0 - 0] == player_num &&
omok[ptemp + 1 - 10] == player_num &&
omok[ptemp + 2 - 20] == player_num &&
omok[ptemp + 3 - 30] == player_num &&
omok[ptemp + 4 - 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↙
if (p / 60 == 0 && p % 10 / 4 >= 1)
{
if (omok[ptemp - 0 + 0] == player_num &&
omok[ptemp - 1 + 10] == player_num &&
omok[ptemp - 2 + 20] == player_num &&
omok[ptemp - 3 + 30] == player_num &&
omok[ptemp - 4 + 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↖
if (p / 40 >= 1 && p % 10 / 4 >= 1)
{
if (omok[ptemp - 0 - 0] == player_num &&
omok[ptemp - 1 - 10] == player_num &&
omok[ptemp - 2 - 20] == player_num &&
omok[ptemp - 3 - 30] == player_num &&
omok[ptemp - 4 - 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
//↘
if (p / 60 == 0 && p % 10 / 6 == 0)
{
if (omok[ptemp + 0 + 0] == player_num &&
omok[ptemp + 1 + 10] == player_num &&
omok[ptemp + 2 + 20] == player_num &&
omok[ptemp + 3 + 30] == player_num &&
omok[ptemp + 4 + 40] == player_num)
{
cout << "────── " << player_num % 100 << "P WINNER──────" << endl;
return 1127;
}
}
}
댓글
댓글 쓰기