#include "board.h"
void SearchArea::extendArea(int inc, int height, int width)
{
if (top-inc>1) exTop=top-inc;
else exTop=1;
if (bottom+inc<height) exBottom=bottom+inc;
else exBottom=height;
if (left-inc>1) exLeft=left-inc;
else exLeft=1;
if (right+inc<width) exRight=right+inc;
else exRight=width;
}
BOARD::BOARD()
{
width=19;
height=19;
counter_Player1=0;
counter_Player2=0;
counter_EmptyPos=width*height;
searchArea.top=(height+1)/2;
searchArea.bottom=(height+1)/2;
searchArea.left=(width+1)/2;
searchArea.right=(width+1)/2;
board=new char[width*height];
memset(board, 0, width*height);
}
BOARD::BOARD(int w, int h)
{
if (w<=1 || h<=1) throw "The board's width and height must >=2";
width=w;
height=h;
counter_Player1=0;
counter_Player2=0;
counter_EmptyPos=width*height;
searchArea.top=(height+1)/2;
searchArea.bottom=(height+1)/2;
searchArea.left=(width+1)/2;
searchArea.right=(width+1)/2;
board=new char[width*height];
memset(board, 0, width*height);
}
BOARD::BOARD(const BOARD & b)
{
width=b.width;
height=b.height;
counter_Player1=b.counter_Player1;
counter_Player2=b.counter_Player2;
counter_EmptyPos=b.counter_EmptyPos;
searchArea.top=b.searchArea.top;
searchArea.bottom=b.searchArea.bottom;
searchArea.left=b.searchArea.left;
searchArea.right=b.searchArea.right;
if (board) delete[] board;
board=new char[width*height];
memcpy(board, b.board,width*height);
}
BOARD::~BOARD()
{
if (board) delete[] board;
}
char BOARD::operator ()(int x, int y)
{
if (x<1 || y<1 || x>width || y> height) return -1;
return board[(x-1)*width+y-1];
}
void BOARD::move(int x, int y, int playerNo)
{
if (x<1 || y<1 || x>width || y> height) throw "Illegal index number";
switch (playerNo){
case PLAYER1:
board[(x-1)*width+y-1]=PLAYER1;
counter_Player1++;
counter_EmptyPos--;
//update search area
if (x<searchArea.top) searchArea.top=x;
if (x>searchArea.bottom) searchArea.bottom=x;
if (y<searchArea.left) searchArea.left=y;
if (y>searchArea.right) searchArea.right=y;
break;
case PLAYER2:
board[(x-1)*width+y-1]=PLAYER2;
counter_Player2++;
counter_EmptyPos--;
//update search area
if (x<searchArea.top) searchArea.top=x;
if (x>searchArea.bottom) searchArea.bottom=x;
if (y<searchArea.left) searchArea.left=y;
if (y>searchArea.right) searchArea.right=y;
break;
case EMPTYPLAYER:// this branch acts like undo
if (board[(x-1)*width+y-1]!=EMPTYPLAYER){
counter_EmptyPos++;
(board[(x-1)*width+y-1]==PLAYER1) ? counter_Player1-- : counter_Player2--;
board[(x-1)*width+y-1]=EMPTYPLAYER;
//update search area
bool flag_break=false;
//top
for(int i=searchArea.top;i<=searchArea.bottom;i++){
for (int j=searchArea.left;j<=searchArea.right;j++){
if (board[(i-1)*width+j-1]==EMPTYPLAYER) continue;
else{
searchArea.top=i;
flag_break=true;
break;
}
}
if (flag_break) break;
}
//left
flag_break=false;
for(int j=searchArea.left;j<=searchArea.right;j++){
for (int i=searchArea.top;i<=searchArea.bottom;i++){
if (board[(i-1)*width+j-1]==EMPTYPLAYER) continue;
else{
searchArea.left=j;
flag_break=true;
break;
}
}
if (flag_break) break;
}
//right
flag_break=false;
for(int j=searchArea.right;j>=searchArea.left;j--){
for (int i=searchArea.top;i<=searchArea.bottom;i++){
if (board[(i-1)*width+j-1]==EMPTYPLAYER) continue;
else{
searchArea.right=j;
flag_break=true;
break;
}
}
if (flag_break) break;
}
//bottom
flag_break=false;
for(int i=searchArea.bottom;i>=searchArea.top;i--){
for (int j=searchArea.left;j<=searchArea.right;j++){
if (board[(i-1)*width+j-1]==EMPTYPLAYER) continue;
else{
searchArea.bottom=i;
flag_break=true;
break;
}
}
if (flag_break) break;
}
}
break;
default:
throw "Illegal player parameter.";
}
searchArea.extendArea(1, height, width);
}
bool isWinned(BOARD & board, int i, int j, int player)
{
int counter=0;
int x=i,y=j;
//4-direction
//north to south
while (board(i,j)==player) i--;
i++;
while (board(i,j)==player){
i++;
counter++;
}
if (counter>4) return true;
//northwest to southeast
counter=0;
i=x,j=y;
while (board(i,j)==player){
i--;
j--;
}
i++;
j++;
while (board(i,j)==player){
i++;
j++;
counter++;
}
if (counter>4) return true;
//west to east
counter=0;
i=x,j=y;
while (board(i,j)==player){
j--;
}
j++;
while (board(i,j)==player){
j++;
counter++;
}
if (counter>4) return true;
//southwest to northeast
counter=0;
i=x,j=y;
while (board(i,j)==player){
i++;
j--;
}
i--;
j++;
while (board(i,j)==player){
i--;
j++;
counter++;
}
if (counter>4) return true;
return false;
}
SDL 五子棋 GUI Board 类
4星 · 超过85%的资源 需积分: 9 14 浏览量
2012-08-28
12:52:07
上传
评论
收藏 2KB RAR 举报
天籁梓轩
- 粉丝: 7
- 资源: 2
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈