开始学习时写的五子棋
虽然是用c++写的
我感觉思想还是面向过程
惭愧惭愧
#include<iostream>
#include<iomanip>
#include<windows.h>
using namespace std;
const int MAX = 15;
int JudgeCross(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
for(int i=0; i<MAX; i++)
{
for(int j=0; j<MAX-n+1; j++)
{
if(1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(1 == arr[i][j+k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return 1;
}
}
if(-1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(-1 == arr[i][j+k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return -1;
}
}
}
}
return 0;
}
int JudgeVertical(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
for(int i=0; i<MAX-n+1; i++)
{
for(int j=0; j<MAX; j++)
{
if(1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(1 == arr[i+k][j])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return 1;
}
}
if(-1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(-1 == arr[i+k][j])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return -1;
}
}
}
}
return 0;
}
int JudgeDiagonalRight(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
for(int i=0; i<MAX-n+1; i++)
{
for(int j=0; j<MAX-n+1; j++)
{
if(1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(1 == arr[i+k][j+k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return 1;
}
}
if(-1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(-1 == arr[i+k][j+k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return -1;
}
}
}
}
return 0;
}
int JudgeDiagonalLeft(int arr[MAX][MAX], int MAX, int n) // n子棋 5子气中 n为5
{
for(int i=0; i<MAX-n+1; i++)
{
for(int j=n-1; j<MAX; j++)
{
if(1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(1 == arr[i+k][j-k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return 1;
}
}
if(-1 == arr[i][j])
{
int k=1;
for(; k<n; k++)
{
if(-1 == arr[i+k][j-k])
{
continue;
}
else
{
break;
}
}
if(n == k)
{
return -1;
}
}
}
}
return 0;
}
int Judge(int arr[MAX][MAX], int MAX, int n)
{
return (JudgeCross(arr,MAX,n) +
JudgeVertical(arr,MAX,n) +
JudgeDiagonalRight(arr,MAX,n) +
JudgeDiagonalLeft(arr,MAX,n));
}
void Output(int arr[MAX][MAX], int MAX)
{
for(int i=0; i<MAX; i++)
{
for(int j=0; j<MAX; j++)
cout << setw(3)<<arr[i][j] ;
cout << endl;
}
cout << endl;
cout << endl;
}
int InputSize()
{
int Size;
do
{
cout << "请输入棋盘边长 最小为5" << endl;
cin >> Size;
}while(Size > MAX || Size < 5);
return Size;
}
void Draw(int arr[MAX][MAX], int max_n) //max_n为棋盘大小
{
for(int i = 0; i < max_n; i++)
{
cout << setw(5) << (max_n - i);
for(int j = 0 ; j < max_n ; j++)
{
if(-1 == arr[i][j]) cout << setw(5)<< (char)2;
if( 1 == arr[i][j]) cout << setw(5)<< (char)1;
if(!arr[i][j]) cout << " ";
}
cout << endl << endl;
}
cout << " ";
for(int i = 1; i <= max_n; i++)
cout << setw(5) << i ;
cout << endl;
}
bool FillChess(int arr[MAX][MAX], int max_n, int x, int y, int &count)
{
int Size = max_n;
if(x < 1 || x > Size || y < 1 || y > Size)
{
cout << "坐标输入错误 请重新输入" << endl;
return false;
}
if(arr[Size - y][x -1])
{
cout << "此位置已有棋子 请重新输入" << endl;
return false;
}
if( count % 2 )
{
arr[Size - y][x -1] = 1;
return true;
}
arr[Size - y][x -1] = -1;
return true;
}
void Play(int arr[MAX][MAX], int max_n,int &count)
{
int x,y;
cout << "请输入坐标 纵坐标: 横坐标:" << endl;
do
{
cin >> x >> y;
}while(!FillChess(arr,max_n,x,y,count));
system("cls");
cout << "第" << count << "局" << endl << endl;
count++;
Draw(arr,max_n);
system("pause");
}
int main()
{
int Array[MAX][MAX];
start:
for(int i=0; i<MAX; i++)
for(int j=0; j<MAX; j++)
Array[i][j] = 0;
int count = 1; //局数
int n = 5; //n子棋
int _s = InputSize();
Draw(Array,_s);
do
{
Play(Array,_s,count);
if(1 == Judge(Array,_s,n))
{
cout << "先手获胜" << endl << endl;
break;
}
if(-1 == Judge(Array,_s,n))
{
cout << "后手获胜" << endl << endl;
break;
}
}while(count <= _s * _s );
if(count > _s * _s)
cout << "平局" << endl << endl;
cout << "输入1再玩一局输入0退出"<<endl;
int flag = 0;
cin >> flag;
if(1 == flag) goto start;
return 0;
}