
#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=100i<=420i+=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+1k<8k++)
if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/
break
if(a[i][k]!=0&&k<8)
{
for(kk=j+1kk<k&&k<8kk++)/*判断右边*/
{
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-1k>=0k--)
if(a[i][k]==a[i][j]||!a[i][k])
break
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1kk>k&&k>=0kk--)
{
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+1k<8k++)
if(a[k][j]==a[i][j]||!a[k][j])
break
if(a[k][j]!=0&&k<8)
{
for(kk=i+1kk<k&&k<8kk++)
{
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-1k>=0k--)
if(a[k][j]==a[i][j]||!a[k][j])
break
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1kk>k&&k>=0kk--)
{
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+1k>=0&&kk<8k--,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+1ii>k&&k>=0ii--,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-1k<8&&kk>=0k++,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-1ii<k&&k<8ii++,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-1k>=0&&kk>=0k--,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-1ii>k&&k>=0ii--,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+1kk<8&&kk<8k++,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+1ii<k&&k<8ii++,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=0i<8i++)
for(j=0j<8j++)
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!")
}
你既然用二维数组,那么为什么要输入2A这个东西给你自己添堵呢?可以直接输入两个数字啊!把二维数组当成XY坐标,当输入XY的时候把a[X][Y]=‘w’或者‘b’就行了,一个函数就可以搞定。对于a[x][y]是等于w呢还是y。可以利用自动机思想解决。
#define
W
1
#define
B
0
int
state
state
=
B
while(1)
{
if
(state
==
B)
{
a[x][y]
=
'b'
state
=
W
}
else
if
(state
==
W)
{
a[x][y]='w'
state
=
B
}
}
至于每次输出不一样,调用system(“cls”)清屏就OK了。在windows.h中
清楚屏幕,然后在输出一下就行了
可以利用指针在两个函数直接传递值。
其他的应该比较好解决。
//-----wlfyrq-----//#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int s[8][8] //棋盘二维数组
int flag=-1 //当前轮到谁下棋
int white=0,black=0 //黑,白棋子数
typedef struct
{
int x
int y
}PT
PT buf[10]
int buf_pos=0
//设置CMD窗口光标位置
void setxy(int x, int y)
{
COORD coord = {x, y}
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord)
}
//获取当前CMD当前光标所在位置
void getxy(int* x, int* y)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE)
COORD coordScreen = {0, 0} //光标位置
CONSOLE_SCREEN_BUFFER_INFO csbi
if (GetConsoleScreenBufferInfo(hConsole, &csbi))
{
// printf("光标坐标:(%d,%d)\n", csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y)
*x=csbi.dwCursorPosition.X
*y=csbi.dwCursorPosition.Y
}
}
void buf_in(int x, int y) //进入buffer
{
buf[buf_pos].x=x
buf[buf_pos].y=y
buf_pos++
}
PT buf_out() //从buffer移出
{
return buf[--buf_pos]
}
void prt() //输出到屏幕
{
white=0
black=0
system("cls")
int i,j
printf(" ")
for(i=0i<8i++)
{
printf("%2d",i+1)
}
printf("\n")
for(i=0i<8i++)
{
printf("%2d",i+1)
for(j=0j<8j++)
{
switch(s[i][j])
{
case 0:
printf("+")
break
case 1:
white++
printf("○")
break
case -1:
black++
printf("●")
break
}
}
printf("\n")
}
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!")
}
else if(black>white)
{
setxy(30,5)
printf("● win!")
}
else
{
printf("peace!")
}
setxy(i,j+2)
exit(0)
}
setxy(i,j)
}
void set_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]
}
}
void left_up(int x, int y) //左上方向检索
{
if(x-1>=0 && y-1>=0)
{
if(s[x-1][y-1]==0)
{
buf_pos=0
}
else if(s[x-1][y-1]==flag)
{
set_reverse()
}
else if(s[x-1][y-1]==0-flag)
{
buf_in(x-1,y-1)
left_up(x-1,y-1)
}
}
}
void up(int x, int y) //上--检索
{
if(x-1>=0)
{
if(s[x-1][y]==0)
{
buf_pos=0
}
else if(s[x-1][y]==flag)
{
set_reverse()
}
else if(s[x-1][y]==0-flag)
{
buf_in(x-1,y)
up(x-1,y)
}
}
}
void right_up(int x, int y) //右上方向检索
{
if(x-1>=0 && y+1<8)
{
if(s[x-1][y+1]==0)
{
buf_pos=0
}
else if(s[x-1][y+1]==flag)
{
set_reverse()
}
else if(s[x-1][y+1]==0-flag)
{
buf_in(x-1,y+1)
right_up(x-1,y+1)
}
}
}
void right(int x, int y) //右--检索
{
if(y+1<8)
{
if(s[x][y+1]==0)
{
buf_pos=0
}
else if(s[x][y+1]==flag)
{
set_reverse()
}
else if(s[x][y+1]==0-flag)
{
buf_in(x,y+1)
right(x,y+1)
}
}
}
void right_down(int x, int y) //右下方向检索
{
if(x+1<8 && y+1<8)
{
if(s[x+1][y+1]==0)
{
buf_pos=0
}
else if(s[x+1][y+1]==flag)
{
set_reverse()
}
else if(s[x+1][y+1]==0-flag)
{
buf_in(x+1,y+1)
right_down(x+1,y+1)
}
}
}
void down(int x, int y) //下--检索
{
if(x+1<8)
{
if(s[x+1][y]==0)
{
buf_pos=0
}
else if(s[x+1][y]==flag)
{
set_reverse()
}
else if(s[x+1][y]==0-flag)
{
buf_in(x+1,y)
down(x+1,y)
}
}
}
void left_down(int x, int y) //左下方向检索
{
if(x+1<8 && y-1>=0)
{
if(s[x+1][y-1]==0)
{
buf_pos=0
}
else if(s[x+1][y-1]==flag)
{
set_reverse()
}
else if(s[x+1][y-1]==0-flag)
{
buf_in(x+1,y-1)
left_down(x+1,y-1)
}
}
}
void left(int x, int y) //左--检索
{
if(y-1>=0)
{
if(s[x][y-1]==0)
{
buf_pos=0
}
else if(s[x][y-1]==flag)
{
set_reverse()
}
else if(s[x][y-1]==0-flag)
{
buf_in(x,y-1)
left(x,y-1)
}
}
}
void fun(int x, int y) //分别在:左上,上,右上,右,右下,下,左下,左, 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()
}
int main()
{
int i,j
for(i=0i<8i++) //初始化棋盘
{
for(j=0j<8j++)
{
s[i][j]=0
}
}
//以下四行为设置两黑,两白棋子
s[3][3]=-1
s[4][4]=-1
s[3][4]=1
s[4][3]=1
prt() //输出
int x,y
char a,b
while(1)
{
if(flag==1) //flag为1时, 为白棋, flag为-1时, 为黑棋
{
printf("\n\n○ : ")
}
else if(flag==-1)
{
printf("\n\n● : ")
}
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个方向上棋子的颜色
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)