c语言五子棋代码,

c语言五子棋代码,,第1张

package day17.gobang

import java.util.Arrays

public class GoBangGame {

public static final char BLANK='*'

public static final char BLACK='@'

public static final char WHITE='O'

public static final int MAX = 16

private static final int COUNT = 5

//棋盘

private char[][] board

public GoBangGame() {

}

//开始游戏

public void start() {

board = new char[MAX][MAX]

//把二维数组都填充‘*’

for(char[] ary: board){

Arrays.fill(ary, BLANK)

}

}

public char[][] getChessBoard(){

return board

}

public void addBlack(int x, int y) throws ChessExistException{

//@

//char blank = '*'

//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK)

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = BLACK

return

}

throw new ChessExistException("已经有棋子了!")

}

public void addWhite(int x, int y)

throws ChessExistException{

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = WHITE

return

}

throw new ChessExistException("已经有棋子了!")

}

//chess 棋子:'@'/'O'

public boolean winOnY(char chess, int x, int y){

//先找到y方向第一个不是 blank的棋子

int top = y

while(true){

if(y==0 || board[y-1][x]!=chess){

//如果y已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break

}

y--

top = y

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0

y = top

while(true){

if(y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break

}

count++

y++

}

return count==COUNT

}

//chess 棋子:'@'/'O'

public boolean winOnX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = x

while(true){

if(x==0 || board[y][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break

}

x--

top = x

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0

x = top

while(true){

if(x==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break

}

count++

x++

}

return count==COUNT

}

//chess 棋子:'@'/'O'

public boolean winOnXY(char chess, int x, int y){

//先找MAX向第一个不是 blank的棋子

int top = y

int left = x

while(true){

if(x==0 || y==0 || board[y-1][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break

}

x--

y--

top = y

left=x

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0

x = left

y = top

while(true){

if(x==MAX || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break

}

count++

x++

y++

}

return count==COUNT

}

//chess 棋子:'@'/'O'

public boolean winOnYX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = y

int left = x

while(true){

if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break

}

x++

y--

top = y

left=x

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0

x = left

y = top

while(true){

if(x==0 || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break

}

count++

x--

y++

}

return count==COUNT

}

public boolean whiteIsWin(int x, int y) {

//在任何一个方向上赢了,都算赢

return winOnY(WHITE, x, y) ||

winOnX(WHITE, x, y) ||

winOnXY(WHITE, x, y) ||

winOnYX(WHITE, x, y)

}

public boolean blackIsWin(int x, int y) {

return winOnY(BLACK, x, y) ||

winOnX(BLACK, x, y) ||

winOnXY(BLACK, x, y) ||

winOnYX(BLACK, x, y)

}

}

#include<iostream>

#include<cstdlib>

using namespace std

class CHESS

{

public:

CHESS()

void setStep(bool&ipjudge)//双人对战轮流走棋函数

void setStepC(bool&ipjudge)//人机对战走棋函数

void coutChess()//输出棋盘

void coutPW()//输出权值表

bool getTurn(){flag=!flagreturn flag}//轮流走棋控制函数

void flushChess()//刷新棋盘信息函数

void judgeWin()//判断是否赢棋函数

void winer()//赢家输出函数

int getAns(){return result}//返回结果(赢家判断)

static int count//走棋步数变量

private:

bool flag//轮流走棋判断变量

int PW[16][16],tPW[4]//权值变量,最高权值变量

int result,num[2]//结果(赢家判断),玩家输入棋子坐标判断

char inPut[2],temp[2]//玩家输入数据,转换暂存数据

char CBoard[16][16]//棋盘数据

int judgeAWin(int a,int b)//判断是否A为赢家函数

int judgeBWin(int a,int b)//判断是否B为赢家函数

void cSetStep()//电脑走棋函数

void setPower()//初始化权值函数

int adddepth(int depth)//填充权值函数

void judgePw(int x,int y,int direction,int depth,char test)//棋子判断[x坐标,y坐标,方向(顺时针0-无,1-左,2-左上,3-上,4-右上),深度(depth),标识符(A/B)]

void getFinalPw()

//权值判断函数

}

int CHESS::count=0

void VsComputer() //人机对战

void VsPlayer()//双人对战

int main()

{

int choose

CHESS newP

do

{

choose=0

system("cls")

cout<<" 欢乐五子棋"<<endl<<endl

cout<<"请选择:"<<endl<<endl

cout<<"1:人机对战模式"<<endl<<endl

cout<<"2:双人对战模式"<<endl<<endl

cout<<"3:退出游戏"<<endl<<endl<<endl

cout<<"**************"<<endl

cout<<"**************"<<endl<<endl<<endl<<endl

cout<<"请输入你的选择:"

cin>>choose

if(choose==2)

VsPlayer()

else if(choose==1)

VsComputer()

else if(choose==3)

exit(0)

else

{

cout<<"输入错误,请重新输入!"<<endl

system("pause")

}

}while(choose!=3)

return 0

}

void VsComputer()

{

bool ipjudge

CHESS newP

do

{

newP.coutChess()

newP.setStepC(ipjudge)//人机对战函数

if(!ipjudge)

continue

if(!newP.getTurn())

newP.flushChess()

newP.coutChess()

newP.judgeWin()

CHESS::count++

}while(newP.getAns()==0&&CHESS::count<256)

newP.winer()

}

void CHESS::setStepC(bool&ipjudge)

{

int i

if(flag)

{

cout<<"棋手走棋:"

cin>>inPut

for(i=0i<=1i++)

if(inPut[i]<'0'||(inPut[i]>'9'&&inPut[i]<'O')||(inPut[i]>'F'&&inPut[i]<'O')||inPut[i]>'f')

{

ipjudge=false

cout<<"输入越界,请重新输入!"

system("pause")

break

}

}

else

cSetStep()//轮到电脑走棋

}

void CHESS::cSetStep()

{

int i,j,depth=0

setPower()

for(i=0i<16i++)

{

for(j=0j<16j++)

{

if(CBoard[i][j]=='+')//优化:排除周围全是+的情况

{

if(CBoard[i-1][j]=='O'||CBoard[i-1][j-1]=='O'||CBoard[i][j-1]=='O'||CBoard[i+1][j-1]=='O'||CBoard[i+1][j]=='O'||CBoard[i+1][j+1]=='O'||CBoard[i][j+1]=='O'||CBoard[i-1][j+1]=='O')

{

judgePw(i,j,0,depth,'O')

judgePw(i,j,0,depth,'X')

}

else if(CBoard[i-1][j]=='X'||CBoard[i-1][j-1]=='X'||CBoard[i][j-1]=='X'||CBoard[i+1][j-1]=='X'||CBoard[i+1][j]=='X'||CBoard[i+1][j+1]=='X'||CBoard[i][j+1]=='X'||CBoard[i-1][j+1]=='X')

{

judgePw(i,j,0,depth,'O')

judgePw(i,j,0,depth,'X')

}

}

}

}

getFinalPw()

//coutPW()

//system("pause")

if(tPW[0]>0)

CBoard[tPW[1]][tPW[2]]='X'

/*else if(tPW[0]>0&&tPW[3]>1)

{

for(i=0i<16i++)

{

for(j=0j<16j++)

{

if(tPW[0]==PW[i][j])

if()

}

}

}*/

else

{

cout<<"权值函数错误!"

system("pause")

exit(1)

}

}

void CHESS::judgePw(int x,int y,int direction,int depth,char test)

{

if(depth>=0&&depth<4)

{

if(direction==1)//左方

{

if(CBoard[x-depth-1][y]==test)

judgePw(x,y,1,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==2)//左上方

{

if(CBoard[x-depth-1][y-depth-1]==test)

judgePw(x,y,2,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==3)//正上方

{

if(CBoard[x][y-depth-1]==test)

judgePw(x,y,3,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==4)//右上方

{

if(CBoard[x+depth+1][y-depth-1]==test)

judgePw(x,y,4,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==5)//右方

{

if(CBoard[x+depth+1][y]==test)

judgePw(x,y,5,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==6)//右下方

{

if(CBoard[x+depth+1][y+depth+1]==test)

judgePw(x,y,6,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==7)//正下方

{

if(CBoard[x][y+depth+1]==test)

judgePw(x,y,7,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==8)//左下方

{

if(CBoard[x-depth-1][y+depth+1]==test)

judgePw(x,y,6,depth+1,test)

else

PW[x][y]+=adddepth(depth)

}

else if(direction==0)

{

if(CBoard[x-depth-1][y]==test)//左方

judgePw(x,y,1,depth+1,test)

if(CBoard[x-depth-1][y-depth-1]==test)//左上方

judgePw(x,y,2,depth+1,test)

if(CBoard[x][y-depth-1]==test)//正上方

judgePw(x,y,3,depth+1,test)

if(CBoard[x+depth+1][y-depth-1]==test)//右上方

judgePw(x,y,4,depth+1,test)

if(CBoard[x+depth+1][y]==test)//右方

judgePw(x,y,5,depth+1,test)

if(CBoard[x+depth+1][y+depth+1]==test)//右下方

judgePw(x,y,6,depth+1,test)

if(CBoard[x][y+depth+1]==test)//正下方

judgePw(x,y,7,depth+1,test)

if(CBoard[x-depth-1][y+depth+1]==test)//左下方

judgePw(x,y,6,depth+1,test)

}

}

else if(depth==4)

PW[x][y]+=adddepth(depth)

else

{

cout<<"深度函数出错!"

system("pause")

exit(1)

}

}

int CHESS::adddepth(int depth)

{

switch(depth)

{

case 0:return 0break

case 1:return 1break

case 2:return 2break

case 3:return 4break

case 4:return 6break

default:

{

cout<<"深度函数错误!"

system("pause")

exit(1)

}

}

}

void CHESS::getFinalPw()

{

int i,j

for(i=0i<=15i++)

for(j=0j<=15j++)

{

if(PW[i][j]>tPW[0])

{

tPW[0]=PW[i][j]

tPW[1]=i

tPW[2]=j

tPW[3]=1

}

else if(PW[i][j]==tPW[0]&&PW[i][j]!=0)

tPW[3]+=1

}

}

////////////////////////////////////////////////////////////////////////

//双人对战

////////////////////////////////////////////////////////////////////////

void VsPlayer()

{

bool ipjudge

CHESS newP

do

{

newP.coutChess()

newP.setStep(ipjudge)

if(!ipjudge)

continue

newP.getTurn()

newP.flushChess()

newP.coutChess()

newP.judgeWin()

CHESS::count++

}while(newP.getAns()==0&&CHESS::count<256)

newP.winer()

}

void CHESS::winer()

{

if(CHESS::count==256)

{

cout<<"|||||||||平局!本局结束!"<<endl

system("pause")

exit(1)

}

if(result==1)

cout<<"|||||||||恭喜!棋手A赢得本局胜利!"<<endl<<endl

else if(result==2)

cout<<"|||||||||恭喜!棋手B赢得本局胜利!"<<endl<<endl

system("pause")

}

//默认构造函数

CHESS::CHESS()

{

int i,j

count=0

result=0

flag=true

for(i=0i<=15i++)

{

if(i<10)

CBoard[i][0]=i+48

else

CBoard[i][0]=i+55

}

for(i=0i<=15i++)

for(j=0j<=15j++)

CBoard[i][j]='+'

}

//填充权值函数

void CHESS::setPower()

{

int i,j

for(i=0i<=15i++)

for(j=0j<=15j++)

PW[i][j]=0

tPW[0]=0

tPW[1]=0

tPW[2]=0

tPW[3]=0

}

//输出棋盘函数

void CHESS::coutChess()

{

int i,j

system("cls")

cout<<" 欢乐五子棋"<<endl<<endl

cout<<" 0 1 2 3 4 5 6 7 8 9 A B C D E F"<<endl

for(i=0i<=15i++)

{

if(i>=0&&i<10)

cout<<i<<' '

else if(i>=10)

cout<<static_cast<char>(i+55)<<' '

else

cout<<"棋盘列序号输出错误!"

for(j=0j<=15j++)

cout<<CBoard[i][j]<<' '

cout<<endl

}

cout<<endl<<endl

}

//双人对战,棋手轮流走棋函数

void CHESS::setStep(bool&ipjudge)

{

if(flag)

cout<<"棋手A走棋:"

else

cout<<"棋手B走棋:"

cin>>inPut

for(int i=0i<=1i++)

{

if(inPut[i]<'0'||(inPut[i]>'9'&&inPut[i]<'O')||(inPut[i]>'F'&&inPut[i]<'O')||inPut[i]>'f')

{

ipjudge=false

cout<<"输入越界,请重新输入!"

system("pause")

break

}

}

}

//刷新棋盘

void CHESS::flushChess()

{

int i

temp[0]=inPut[0]

temp[1]=inPut[1]

for(i=0i<=1i++)

{

if(temp[i]>='0'&&temp[i]<='9')

num[i]=static_cast<int>(temp[i]-48)

else if(temp[i]>='O'&&temp[i]<='F')

num[i]=static_cast<int>(temp[i]-55)

else if(temp[i]>='O'&&temp[i]<='f')

num[i]=static_cast<int>(temp[i]-87)

else

{

cout<<"用户输入未知错误1,请重新输入!"

system("pause")

exit(1)

}

}

if(CBoard[num[0]][num[1]]=='+'&&!flag)

CBoard[num[0]][num[1]]='O'

else if(CBoard[num[0]][num[1]]=='+'&&flag)

CBoard[num[0]][num[1]]='X'

else

{

flag=!flag

cout<<"用户输入错误,请重新输入!"

system("pause")

}

}

//判断胜出新算法

void CHESS::judgeWin()

{

int i=0,j

do

{

j=0

do

{

if(CBoard[i][j]=='O')

result=judgeAWin(i,j)

else if(CBoard[i][j]=='X')

result=judgeBWin(i,j)

else if(CBoard[i][j]=='+')

else

{

cout<<"棋盘["<<i<<"]["<<j<<"]位置信息错误!"<<endl

system("pause")

exit(1)

}

if(result==1||result==2)

break

j++

}while(j<=15)

if(result==1||result==2)

break

i++

}while(i<=15)

}

//对棋手A的棋子检测

int CHESS::judgeAWin(int a,int b)

{

if(CBoard[a][b-1]=='O'&&CBoard[a][b-2]=='O'&&CBoard[a][b+1]=='O'&&CBoard[a][b+2]=='O') //横向五子

return 1

else if(CBoard[a+1][b]=='O'&&CBoard[a+2][b]=='O'&&CBoard[a-1][b]=='O'&&CBoard[a-2][b]=='O') //纵向五子

return 1

else if(CBoard[a+1][b+1]=='O'&&CBoard[a+2][b+2]=='O'&&CBoard[a-1][b-1]=='O'&&CBoard[a-2][b-2]=='O') //左上右下五子

{

return 1

}

else if(CBoard[a+1][b-1]=='O'&&CBoard[a+2][b-2]=='O'&&CBoard[a-1][b+1]=='O'&&CBoard[a-2][b+2]=='O') //左下右上五子

return 1

else

return 0

}

//对棋手B的棋子检测

int CHESS::judgeBWin(int a,int b)

{

if(CBoard[a][b-1]=='X'&&CBoard[a][b-2]=='X'&&CBoard[a][b+1]=='X'&&CBoard[a][b+2]=='X') //横向五子

return 2

else if(CBoard[a+1][b]=='X'&&CBoard[a+2][b]=='X'&&CBoard[a-1][b]=='X'&&CBoard[a-2][b]=='X') //纵向五子

return 2

else if(CBoard[a+1][b+1]=='X'&&CBoard[a+2][b+2]=='X'&&CBoard[a-1][b-1]=='X'&&CBoard[a-2][b-2]=='X') //左上右下五子

return 2

else if(CBoard[a+1][b-1]=='X'&&CBoard[a+2][b-2]=='X'&&CBoard[a-1][b+1]=='X'&&CBoard[a-2][b+2]=='X') //左下右上五子

return 2

else

return 0

}

//输出权值表

void CHESS::coutPW()

{

int i,j

system("cls")

cout<<" 欢乐五子棋(权值表)"<<endl<<endl

cout<<" 0 1 2 3 4 5 6 7 8 9 A B C D E F"<<endl

for(i=0i<=15i++)

{

if(i>=0&&i<10)

cout<<i<<' '

else if(i>=10)

cout<<static_cast<char>(i+55)<<' '

else

cout<<"棋盘列序号输出错误!"

for(j=0j<=15j++)

cout<<PW[i][j]<<' '

cout<<endl

}

cout<<endl<<endl

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11031867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存