Ⅰ 用C写一个五子棋程序
#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=!flag;return 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=0;i<=1;i++)
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=0;i<16;i++)
{
for(j=0;j<16;j++)
{
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=0;i<16;i++)
{
for(j=0;j<16;j++)
{
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 0;break;
case 1:return 1;break;
case 2:return 2;break;
case 3:return 4;break;
case 4:return 6;break;
default:
{
cout<<"深度函数错误!";
system("pause");
exit(1);
}
}
}
void CHESS::getFinalPw()
{
int i,j;
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
{
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=0;i<=15;i++)
{
if(i<10)
CBoard[i][0]=i+48;
else
CBoard[i][0]=i+55;
}
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
CBoard[i][j]='+';
}
//填充权值函数
void CHESS::setPower()
{
int i,j;
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
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=0;i<=15;i++)
{
if(i>=0&&i<10)
cout<<i<<' ';
else if(i>=10)
cout<<static_cast<char>(i+55)<<' ';
else
cout<<"棋盘列序号输出错误!";
for(j=0;j<=15;j++)
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=0;i<=1;i++)
{
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=0;i<=1;i++)
{
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=0;i<=15;i++)
{
if(i>=0&&i<10)
cout<<i<<' ';
else if(i>=10)
cout<<static_cast<char>(i+55)<<' ';
else
cout<<"棋盘列序号输出错误!";
for(j=0;j<=15;j++)
cout<<PW[i][j]<<' ';
cout<<endl;
}
cout<<endl<<endl;
}
Ⅱ c语言五子棋判断胜负。给个具体思路也行。我知道是要5个子同一列或同一行或同一斜线。。
给个思路吧:
对每一条输入进行判断是否构成五连珠,也就是对每一条输入去搜索它的横竖斜三个方向去检查是否存在五个连续点。存储的数据结构使用二维数组即可,注意要区分双方的不同(可以奇数步使用0,偶数步使用1标记)。横方向即x不变,y增减;竖方向即y不变,x增减;斜方向有两个,一个是x,y同增减,另一个是xy增减相反。
Ⅲ c语言五子棋判断谁赢算法的疑问
下一个新的子在wei处,然后以这个子为基准来判断,case 0为例,横着判断-》赢得可能性有:这个子是5个子最右边的子……这个子是五个子最左边的子。所以赢得可能性中,那最左边的子的坐标就是wei.x-4,wei.y 即count=4,然后一次判断左边第三个子,第二个子,……右边第四个子,如果有连续的5个子(通过count2或3的值来判断)就算赢了。
Ⅳ C语言词语搜索
/*本程序已在tc2.0上运行成功,根据提示输入txt文件名(带扩展名)和要查的单词*/
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp;
char fname[10],ch,word[100],wp[20],pre;
int i,result=0;
int x,n;
printf("Input filename:");
scanf("%s",fname);
if((fp=fopen(fname,"r"))==NULL)
{
printf("can't open file!\n");
exit(0);
}
getchar();
printf("Input the word:");
scanf("%s",wp);
getchar();
x=1;
n=0;
pre=' ';
while(!feof(fp))
{
ch=getc(fp);
if(ch=='\n')
x++;
if(pre=='\n')
n=0;
if(pre==' '&&ch!=' ')
n++;
if(pre==' ')
{
i=0;
while(ch==wp[i]&&wp[i]!='\0')
{
ch=getc(fp);
i++;
}
if(wp[i]=='\0'&&ch==' ')
{
printf("%s:row=%d,number=%d\n",wp,x,n);
result=1;
break;
}
}
pre=ch;
}
if(result==0)
printf("Can't fine the word!\n");
fclose(fp);
getch();
}
Ⅳ c语言五子棋代码,
我只给你判断输赢的算法,其他的你自己解决//全局变量
int curX,curY;//当前下棋的坐标 0 <= curX <= 15 0 <= curY <= 15
int onTable[16][16];
void WhoWin(int collor)
{ // 竖直方向 水平方向 右上到左下 左上到右下
if( SameLineNum(0,1) >= 5 ||SameLineNum(1,0) >= 5 ||SameLineNum(1,1) >= 5 ||SameLineNum(-1,1) >= 5)
{ printf("%s 方获胜\n",collor);
}
}//判断当前棋子的某个方向上同色棋子有多少
int SameLineNum(int x,int y)
{
int tX,tY;
int num;//同一线上相同颜色棋子数
tX = curX;tY = curY;
do//计算落子一边同颜色的棋子数 (比如左边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX + x;tY = tY + y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
do//计算落子一边同颜色的棋子数 (比如右边)
{ if( onTable(tX,tY) <> onTable(curX,curY)
{ num = num -1 + Max(Abs(curX - tX),Abs(curY - tY);//Max求最大值,Abs求求绝对值
break;
}
tX = tX - x;tY = tY - y;
}
while (x < 0 || j < 0 || i > 15 || j > 15);
return num;
}
Ⅵ 彩色连珠免费下载
http://tieba..com/f?ct=&tn=&rn=&pn=&lm=&kw=%B2%CA%C9%AB%C1%AC%D6%E9&rs2=0&myselectvalue=1&word=%B2%CA%C9%AB%C1%AC%D6%E9&tb=on
Ⅶ c ++五子棋源代码
其实,只需要做少量工作就可以了,判断下棋的人当前落子处,附近是否存在五子连珠就可以了,也就是4个方向(米字型),判断一下落子处附近是否有五子连珠就可以了
Ⅷ 这个符号是什么意思呀
分号分号是一种介于逗号和句号之间的标点符号,主要用以分隔存在一定关系(并列、转折、承接、因果等,通常以并列关系居多)的两句分句——分句可以属于单重复句,也可以是多重复句的第一层分句,或者是大句中的并列部分。除此之外,分号还可以用来分隔作为列举分项出现的并列短语,或是辞书中同一义项的不同释义。详述与例子参见正文。另外,“分号”也可以是“分店”的意思。拓展资料: 标点符号分为点号、标号、符号三大类。点号表示口语中不同长短的停顿,标号表示书面语言里词语的性质或作用。点号:句号( 。)、问号( ?)、感叹号( !)、逗号( ,)顿号(、)、分号(;)和冒号(:)。标号:引号(“ ” ‘ ’)、括号〔( ) [ ] { } 〕、破折号( ── )、省略号(······)、着重号( .)、书名号(《 》〈 〉)、间隔号(·)、连接号( — )和专名号( ____ )。符号:注释号( * )、隐讳号(×)、虚缺号(□)、斜线号( / )、标识号(▲或●)、代替(~)、连珠号(……)、箭头号( →)。
Ⅸ 200分求助c语言问题,五子连珠,具体如下
数组:
qipan[N][N] 棋盘,存储棋盘上的棋子,初始为‘.',玩家1为’x',玩家2为‘o'
in[2] 存储玩家的输入,第一个字母是行,第二个字母是列,例如ac ,表示第一行,第三列,与棋盘对应:如下图o的位置:
a b c d e f
a o
b
c
d
e
qizi[] 存储棋子 有三种'x','0','.'
player[] 存储“玩家”这个字符串
结束方式:
用户输入“quit”
玩家1获胜
玩家2获胜
步数超过N*N(棋盘满,和棋)
棋盘位置:
当用户输入ag时,那么用in[0](即’a‘)-97(小写字母a的值就是97),这样当为a 时,'a'-97=0,对应qipan的第一个下标,而'g'-97=6对应qipan的第二个下标。即qipan[0][6]
qipan数组的第一个下标代表:行,每二个下标代表:列。即qipan[行][列]