Ⅰ 用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[行][列]