Ⅰ c语言编制黑白棋游戏d:
有算法要求吗?
或者只需要双方对下的?
后者比较容易,前者的话搜索一下斑马,可以找到你要的
Ⅱ 怎样写一个两人对战的黑白棋游戏的C语言源程序
//-----wlfyrq-----//
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
ints[8][8];//棋盘二维数组
intflag=-1;//当前轮到谁下棋
intwhite=0,black=0;//黑,白棋子数
typedefstruct
{
intx;
inty;
}PT;
PTbuf[10];
intbuf_pos=0;
//设置CMD窗口光标位置
voidsetxy(intx,inty)
{
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
//获取当前CMD当前光标所在位置
voidgetxy(int*x,int*y)
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORDcoordScreen={0,0};//光标位置
CONSOLE_SCREEN_BUFFER_INFOcsbi;
if(GetConsoleScreenBufferInfo(hConsole,&csbi))
{
//printf("光标坐标:(%d,%d) ",csbi.dwCursorPosition.X,csbi.dwCursorPosition.Y);
*x=csbi.dwCursorPosition.X;
*y=csbi.dwCursorPosition.Y;
}
}
voidbuf_in(intx,inty)//进入buffer
{
buf[buf_pos].x=x;
buf[buf_pos].y=y;
buf_pos++;
}
PTbuf_out()//从buffer移出
{
returnbuf[--buf_pos];
}
voidprt()//输出到屏幕
{
white=0;
black=0;
system("cls");
inti,j;
printf("");
for(i=0;i<8;i++)
{
printf("%2d",i+1);
}
printf(" ");
for(i=0;i<8;i++)
{
printf("%2d",i+1);
for(j=0;j<8;j++)
{
switch(s[i][j])
{
case0:
printf("+");
break;
case1:
white++;
printf("○");
break;
case-1:
black++;
printf("●");
break;
}
}
printf(" ");
}
getxy(&i,&j);
setxy(25,4);
printf("○:%d",white);
setxy(25,5);
printf("●:%d",black);
if(white+black==64)//当黑白字总计达到64个,则表示棋盘所有位置均下完
{
setxy(25,6);
if(white>black)//判断输赢
{
setxy(30,4);
printf("win!");
}
elseif(black>white)
{
setxy(30,5);
printf("●win!");
}
else
{
printf("peace!");
}
setxy(i,j+2);
exit(0);
}
setxy(i,j);
}
voidset_reverse()//翻转棋的颜色
{
while(buf_pos>0)
{
buf_pos--;
s[buf[buf_pos].x][buf[buf_pos].y]=0-s[buf[buf_pos].x][buf[buf_pos].y];
}
}
voidleft_up(intx,inty)//左上方向检索
{
if(x-1>=0&&y-1>=0)
{
if(s[x-1][y-1]==0)
{
buf_pos=0;
}
elseif(s[x-1][y-1]==flag)
{
set_reverse();
}
elseif(s[x-1][y-1]==0-flag)
{
buf_in(x-1,y-1);
left_up(x-1,y-1);
}
}
}
voip(intx,inty)//上--检索
{
if(x-1>=0)
{
if(s[x-1][y]==0)
{
buf_pos=0;
}
elseif(s[x-1][y]==flag)
{
set_reverse();
}
elseif(s[x-1][y]==0-flag)
{
buf_in(x-1,y);
up(x-1,y);
}
}
}
voidright_up(intx,inty)//右上方向检索
{
if(x-1>=0&&y+1<8)
{
if(s[x-1][y+1]==0)
{
buf_pos=0;
}
elseif(s[x-1][y+1]==flag)
{
set_reverse();
}
elseif(s[x-1][y+1]==0-flag)
{
buf_in(x-1,y+1);
right_up(x-1,y+1);
}
}
}
voidright(intx,inty)//右--检索
{
if(y+1<8)
{
if(s[x][y+1]==0)
{
buf_pos=0;
}
elseif(s[x][y+1]==flag)
{
set_reverse();
}
elseif(s[x][y+1]==0-flag)
{
buf_in(x,y+1);
right(x,y+1);
}
}
}
voidright_down(intx,inty)//右下方向检索
{
if(x+1<8&&y+1<8)
{
if(s[x+1][y+1]==0)
{
buf_pos=0;
}
elseif(s[x+1][y+1]==flag)
{
set_reverse();
}
elseif(s[x+1][y+1]==0-flag)
{
buf_in(x+1,y+1);
right_down(x+1,y+1);
}
}
}
voiddown(intx,inty)//下--检索
{
if(x+1<8)
{
if(s[x+1][y]==0)
{
buf_pos=0;
}
elseif(s[x+1][y]==flag)
{
set_reverse();
}
elseif(s[x+1][y]==0-flag)
{
buf_in(x+1,y);
down(x+1,y);
}
}
}
voidleft_down(intx,inty)//左下方向检索
{
if(x+1<8&&y-1>=0)
{
if(s[x+1][y-1]==0)
{
buf_pos=0;
}
elseif(s[x+1][y-1]==flag)
{
set_reverse();
}
elseif(s[x+1][y-1]==0-flag)
{
buf_in(x+1,y-1);
left_down(x+1,y-1);
}
}
}
voidleft(intx,inty)//左--检索
{
if(y-1>=0)
{
if(s[x][y-1]==0)
{
buf_pos=0;
}
elseif(s[x][y-1]==flag)
{
set_reverse();
}
elseif(s[x][y-1]==0-flag)
{
buf_in(x,y-1);
left(x,y-1);
}
}
}
voidfun(intx,inty)//分别在:左上,上,右上,右,右下,下,左下,左,8个方向检索
{
buf_pos=0;
left_up(x,y);
buf_pos=0;
up(x,y);
buf_pos=0;
right_up(x,y);
buf_pos=0;
right(x,y);
buf_pos=0;
right_down(x,y);
buf_pos=0;
down(x,y);
buf_pos=0;
left_down(x,y);
buf_pos=0;
left(x,y);
flag=0-flag;//换对方下棋
prt();
}
intmain()
{
inti,j;
for(i=0;i<8;i++)//初始化棋盘
{
for(j=0;j<8;j++)
{
s[i][j]=0;
}
}
//以下四行为设置两黑,两白棋子
s[3][3]=-1;
s[4][4]=-1;
s[3][4]=1;
s[4][3]=1;
prt();//输出
intx,y;
chara,b;
while(1)
{
if(flag==1)//flag为1时,为白棋,flag为-1时,为黑棋
{
printf(" ○:");
}
elseif(flag==-1)
{
printf(" ●:");
}
fflush(stdin);//清空输入缓冲区
scanf("%c%c",&a,&b);
x=a-'0';//输入的字符转换为数字
y=b-'0';
if(s[x-1][y-1]!=0||x>8||x<1||y>8||y<1)//如果输入的数值不越界
{
prt();
continue;
}
x--;
y--;
s[x][y]=flag;//落子在棋盘上
fun(x,y);//判断该位置周围8个方向上棋子的颜色
}
return0;
}
Ⅲ C语言黑白棋
#include "graphics.h" /*图形系统头文件*/
#define LEFT 0x4b00 /*光标左键值*/
#define RIGHT 0x4d00 /*光标右键值*/
#define DOWN 0x5000 /*光标下键值*/
#define UP 0x4800 /*光标上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/
int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/
char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/
void playtoplay(void);/*人人对战函数*/
void DrawQp(void);/*画棋盘函数*/
void SetPlayColor(int x);/*设置棋子第一次的颜色*/
void MoveColor(int x,int y);/*恢复原来棋盘状态*/
int QpChange(int x,int y,int z);/*判断棋盘的变化*/
void DoScore(void);/*处理分数*/
void PrintScore(int n);/*输出成绩*/
void playWin(void);/*输出胜利者信息*/
/******主函数*********/
void main(void)
{
int gd=DETECT,gr;
initgraph(&gd,&gr,"c:\\tc"); /*初始化图形系统*/
DrawQp();/*画棋盘*/
playtoplay();/*人人对战*/
getch();
closegraph();/*关闭图形系统*/
}
void DrawQp()/*画棋盘*/
{
int i,j;
score1=score2=0;/*棋手一开始得分都为0*/
setbkcolor(BLUE);
for(i=100;i<=420;i+=40)
{
line(100,i,420,i);/*画水平线*/
line(i,100,i,420); /*画垂直线*/
}
setcolor(0);/*取消圆周围的一圈东西*/
setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/
fillellipse(500,200,15,15); /*在显示得分的位置画棋*/
setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/
fillellipse(500,300,15,15);
a[3][3]=a[4][4]=1;/*初始两个黑棋*/
a[3][4]=a[4][3]=2;/*初始两个白棋*/
setfillstyle(SOLID_FILL,WHITE);
fillellipse(120+3*40,120+3*40,15,15);
fillellipse(120+4*40,120+4*40,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2; /*有棋后改变分数*/
DoScore();/*输出开始分数*/
}
void playtoplay()/*人人对战*/
{
int x,y,t=1,i,j,cc=0;
while(1)/*换棋手走棋*/
{
x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/
while(1) /*具体一个棋手走棋的过程*/
{
PrintScore(1);/*输出棋手1的成绩*/
PrintScore(2);/*输出棋手2的成绩*/
SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/
fillellipse(x,y,15,15);
key=bioskey(0);/*接收按键*/
if(key==ESC)/*跳出游戏*/
break;
else
if(key==ENTER)/*如果按键确定就可以跳出循环*/
{
if(y!=80&&a[(x-120)/40][(y-120)/40]!=1
&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/
{
if(t%2==1)/*如果是棋手1移动*/
a[(x-120)/40][(y-120)/40]=1;
else/*否则棋手2移动*/
a[(x-120)/40][(y-120)/40]=2;
if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/
{
a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
cc++;/*开始统计尝试次数*/
if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;/*如果按键无效*/
}
DoScore();/*分数的改变*/
break;/*棋盘变化了,则轮对方走棋*/
}
else/*已经有棋子就继续按键*/
continue;
}
else /*四个方向按键的判断*/
if(key==LEFT&&x>120)/*左方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x-=40;
fillellipse(x,y,15,15);
}
else
if(key==RIGHT&&x<400&&y>80)/*右方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)/*上方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(key==DOWN&&y<400)/*下方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y+=40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)/*结束游戏*/
break;
if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/
{
playWin();/*输出最后结果*/
break;
}
t=t%2+1; /*一方走后,改变棋子颜色即轮对方走*/
cc=0; /*计数值恢复为0*/
} /*endwhile*/
}
void SetPlayColor(int t)/*设置棋子颜色*/
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);/*白色*/
else
setfillstyle(SOLID_FILL,8);/*灰色*/
}
void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/
{
if(y<100)/*如果是从起点出发就恢复蓝色*/
setfillstyle(SOLID_FILL,BLUE);
else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/
switch(a[(x-120)/40][(y-120)/40])
{
case 1:
setfillstyle(SOLID_FILL,15);break; /*白色*/
case 2:
setfillstyle(SOLID_FILL,8);break; /*黑色*/
default:
setfillstyle(SOLID_FILL,BLUE); /*蓝色*/
}
}
int QpChange(int x,int y,int t)/*判断棋盘的变化*/
{
int i,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40; /*计算数组元素的行下标*/
j=(y-120)/40; /*计算数组元素的列下标*/
SetPlayColor(t);/*设置棋子变化的颜色*/
/*开始往8个方向判断变化*/
if(j<6)/*往右边*/
{
for(k=j+1;k<8;k++)
if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/
break;
if(a[i][k]!=0&&k<8)
{
for(kk=j+1;kk<k&&k<8;kk++)/*判断右边*/
{
a[i][kk]=a[i][j]; /*改变棋子颜色*/
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j+1) /*条件成立则有棋子改变过颜色*/
yes=1;
}
}
if(j>1)/*判断左边*/
{
for(k=j-1;k>=0;k--)
if(a[i][k]==a[i][j]||!a[i][k])
break;
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1;kk>k&&k>=0;kk--)
{
a[i][kk]=a[i][j];
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j-1)
yes=1;
}
}
if(i<6)/*判断下边*/
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k<8)
{
for(kk=i+1;kk<k&&k<8;kk++)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i+1)
yes=1;
}
}
if(i>1)/*判断上边*/
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i-1)
yes=1;
}
}
if(i>1&&j<6)/*右上*/
{
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j>1)/*左下*/
{
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
if(i>1&&j>1)/*左上*/
{
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j<6)/* 右下*/
{
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
return yes;/*返回是否改变过棋子颜色的标记*/
}
void DoScore()/*处理分数*/
{
int i,j;
score1=score2=0;/*重新开始计分数*/
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(a[i][j]==1)/*分别统计两个人的分数*/
score1++;
else
if(a[i][j]==2)
score2++;
}
void PrintScore(int playnum)/*输出成绩*/
{
if(playnum==1)/*清除以前的成绩*/
{
setfillstyle(SOLID_FILL,BLUE);
bar(550,100,640,400);
}
setcolor(RED);
settextstyle(0,0,4);/*设置文本输出样式*/
if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/
{
sprintf(playone,"%d",score1);
outtextxy(550,200,playone);
}
else
{
sprintf(playtwo,"%d",score2);
outtextxy(550,300,playtwo);
}
setcolor(0);
}
void playWin()/*输出最后的胜利者结果*/
{
settextstyle(0,0,4);
setcolor(12);
if(score2>score1)/*开始判断最后的结果*/
outtextxy(100,50,"black win!");
else
if(score2<score1)
outtextxy(100,50,"white win!");
else
outtextxy(60,50,"you all win!");
}
Ⅳ C语言编制黑白棋游戏
查无网页
Ⅳ c语言小程序--黑白棋
什么?
Ⅵ 如何只用c语言系统做一个黑白棋游戏
我做过一个没界面的,用X代表黑子用O代表白子
Ⅶ 求教!c语言黑白棋的程序
private void handlePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges, boolean dontReport) {
ActivityClientRecord r = mActivities.get(token);
if (r != null) {
//Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
if (userLeaving) {
performUserLeavingActivity(r);
}
r.activity.mConfigChangeFlags |= configChanges;
performPauseActivity(token, finished, r.isPreHoneycomb());
// Make sure any pending writes are now committed.
if (r.isPreHoneycomb()) {
QueuedWork.waitToFinish();
}
// Tell the activity manager we have paused.
if (!dontReport) {
try {
ActivityManagerNative.getDefault().activityPaused(token);
} catch (RemoteException ex) {
}
}
mSomeActivitiesChanged = true;
}
Ⅷ 求一个C语言的黑白棋程序
人机对战
#include <stdio.h>
#include <ctype.h>
#define SIZE 8
void display(char board[][SIZE]);
int valid_moves(char board[][SIZE],int moves[][SIZE],char player);
void make_move(char board[][SIZE],int row,int col,char player);
void computer_move(char board[][SIZE],int moves[][SIZE],char player);
int get_score(char board[][SIZE],char player);
int best_move(char board[][SIZE],int moves[][SIZE],char player);
void main()
{
char board[SIZE][SIZE]={0};
int moves[SIZE][SIZE]={0};
int row=0;
int col=0;
int no_of_games=0;
int no_of_moves=0;
int invalid_moves=0;
int comp_score=0;
int user_score=0;
char y=0;
char x=0;
char again=0;
int player=0;
printf("\nREVERSI\n\n");
printf("You can go first on the first game,then we will take truns.\n");
printf(" You will be white - (0)\n I will be black - (@).\n");
printf("Select a square for your move by typing a digit for the row\n"
"and a letter for the column with no spaces between.\n");
printf("\nGood luck! press Enter to start.\n");
scanf("%c",&again);
do
{
player=++no_of_games%2;
no_of_moves=4;
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
board[row][col]=' ';
board[SIZE/2-1][SIZE/2-1]=board[SIZE/2][SIZE/2]='0';
board[SIZE/2-1][SIZE/2]=board[SIZE/2][SIZE/2-1]='@';
do
{
display(board);
if(player++%2)
{
if(valid_moves(board,moves,'0'))
{
for(;;)
{
fflush(stdin);
printf("Please enter your move (row column): ");
scanf("%d%c",&x,&y);
y=tolower(y)-'a';
x--;
if(x>=0&&y>=0&&x<SIZE&&y<SIZE&&moves[x][y])
{
make_move(board,x,y,'0');
no_of_moves++;
break;
}
else
printf("Not a valid move,try again.\n");
}
}
else
if(++invalid_moves<2)
{
fflush(stdin);
printf("\nYou have to pass,press return");
scanf("%c",&again);
}
else
printf("\nNeither of us can go, so the game is over.\n");
}
else
{
if(valid_moves(board,moves,'@'))
{
invalid_moves=0;
computer_move(board,moves,'@');
no_of_moves++;
}
else
{
if(++invalid_moves<2)
printf("\nI have to pass, your go\n");
else
printf("\nNeither of us can go, so the game is over.\n");
}
}
}while(no_of_moves<SIZE*SIZE&&invalid_moves<2);
display(board);
comp_score=user_score=0;
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
{
comp_score+=board[row][col]=='@';
user_score+=board[row][col]=='0';
}
printf("The final score is:\n");
printf("Computer %d\n User %d\n\n",comp_score,user_score);
fflush(stdin);
printf("Do you want to play again (y/n): ");
scanf("%c",&again);
}while(tolower(again)=='y');
printf("\nGoodbye\n");
}
void display(char board[][SIZE])
{
int row=0;
int col=0;
char col_label='a';
printf("\n ");
for(col=0;col<SIZE;col++)
printf(" %c",col_label+col);
printf("\n");
for(row=0;row<SIZE;row++)
{
printf(" +");
for(col=0;col<SIZE;col++)
printf("---+");
printf("\n%2d|",row+1);
for(col=0;col<SIZE;col++)
printf(" %c |",board[row][col]);
printf("\n");
}
printf(" +");
for(col=0;col<SIZE;col++)
printf("---+");
printf("\n");
}
int valid_moves(char board[][SIZE],int moves[][SIZE],char player)
{
int rowdelta=0;
int coldelta=0;
int row=0;
int col=0;
int x=0;
int y=0;
int no_of_moves=0;
char opponent=(player=='0')?'@':'0';
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
moves[row][col]=0;
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
{
if(board[row][col]!=' ')
continue;
for(rowdelta=-1;rowdelta<=1;rowdelta++)
for(coldelta=-1;coldelta<=1;coldelta++)
{
if(row+rowdelta<0||row+rowdelta>=SIZE||
col+coldelta<0||col+coldelta>=SIZE||
(rowdelta==0&&coldelta==0))
continue;
if(board[row+rowdelta][col+coldelta]==opponent)
{
x=row+rowdelta;
y=col+coldelta;
for(;;)
{
x+=rowdelta;
y+=coldelta;
if(x<0||x>=SIZE||y<0||y>=SIZE)
break;
if(board[x][y]==' ')
break;
if(board[x][y]==player)
{
moves[row][col]=1;
no_of_moves++;
break;
}
}
}
}
}
return no_of_moves;
}
void make_move(char board[][SIZE],int row,int col,char player)
{
int rowdelta=0;
int coldelta=0;
int x=0;
int y=0;
char opponent=(player=='0')?'@':'0';
board[row][col]=player;
for(rowdelta=-1;rowdelta<=1;rowdelta++)
for(coldelta=-1;coldelta<=1;coldelta++)
{
if(row+rowdelta<0||row+rowdelta>=SIZE||
col+coldelta<0||col+coldelta>=SIZE||
(rowdelta==0&&coldelta==0))
continue;
if(board[row+rowdelta][col+coldelta]==opponent)
{
x=row+rowdelta;
y=col+coldelta;
for(;;)
{
x+=rowdelta;
y+=coldelta;
if(x<0||x>=SIZE||y<0||y>=SIZE)
break;
if(board[x][y]==' ')
break;
if(board[x][y]==player)
{
while(board[x-=rowdelta][y-=coldelta]==opponent)
board[x][y]=player;
break;
}
}
}
}
}
int get_score(char board[][SIZE],char player)
{
int score=0;
int row=0;
int col=0;
char opponent=player=='0'?'@':'0';
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
{
score-=board[row][col]==opponent;
score+=board[row][col]==player;
}
return score;
}
int best_move(char board[][SIZE],int moves[][SIZE],char player)
{
int row=0;
int col=0;
int i=0;
int j=0;
char opponent=player=='0'?'@':'0';
char new_board[SIZE][SIZE]={0};
int score=0;
int new_score=0;
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
{
if(!moves[row][col])
continue;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
new_board[i][j]=board[i][j];
make_move(new_board,row,col,player);
new_score=get_score(new_board,player);
if(score<new_score)
score=new_score;
}
return score;
}
void computer_move(char board[][SIZE],int moves[][SIZE],char player)
{
int row=0;
int col=0;
int best_row=0;
int best_col=0;
int i=0;
int j=0;
int new_score=0;
int score=100;
char temp_board[SIZE][SIZE];
int temp_moves[SIZE][SIZE];
char opponent=player=='0'?'@':'0';
for(row=0;row<SIZE;row++)
for(col=0;col<SIZE;col++)
{
if(moves[row][col]==0)
continue;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
temp_board[i][j]=board[i][j];
make_move(temp_board,row,col,player);
valid_moves(temp_board,temp_moves,opponent);
new_score=best_move(temp_board,temp_moves,opponent);
if(new_score<score)
{
score=new_score;
best_row=row;
best_col=col;
}
}
make_move(board,best_row,best_col,player);
}
我已经用英文说明了如何操作了......看不懂的我在这个说一下.
先按回车开始游戏,然后输入行号和列号就可以了...一局结束之后,
会提示是否再来一盘输入大写的Y继续大写的N结束程序!!!
我已经对操作说的很明确了!~~~~~你控制的是白棋(0),首先按回车开始游戏,然后输入行号(数字),列号(字符)就行了.......如果还是不行的话,那就是你更本不懂黑白棋的规则....
Ⅸ 高分求C语言黑白棋游戏可执行源码
你发个邮箱地址吧,代码量说大不大,但是也不小,放不下
Ⅹ C语言编制黑白棋游戏:
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
short int chess[12][12];
short int next[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};/*方向数组*/
void print(); /*输出函数*/
void calculate(); /*数子函数*/
int main()
{
int state; /*状态变量*/
/*介绍*/
printf(" 黑白棋 ");
printf("1.黑方先行,双方交替下棋。 2.一步合法的棋步包括:在一个空格新落下一个棋子,并且翻转对手一个或多个棋子。 3.新落下的棋子与棋盘上已有的同色棋子间,对方被夹住的所有棋子都要翻转过来。可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格。 4.一步棋可以在数个方向上翻棋
,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。
5.除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。
6.如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。
7.棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。
8.输入坐标时,分别输入横纵坐标,如: 7 2 表示第7行,第2列。
9.在游戏时,若想查看规则,请输入 0 0 。
10.形势判断请输入 9 9 。
");
printf(" 1=开始 0=退出 ");
scanf("%d",&state);
if(state==0)
return 0;
else if(state==1)
system("cls");
else
{
printf("错误!");
return 0;
}
/*初始化*/
memset(chess,0,sizeof(chess));
chess[5][5]=1,chess[4][4]=1,chess[5][4]=2,chess[4][5]=2;
/*开始*/
int i,j,k; /*i用于步数循环*/
int x,y; /*横纵坐标*/
int nx,ny; /*檎蚁乱桓鲎?/
int white,black;
for(i=5;i<=64;i++)
{
/*黑方的步骤 */
print();
place:
printf("黑方请输入坐标:");
scanf("%d%d",&x,&y);
if(x==0&&y==0) /*查看规则*/
{
system("cls");
printf("1.黑方先行,双方交替下棋。 2.一步合法的棋步包括:在一个空格新落下一个棋子,并且翻转对手一个或多个棋子。 3.新落下的棋子与棋盘上已有的同色棋子间,对方被夹住的所有棋子都要翻转过来。可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格。 4.一步棋可以在数个方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。 5.除非至少翻转了对手的一个棋子,否则就不能落子。如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。 6.如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。 7.棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。 8.输入坐标时,分别输入横纵坐标,如: 7 2 表示第7行,第2列。 9.在游戏时,若想查看规则,请输入 0 0 。 10.形势判断请输入 9 9 。 ");
guize:
printf(" 输入1以继续 ");
scanf("%d",&state);
if(state==1)
{
system("cls");
goto place;
}
else
{
printf("错误 ");
goto guize;
}
}
else if(x==9&&y==9)
{
calculate();
goto place;
}
/*判断落子是否合法*/
if(chess[x][y]!=0)
{
printf("非法的落子:该点已有棋! ");
goto place;
}
else
{
bool whether=false; /*是否合法:true表示合法*/
for(j=0;j<=7;j++)
{
nx=x;
ny=y;
white=0;
while(1)
{
nx=nx+next[j][0];
ny=ny+next[j][1];
if((chess[nx][ny]==0&&white==0)||(nx>8||nx<1||ny>8||ny<1))
{
break;
}
else if(chess[nx][ny]==2)
{
white++;
}
else if(chess[nx][ny]==1&&white>0)
{
int change=0;
chess[x][y]=1;
whether=true;
nx=x;
ny=y;
while(change<=white)
{
nx=nx+next[j][0];
ny=ny+next[j][1];
chess[nx][ny]=1;
change++;
}
break;
}
}
if(j==7&&whether==false)
{
printf("非法的落子:该子不能翻转对方棋子! ");
goto place;
}
}
}
system("cls");
print();
Sleep(3000);
/*白方的步骤*/
bool w=false; /*白方是否无棋可走*/
int recordj,recordk; /*记录*/
for(j=1;j<=8;j++)
{
for(k=1;k<=8;k++)
{
bool whether=false; /*是否合法:true表示合法*/
int num=0,sum=0; /*计数*/
for(int l=0;l<=7;l++)
{
black=0;
nx=j;
ny=k;
while(1)
{
nx=nx+next[l][0];
ny=ny+next[l][1];
if((chess[nx][ny]==0)||(nx>8||nx<1||ny>8||ny<1))
{
break;
}
else if(chess[nx][ny]==1)
{
black++;
}
else if(chess[nx][ny]==2&&black>0)
{
whether=true;
w=true;
break;
}
}
if(whether==true)
{
sum+=black;
}
}
if(sum>num)
{
num=sum;
recordj=j;
recordk=k;
}
}
}
if(w==true)
{
chess[recordj][recordk]=2;
for(int m=0;m<=7;m++)
{
nx=recordj;
ny=recordk;
black=0;
while(1)
{
nx=nx+next[m][0];
ny=ny+next[m][1];
if((chess[nx][ny]==0)||(nx>8||nx<1||ny>8||ny<1))
{
break;
}
else if(chess[nx][ny]==1)
{
black++;
}
else if(chess[nx][ny]==2&&black>0)
{
int change=0;
nx=recordj;
ny=recordk;
while(change<=black)
{
nx=nx+next[m][0];
ny=ny+next[m][1];
chess[nx][ny]=2;
change++;
}
break;
}
}
}
}
else/*白方无棋可走*/
{
printf("白方无棋可走 ");
}
Sleep(1000);
system("cls");
}
return 0;
}
void print()
{
int p,q;
printf(" 1 2 3 4 5 6 7 8 ");
for(p=1;p<=8;p++)
{
printf("%d",p);
for(q=1;q<=8;q++)
{
if(chess[p][q]==1)
printf("●");
else if(chess[p][q]==2)
printf("○");
else
printf(" ");
}
printf(" ");
}
}
void calculate()
{
int pp,qq;
int bla=0,whi=0;
for(pp=1;pp<=8;pp++)
{
for(qq=1;qq<=8;qq++)
{
if(chess[pp][qq]==1)
bla++;
else if(chess[pp][qq]==2)
whi++;
}
}
printf("黑子数:%d 白子数:%d ",bla,whi);
}