五子棋c语言最简单代码(C语言编五子棋(二维数组),很简单)
本文目录
- C语言编五子棋(二维数组),很简单
- 高分求一个C语言的五子棋程序
- 用C语言编写一个五子棋的游戏程序
- C语言五子棋
- c语言五子棋代码,
- 急求用C语言编写的五子棋代码
- 用c编写的五子棋代码,请高手点评
- 求助 五子棋用c语言怎么编
- 编写一道五子棋的C语言程序,如何写一个鼠标点击的函数,麻烦哪位高手帮我写一个简单易懂的
- 帮忙编程序,C语言,简化的五子棋
C语言编五子棋(二维数组),很简单
#include 《*****》
int a={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};
void banben()
{
printf(" ***************************************\n");
printf(" * 欢 迎 *\n");
printf(" * 五 子 棋 *\n");
printf(" * 版本号:**** 正式版*\n");
printf(" * 更新:1.新增系统只能判断结果!*\n");
printf(" * 2.全面支持中文人名 *\n");
printf(" * 3.采用国际标准棋盘15*15 *\n");
printf(" ***************************************\n\n\n");
}
void guize()
{
printf(" 五子棋规则 \n");
printf(" 五子棋比赛规则行棋顺序黑先、白后,从天元开始相\n");
printf(" 互顺序落子。判断胜负最先在棋盘横向、竖向、斜向\n");
printf(" 形成连续的相同色五个棋子的一方为胜。棋盘:15*15 \n");
printf(" 注意:输入姓名是一定是3个汉字!如果姓名为两个字\n");
printf(" 的话,请多打2个字符,以保证程序正常运行!谢谢!\n\n\n\n\n\n\n\n");
}
void printQP()
{
int x,y,k=1;
printf(" 1 2 3 4 5 6 7 8 9 101112131415\n");
for (x=1;x《=15;x++)
{ if(k《=9 )
printf(" ");
printf("%d",k);
for(y=1;y《=15;y++)
{
if(a==0)
printf("□");
if(a==1)
printf("○");
if(a==2)
printf("●");
}
printf("\n");
k++;
}
}
int pd(int x,int y,int cc)
{ int xt,yt,count;
//横向
count=0;
xt=x;yt=y-1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
yt--;
}
xt=x;yt=y+1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
yt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//纵向
count=0;
xt=x-1;yt=y;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
xt--;
}
xt=x+1;yt=y;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//主对角线
count=0;
xt=x-1;yt=y+1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
xt--;yt++;
}
xt=x+1;yt=y-1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
yt--;xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//对角线
count=0;
xt=x-1;yt=y-1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
yt--;xt--;
}
xt=x+1;yt=y+1;
while( yt》=1 && yt《=15 && xt《=15 && xt》=1 && a==cc)
{
count++;
yt++;xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
else
return 0;
}
int hefa(int x,int y)
{
if( x》=1 && y》=1 && x《=15 && y《=15 && a==0)
return 1;
else
return 0;
}
int main()
{
int xt,yt,x,y,cc,count,l=0,g=0;
char e;
banben();
e=1;
f=1;
guize();
printf("请输入玩家一姓名(黑棋)支持中文:");
scanf("%s",e);
printf("请输入玩家二姓名(白棋)支持中文:");
scanf("%s",f);
printQP();
g=0;
while(g==0)
{
kaishi:
cc=1;
printf("%s下\n",e);
scanf("%d%d",&x,&y);
l=hefa(x,y);
if (l==1)
{
a=1;
}
else
{printf("棋子错误!\n");
goto kaishi;
}
if (a==1)
{
printQP();
}
g=0;
g=pd(x,y,cc);
if(g==1)
{printf("s赢!\n",e); break;}
if(g==2)
{printf("%s赢!\n",f); break;}
///////////////////////////////////////////////////////
kaishi2:
cc=2;
printf("%s下\n",f);
scanf("%d%d",&x,&y);
l=hefa(x,y);
if (l==1)
{
a=2;
}
else
{
printf("棋子错误!\n");
goto kaishi2;
}
if (a==2)
{
printQP();
}
g=0;
g=pd(x,y,cc);
if(g==1)
{printf("%s赢!\n",e); break;}
if(g==2)
{printf("%s赢!\n",f); break;}
}
getchar(); getchar();
return 0;
}
高分求一个C语言的五子棋程序
。
//但是这些代码由于编译器的原因,在TC下仍无法运行。请使用VC。
#include 《*****》
#include 《*****》
#include 《*****》
#include 《*****》
int ChessData ={0};
int GuangbiaoData={8,8};
int ChessStepData={0};
void gotoxy(int x, int y) //gotoxy在TC中是在一个系统自带的函数,但是在VC中没有这个函数,所以在网上找到了这个函数以实现同样的功能。
//只有这一个函数是网上找的,别的全部我自己写的。
{
COORD c;
***=x-1;
***=y-1;
SetC***oleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void GotoChess(int x,int y)
{
x=3*x-2;y=2*y-1;
gotoxy(x,y);
}
void Move(int MoveData) //输入参数为用户输入的方向(1表示上,2表示下,3表示左,4表示右)
{
switch (MoveData)
{
case 1:GuangbiaoData-=1;break;
case 2:GuangbiaoData+=1;break;
case 3:GuangbiaoData-=1;break;
case 4:GuangbiaoData+=1;break;
default:printf("Move函数出错");
}
GotoChess(GuangbiaoData);
}
int Get(int *data) //该函数的功能是用户的按键,并转化为01234567(0表示输入错误,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。)
{ //并返回输入的用户号码(共同键返回3),错误则返回0
int temp;
B: temp=getch();
if (temp==224)
{
temp=getch();
switch (temp)
{
case 72:*data=1;break;
case 80:*data=2;break;
case 75:*data=3;break;
case 77:*data=4;break;
default:goto B;
}
return 2;
}
else
{
switch (temp)
{
case ’w’:
case ’W’:*data=1;return 1;break;
case ’s’:
case ’S’:*data=2;return 1;break;
case ’a’:
case ’A’:*data=3;return 1;break;
case ’d’:
case ’D’:*data=4;return 1;break;
case 13 :*data=5;return 2;break;
case 32 :*data=5;return 1;break;
case 8 :*data=6;break;
case 27 :*data=7;break;
default:*data=0 ;return 0;break;
}
return 3;
}
}
void MoveToEnd()
{
gotoxy(1,30);
}
int LogicBeOut(int a,int b)
{
if (a==-1||a==15||b==-1||b==15) return 1;
else return 0;
}
int win(int v)
{
int i=1,j=1,a=0,b=0;
while (ChessData==v*2&&!LogicBeOut(a,b)) i++;
while (ChessData==v*2&&!LogicBeOut(a,b)) j++;
if (i+j-1》=5) return 1;
i=1,j=1,a=0,b=0;
while (ChessData==v*2&&!LogicBeOut(a,b)) i++;
while (ChessData==v*2&&!LogicBeOut(a,b)) j++;
if (i+j-1》=5) return 1;
i=1,j=1,a=0,b=0;
while (ChessData==v*2&&!LogicBeOut(a,b)) i++;
while (ChessData==v*2&&!LogicBeOut(a,b)) j++;
if (i+j-1》=5) return 1;
i=1,j=1,a=0,b=0;
while (ChessData==v*2&&!LogicBeOut(a,b)) i++;
while (ChessData==v*2&&!LogicBeOut(a,b)) j++;
if (i+j-1》=5) return 1;
return 0;
}
void NewShow() //新棋局的开始
{
int i,j;
for (i=0;i《15;i++)
for (j=0;j《15;j++)
ChessData=0;
system("cls");
for (i=1;i《=29;i++)
{
for (j=1;j《=43;j++)
if(i%2==1) printf("-");
else if (j%3==1) printf("|");
else printf(" ");
printf("\n");
}
GuangbiaoData=8;
MoveToEnd();
printf("现在请用户1下棋 \n");
printf("用户1使用 w,s,a,d移动光标,空格键落子\n");
printf("用户2使用各方向键移动光标,回车键落子\n");
printf("按下Backspace键悔棋,按下esc返回主菜单\n");
GotoChess(8,8);
}
int BeOut(int data)
{
int Xiuzheng;
switch (data)
{
case 1:Xiuzheng=-1 ;break;
case 2:Xiuzheng=1;break;
case 3:Xiuzheng=0;break;
case 4:Xiuzheng=0 ;break;
case 5:Xiuzheng=0 ;break;
default:printf("BeOut函数出错");
}
New;
New;
if (New《1) return 1;
else return 0;
}
void UserChoose(int * choice)
{
system("cls");
printf("________________________________________________________________________________");
printf("________________________________________________________________________________");
printf(" $1.单人游戏 ");
printf(" 2.双人游戏 ");
printf(" 3.退出游戏 ");
printf(" 4.游戏帮助 ");
printf("________________________________________________________________________________");
printf("________________________________________________________________________________");
printf(" ");
printf(" 开心五子棋 ");
printf(" ");
printf(" 出品人:张云聪 ");
printf(" 学号:067108034 ");
printf(" 指导老师:邵艳玲 ");
printf(" ");
printf(" ");
printf(" 温馨提示,游戏时请把窗口最大化,以达到最佳效果 ");
printf("________________________________________________________________________________");
int temp=0,i=0;
do
{
if ((temp=getch())==224)
{
temp=getch();
if (temp==72&&i!=0)
{
gotoxy(34,3+i);
printf(" ");
i--;
gotoxy(34,3+i);
printf("$");
gotoxy(0,0);
}
else if(temp==80&&i!=3)
{
gotoxy(34,3+i);
printf(" ");
i++;
gotoxy(34,3+i);
printf("$");
gotoxy(0,0);
}
}
else if (temp==13) {*choice=i+1;return;}
else if (temp==27) {*choice=3;return;}
else if (temp==’1’||temp==’2’||temp==’3’||temp==’4’) {*choice=temp-48;return;}
}while(1);
}
int CannotDo(int v1,int v2,int MoveData,int choice) //第一个输入值为按键的用户号,第二个是本应该按键的用户号,第三个为按下键的对应值,第四个键代表游戏模式。
{
if (v1==3) return 0; //如果用户输入的为共用按键,则CannotDo为假
else if (v1==0) return 1;//如果用户输入错误,则CannotDo为真
else if (v1!=v2&&choice==2) return 1; //如果不该此用户输入,而用户进行了输入,则CannotDo为真
if (BeOut(MoveData)) return 1; //如果移动出边界则CannotDo为真
return 0;
}
int CannotLuozi() //判断是否可以落子。
{
if (ChessData)
return 1;
else return 0;
}
int luozi(int v) //玩家v落子。
{
ChessData+=v*2;
if (v==1) printf("O");
else if (v==2) printf("X");
else printf("luozi函数出错");
if (win(v)) {MoveToEnd();printf("玩家%d获得了胜利! \n",v);for (int i=1;i《=240;i++) printf(" ");GotoChess(GuangbiaoData);getch();return 1;}
MoveToEnd();
printf("现在请用户%d下棋 ",v%2+1);
GotoChess(GuangbiaoData);
return 0;
}
void HuiQi(int step) //输入的是当前的要悔的棋是第几步
{
GuangbiaoData;
GuangbiaoData;
ChessData=0;
GotoChess(GuangbiaoData);
printf("-");
MoveToEnd();
printf("现在请用户%d下棋 ",(step+1)%2+1);
GotoChess(GuangbiaoData);
}
int DataGetAndChoose(int choice)
{
int MoveData=0,i=0,temp; //MoveData 0表示不可移动,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。
while(1)
{
loop: while (temp=Get(&MoveData),CannotDo(temp,i%2+1,MoveData,choice));
switch (MoveData)
{
case 1:
case 2:
case 3:
case 4:Move(MoveData);break;
case 7:return 0;
case 6:
if (i==0) {MoveToEnd();printf("现在无法悔棋 ");GotoChess(GuangbiaoData);}
else HuiQi(i--);
break;
case 5:
if (CannotLuozi()) goto loop;
if(luozi(i%2+1)) return 0;
ChessStepData;
ChessStepData;
i++;
break;
default:printf("DataGetAndChoose函数出错");break;
}
}
return 1;
}
void ShowHelp()
{
system("cls");
printf("********************************************************************************");
printf("********************************************************************************");
printf("****** 单人游戏供用户一个人自己与自己下棋研究棋局之用 ******");
printf("****** 双人游戏中,用户1使用wsad控制方向,按空格落子 ******");
printf("****** 用户2按方向键控制方向,回车键落子 ******");
printf("****** 游戏过程中按esc返回主菜单 ******");
printf("****** 游戏过程中退格键悔棋 ******");
printf("****** 双人模式中某人下棋时,另一个用户无法控制光标与落子 ******");
printf("****** ******");
printf("****** 帮助 ******");
printf("****** 按任意键返回 ******");
printf("********************************************************************************");
printf("********************************************************************************");
getch();
}
int main()
{
int choice=0;
system("color 2b");
choose: UserChoose(&choice);
if (choice《1||choice》4) goto choose;
if (choice==3) {gotoxy(1,18);
printf("\n谢谢您的使用,再见 "); getch();return 0;}
if (choice==4) {ShowHelp(); goto choose;}
NewShow();
DataGetAndChoose(choice);
main();
return 0;
用C语言编写一个五子棋的游戏程序
**********************************************************/
/* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */
#include 《*****》
#include 《*****》
#include 《*****》
#include 《*****》
#include 《*****》
/**********************************************************/
/* 定义符号常量 */
/*定义画棋盘所需的制表符*/
#define CROSSRU 0xbf /*右上角点*/
#define CROSSLU 0xda /*左上角点*/
#define CROSSLD 0xc0 /*左下角点*/
#define CROSSRD 0xd9 /*右下角点*/
#define CROSSL 0xc3 /*左边*/
#define CROSSR 0xb4 /*右边*/
#define CROSSU 0xc2 /*上边*/
#define CROSSD 0xc1 /*下边*/
#define CROSS 0xc5 /*十字交叉点*/
/*定义棋盘左上角点在屏幕上的位置*/
#define MA**OFT 5
#define MAPYOFT 2
/*定义1号玩家的操作键键码*/
#define PLAY1UP 0x1157/*上移--’W’*/
#define PLAY1DOWN 0x1f53/*下移--’S’*/
#define PLAY1LEFT 0x1e41/*左移--’A’*/
#define PLAY1RIGHT 0x2044/*右移--’D’*/
#define PLAY1DO 0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#define PLAY2UP 0x4800/*上移--方向键up*/
#define PLAY2DOWN 0x5000/*下移--方向键down*/
#define PLAY2LEFT 0x4b00/*左移--方向键left*/
#define PLAY2RIGHT 0x4d00/*右移--方向键right*/
#define PLAY2DO 0x1c0d/*落子--回车键Enter*/
/*若想在游戏中途退出, 可按 Esc 键*/
#define ESCAPE 0x011b
/*定义棋盘上交叉点的状态, 即该点有无棋子 */
/*若有棋子, 还应能指出是哪个玩家的棋子 */
#define CHESSNULL 0 //没有棋子
#define CHESS1 ’O’//一号玩家的棋子
#define CHESS2 ’X’//二号玩家的棋子
/*定义按键类别*/
#define KEYEXIT 0/*退出键*/
#define KEYFALLCHESS 1/*落子键*/
#define KEYMOVECURSOR 2/*光标移动键*/
#define KEYINVALID 3/*无效键*/
/*定义符号常量: 真, 假 --- 真为1, 假为0 */
#define TRUE 1
#define FALSE 0
/**********************************************************/
/* 定义数据结构 */
/*棋盘交叉点坐标的数据结构*/
struct point
{
int x,y;
};
/**********************************************************/
/*自定义函数原型说明 */
void Init(void);
int GetKey(void);
int CheckKey(int press);
int ChangeOrder(void);
int ChessGo(int Order,struct point Cursor);
void DoError(void);
void DoOK(void);
void DoWin(int Order);
void MoveCursor(int Order,int press);
void DrawCross(int x,int y);
void DrawMap(void);
int JudgeWin(int Order,struct point Cursor);
int JudgeWinLine(int Order,struct point Cursor,int direction);
void ShowOrderMsg(int Order);
void EndGame(void);
/**********************************************************/
/**********************************************************/
/* 定义全局变量 */
int gPlayOrder; /*指示当前行棋方 */
struct point gCursor; /*光标在棋盘上的位置 */
char gChessBoard;/*用于记录棋盘上各点的状态*/
/**********************************************************/
/**********************************************************/
/*主函数*/
void main()
{
int press;
int bOutWhile=FALSE;/*退出循环标志*/
Init();/*初始化图象,数据*/
while(1)
{
press=GetKey();/*获取用户的按键值*/
switch(CheckKey(press))/*判断按键类别*/
{
/*是退出键*/
case KEYEXIT:
clrscr();/*清屏*/
bOutWhile = TRUE;
break;
/*是落子键*/
case KEYFALLCHESS:
if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/
DoError();/*落子错误*/
else
{
DoOK();/*落子正确*/
/*如果当前行棋方赢棋*/
if(JudgeWin(gPlayOrder,gCursor)==TRUE)
{
DoWin(gPlayOrder);
bOutWhile = TRUE;/*退出循环标志置为真*/
}
/*否则*/
else
/*交换行棋方*/
ChangeOrder();
}
break;
/*是光标移动键*/
case KEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
break;
/*是无效键*/
case KEYINVALID:
break;
}
if(bOutWhile==TRUE)
break;
}
/*游戏结束*/
EndGame();
}
/**********************************************************/
/*界面初始化,数据初始化*/
void Init(void)
{
int i,j;
char *Msg=
{
"Player1 key:",
" UP----w",
" DOWN--s",
" LEFT--a",
" RIGHT-d",
" DO----space",
"",
"Player2 key:",
" UP----up",
" DOWN--down",
" LEFT--left",
" RIGHT-right",
" DO----ENTER",
"",
"exit game:",
" ESC",
NULL,
};
/*先手方为1号玩家*/
gPlayOrder = CHESS1;
/*棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/
for(i=0;i《19;i++)
for(j=0;j《19;j++)
gChessBoard=CHESSNULL;
/*光标初始位置*/
*****=*****=0;
/*画棋盘*/
textmode(**0);
DrawMap();
/*显示操作键说明*/
i=0;
textcolor(BROWN);
while(Msg!=NULL)
{
gotoxy(25,3+i);
cputs(Msg);
i++;
}
/*显示当前行棋方*/
ShowOrderMsg(gPlayOrder);
/*光标移至棋盘的左上角点处*/
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*画棋盘*/
void DrawMap(void)
{
int i,j;
clrscr();
for(i=0;i《19;i++)
for(j=0;j《19;j++)
DrawCross(i,j);
}
/*画棋盘上的交叉点*/
void DrawCross(int x,int y)
{
gotoxy(x+MA**OFT,y+MAPYOFT);
/*交叉点上是一号玩家的棋子*/
if(gChessBoard==CHESS1)
{
textcolor(LIGHTBLUE);
putch(CHESS1);
return;
}
/*交叉点上是二号玩家的棋子*/
if(gChessBoard==CHESS2)
{
textcolor(LIGHTBLUE);
putch(CHESS2);
return;
}
textcolor(GREEN);
/*左上角交叉点*/
if(x==0&&y==0)
{
putch(CROSSLU);
return;
}
/*左下角交叉点*/
if(x==0&&y==18)
{
putch(CROSSLD);
return;
}
/*右上角交叉点*/
if(x==18&&y==0)
{
putch(CROSSRU);
return;
}
/*右下角交叉点*/
if(x==18&&y==18)
{
putch(CROSSRD);
return;
}
/*左边界交叉点*/
if(x==0)
{
putch(CROSSL);
return;
}
/*右边界交叉点*/
if(x==18)
{
putch(CROSSR);
return;
}
/*上边界交叉点*/
if(y==0)
{
putch(CROSSU);
return;
}
/*下边界交叉点*/
if(y==18)
{
putch(CROSSD);
return;
}
/*棋盘中间的交叉点*/
putch(CROSS);
}
/*交换行棋方*/
int ChangeOrder(void)
{
if(gPlayOrder==CHESS1)
gPlayOrder=CHESS2;
else
gPlayOrder=CHESS1;
return(gPlayOrder);
}
/*获取按键值*/
int GetKey(void)
{
char lowbyte;
int press;
while (bioskey(1) == 0)
;/*如果用户没有按键,空循环*/
press=bioskey(0);
lowbyte=press&0xff;
press=press&0xff00 + toupper(lowbyte);
return(press);
}
/*落子错误处理*/
void DoError(void)
{
sound(1200);
delay(50);
nosound();
}
/*赢棋处理*/
void DoWin(int Order)
{
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
nosound();
textcolor(RED+BLINK);
gotoxy(25,20);
if(Order==CHESS1)
cputs("PLAYER1 WIN!");
else
cputs("PLAYER2 WIN!");
gotoxy(25,21);
cputs(" \\《^+^》/");
getch();
}
/*走棋*/
int ChessGo(int Order,struct point Cursor)
{
/*判断交叉点上有无棋子*/
if(gChessBoard==CHESSNULL)
{
/*若没有棋子, 则可以落子*/
gotoxy(*****+MA**OFT,*****+MAPYOFT);
textcolor(LIGHTBLUE);
putch(Order);
gotoxy(*****+MA**OFT,*****+MAPYOFT);
gChessBoard=Order;
return TRUE;
}
else
return FALSE;
}
/*判断当前行棋方落子后是否赢棋*/
int JudgeWin(int Order,struct point Cursor)
{
int i;
for(i=0;i《4;i++)
/*判断在指定方向上是否有连续5个行棋方的棋子*/
if(JudgeWinLine(Order,Cursor,i))
return TRUE;
return FALSE;
}
/*判断在指定方向上是否有连续5个行棋方的棋子*/
int JudgeWinLine(int Order,struct point Cursor,int direction)
{
int i;
struct point pos,dpos;
c***t int testnum = 5;
int count;
switch(direction)
{
case 0:/*在水平方向*/
*****=Cursor.x-(testnum-1);
*****=*****;
*****=1;
*****=0;
break;
case 1:/*在垂直方向*/
*****=*****;
*****=Cursor.y-(testnum-1);
*****=0;
*****=1;
break;
case 2:/*在左下至右上的斜方向*/
*****=Cursor.x-(testnum-1);
*****=*****+(testnum-1);
*****=1;
*****=-1;
break;
case 3:/*在左上至右下的斜方向*/
*****=Cursor.x-(testnum-1);
*****=Cursor.y-(testnum-1);
*****=1;
*****=1;
break;
}
count=0;
for(i=0;i《testnum*2+1;i++)
{
if(*****》=0&&*****《=18&&*****》=0&&*****《=18)
{
if(gChessBoard==Order)
{
count++;
if(count》=testnum)
return TRUE;
}
else
count=0;
}
*****+=*****;
*****+=*****;
}
return FALSE;
}
/*移动光标*/
void MoveCursor(int Order,int press)
{
switch(press)
{
case PLAY1UP:
if(Order==CHESS1&&*****》0)
gCursor.y--;
break;
case PLAY1DOWN:
if(Order==CHESS1&&*****《18)
*****++;
break;
case PLAY1LEFT:
if(Order==CHESS1&&*****》0)
gCursor.x--;
break;
case PLAY1RIGHT:
if(Order==CHESS1&&*****《18)
*****++;
break;
case PLAY2UP:
if(Order==CHESS2&&*****》0)
gCursor.y--;
break;
case PLAY2DOWN:
if(Order==CHESS2&&*****《18)
*****++;
break;
case PLAY2LEFT:
if(Order==CHESS2&&*****》0)
gCursor.x--;
break;
case PLAY2RIGHT:
if(Order==CHESS2&&*****《18)
*****++;
break;
}
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*游戏结束处理*/
void EndGame(void)
{
textmode(C80);
}
/*显示当前行棋方*/
void ShowOrderMsg(int Order)
{
gotoxy(6,MAPYOFT+20);
textcolor(LIGHTRED);
if(Order==CHESS1)
cputs("Player1 go!");
else
cputs("Player2 go!");
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*落子正确处理*/
void DoOK(void)
{
sound(500);
delay(70);
sound(600);
delay(50);
sound(1000);
delay(100);
nosound();
}
/*检查用户的按键类别*/
int CheckKey(int press)
{
if(press==ESCAPE)
return KEYEXIT;/*是退出键*/
else
if
( ( press==PLAY1DO && gPlayOrder==CHESS1) ||
( press==PLAY2DO && gPlayOrder==CHESS2)
)
return KEYFALLCHESS;/*是落子键*/
else
if
( press==PLAY1UP || press==PLAY1DOWN ||
press==PLAY1LEFT || press==PLAY1RIGHT ||
press==PLAY2UP || press==PLAY2DOWN ||
press==PLAY2LEFT || press==PLAY2RIGHT
)
return KEYMOVECURSOR;/*是光标移动键*/
else
return KEYINVALID;/*按键无效*/
}
C语言五子棋
我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围8个方向检查是否存在5子的情况,只需要一个判断方法,而且较为简单。
void chooseONE()
{
printf("第一玩家请选择下棋位置\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
while(arr==2)
{
printf("重复了!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
arr=1;
//这里加判断代码,建议用一个判断函数,我给你写个吧
}
//我这里这个方法写了个大概,你看一下和你的代码结合一下就可以了,我用i和j作为for循环的变量,你用来做最大的长宽值,这些你都要改一下。
flag作为判断是否胜利的标志,playerNum是玩家的标志,分1和2,这个函数只写了左和左上的判断,其他方向楼主仿照着写
int win(int row, int col, int playerNum){
int i = 0,j = 0;
int flag = 1;
if(row - 4 》= 0){
flag = 1;
for(i = row; i 》= 0; i--){
if(arr != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
if(row - 4 》= 0 && col - 4 》= 0){
flag = 1;
for(i = row ,j = col ; i 》= 0&&j》=0; i--,j--){
if(arr != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
}
c语言五子棋代码,
package *****;
import *****;
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;
//把二维数组都填充‘*’
for(char ary: board){
*****(ary, BLANK);
}
}
public char getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = ’*’;
//*****( x +"," + y + ":" + board + "," + BLANK);
if(board == BLANK){// x, y 位置上必须是空的才可以添棋子
board = BLACK;
return;
}
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board == BLANK){// x, y 位置上必须是空的才可以添棋子
board = 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!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top = y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
y = top;
while(true){
if(y==MAX || board!=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!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top = x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = top;
while(true){
if(x==MAX || board!=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!=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!=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!=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!=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);
}
}
急求用C语言编写的五子棋代码
***隐藏网址***
以前有人问过的 tc 可以用
/*
五子棋
*/
#include《*****》
#include《*****》
#include《*****》
#include《*****》
#include《*****》
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define SPACE 0x3920
#define BILI 20
#define JZ 4
#define JS 3
#define N 19
int box;
int step_x,step_y ;
int key ;
int flag=1 ;
void draw_box();
void draw_cicle(int x,int y,int color);
void change();
void judgewho(int x,int y);
void judgekey();
int judgeresult(int x,int y);
void attentoin();
void attention()
{
char ch ;
window(1,1,80,25);
textbackground(LIGHTBLUE);
textcolor(YELLOW);
clrscr();
gotoxy(15,2);
printf("游戏操作规则:");
gotoxy(15,4);
printf("Play Rules:");
gotoxy(15,6);
printf("1、按左右上下方向键移动棋子");
gotoxy(15,8);
printf("1. Press Left,Right,Up,Down Key to move Piece");
gotoxy(15,10);
printf("2、按空格确定落棋子");
gotoxy(15,12);
printf("2. Press Space to place the Piece");
gotoxy(15,14);
printf("3、禁止在棋盘外按空格");
gotoxy(15,16);
printf("3. DO NOT press Space outside of the ches**oard");
gotoxy(15,18);
printf("你是否接受上述的游戏规则(Y/N)");
gotoxy(15,20);
printf("Do you accept the above Playing Rules? :");
while(1)
{
gotoxy(60,20);
ch=getche();
if(ch==’Y’||ch==’y’)
break ;
else if(ch==’N’||ch==’n’)
{
window(1,1,80,25);
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr();
exit(0);
}
gotoxy(51,12);
printf(" ");
}
}
void draw_box()
{
int x1,x2,y1,y2 ;
setbkcolor(LIGHTBLUE);
setcolor(YELLOW);
gotoxy(7,2);
printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.");
for(x1=1,y1=1,y2=18;x1《=18;x1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);
for(x1=1,y1=1,x2=18;y1《=18;y1++)
line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI);
for(x1=1;x1《=18;x1++)
for(y1=1;y1《=18;y1++)
box=0 ;
}
void draw_circle(int x,int y,int color)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(x+JZ)*BILI ;
y=(y+JS)*BILI ;
circle(x,y,8);
}
void judgekey()
{
int i ;
int j ;
switch(key)
{
case LEFT :
if(step_x-1《0)
break ;
else
{
for(i=step_x-1,j=step_y;i》=1;i--)
if(box==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(i《1)break ;
step_x=i ;
judgewho(step_x,step_y);
break ;
}
case RIGHT :
if(step_x+1》18)
break ;
else
{
for(i=step_x+1,j=step_y;i《=18;i++)
if(box==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(i》18)break ;
step_x=i ;
judgewho(step_x,step_y);
break ;
}
case DOWN :
if((step_y+1)》18)
break ;
else
{
for(i=step_x,j=step_y+1;j《=18;j++)
if(box==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(j》18)break ;
step_y=j ;
judgewho(step_x,step_y);
break ;
}
case UP :
if((step_y-1)《0)
break ;
else
{
for(i=step_x,j=step_y-1;j》=1;j--)
if(box==0)
{
draw_circle(step_x,step_y,LIGHTBLUE);
break ;
}
if(j《1)break ;
step_y=j ;
judgewho(step_x,step_y);
break ;
}
case ESC :
break ;
case SPACE :
if(step_x》=1&&step_x《=18&&step_y》=1&&step_y《=18)
{
if(box==0)
{
box=flag ;
if(judgeresult(step_x,step_y)==1)
{
sound(1000);
delay(1000);
nosound();
gotoxy(30,4);
if(flag==1)
{
setbkcolor(BLUE);
cleardevice();
setviewport(100,100,540,380,1);
/*定义一个图形窗口*/
setfillstyle(1,2);
/*绿色以实填充*/
setcolor(YELLOW);
rectangle(0,0,439,279);
floodfill(50,50,14);
setcolor(12);
settextstyle(1,0,5);
/*三重笔划字体, 水平放?5倍*/
outtextxy(20,20,"The White Win !");
setcolor(15);
settextstyle(3,0,5);
/*无衬笔划字体, 水平放大5倍*/
outtextxy(120,120,"The White Win !");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
if(flag==2)
{
setbkcolor(BLUE);
cleardevice();
setviewport(100,100,540,380,1);
/*定义一个图形窗口*/
setfillstyle(1,2);
/*绿色以实填充*/
setcolor(YELLOW);
rectangle(0,0,439,279);
floodfill(50,50,14);
setcolor(12);
settextstyle(1,0,8);
/*三重笔划字体, 水平放大8倍*/
outtextxy(20,20,"The Red Win !");
setcolor(15);
settextstyle(3,0,5);
/*无衬笔划字体, 水平放大5倍*/
outtextxy(120,120,"The Red Win !");
setcolor(14);
settextstyle(2,0,8);
getch();
closegraph();
exit(0);
}
}
change();
break ;
}
}
else
break ;
}
}
void change()
{
if(flag==1)
flag=2 ;
else
flag=1 ;
}
void judgewho(int x,int y)
{
if(flag==1)
draw_circle(x,y,15);
if(flag==2)
draw_circle(x,y,4);
}
int judgeresult(int x,int y)
{
int j,k,n1,n2 ;
while(1)
{
n1=0 ;
n2=0 ;
/*水平向左数*/
for(j=x,k=y;j》=1;j--)
{
if(box==flag)
n1++;
else
break ;
}
/*水平向右数*/
for(j=x,k=y;j《=18;j++)
{
if(box==flag)
n2++;
else
break ;
}
if(n1+n2-1》=5)
{
return(1);
break ;
}
/*垂直向上数*/
n1=0 ;
n2=0 ;
for(j=x,k=y;k》=1;k--)
{
if(box==flag)
n1++;
else
break ;
}
/*垂直向下数*/
for(j=x,k=y;k《=18;k++)
{
if(box==flag)
n2++;
else
break ;
}
if(n1+n2-1》=5)
{
return(1);
break ;
}
/*向左上方数*/
n1=0 ;
n2=0 ;
for(j=x,k=y;j》=1,k》=1;j--,k--)
{
if(box==flag)
n1++;
else
break ;
}
/*向右下方数*/
for(j=x,k=y;j《=18,k《=18;j++,k++)
{
if(box==flag)
n2++;
else
break ;
}
if(n1+n2-1》=5)
{
return(1);
break ;
}
/*向右上方数*/
n1=0 ;
n2=0 ;
for(j=x,k=y;j《=18,k》=1;j++,k--)
{
if(box==flag)
n1++;
else
break ;
}
/*向左下方数*/
for(j=x,k=y;j》=1,k《=18;j--,k++)
{
if(box==flag)
n2++;
else
break ;
}
if(n1+n2-1》=5)
{
return(1);
break ;
}
return(0);
break ;
}
}
void main()
{
int gdriver=VGA,gmode=VGAHI;
clrscr();
attention();
initgraph(&gdriver,&gmode,"c:\\tc");
/* setwritemode(XOR_PUT);*/
flag=1 ;
draw_box();
do
{
step_x=0 ;
step_y=0 ;
/*draw_circle(step_x,step_y,8); */
judgewho(step_x-1,step_y-1);
do
{
while(bioskey(1)==0);
key=bioskey(0);
judgekey();
}
while(key!=SPACE&&key!=ESC);
}
while(key!=ESC);
closegraph();
}
用c编写的五子棋代码,请高手点评
说实话,你写的C++比较不规范,下面是我改的,你可以看看。。。
#include《iostream》
#include《*****》
using namespace std;
c***t int N=15;
c***t int M=15; //c++中有常变量代替c中的宏定义,宏定义不错语法检查
//int main(); main函数是入口函数,不必提前声明,删掉
//貌似你后面调用了main函数,这不规范,看看我改的吧
void init(char flag)
{
for(int i=1;i《N;i++) //数组都是从0开始的,最好改成for(int i=0;i《N;i++)
{for(int j=1;j《M;j++) //你这样写有点浪费内存空间,虽说语法没错。。
{ flag=’_’;
cout《《flag;
cout《《"|";
}
cout《《endl;
}
}
void draw(char flag)
{for(int i=1;i《N;i++) //这两处与上面一样
{for(int j=1;j《M;j++) //
{cout《《flag;
cout《《’|’;}
cout《《endl;
}
}
void ciin(char flag,char t,char v)
{
cout《《"请"《《t《《"走,";
int i,j;
cout《《"请输入两个小于"《《N《《"的数字:"《《endl;
cin》》i;
cin》》j;
while(i》=N||i《1||j》=M||j《1||flag==’0’)
{if(i》=N||i《1||j》=M||j《1)
{cout《《"输入错误,请重新输入.";
cout《《"请输入两个小于"《《N《《"的数字:"《《endl;//还要提示不小于1
cin》》i;
cin》》j;
}
else
{cout《《"此处有棋子,请重新输入.";
cout《《"请输入两个小于"《《N《《"的数字:"《《endl;
cin》》i;
cin》》j;
}
}
flag=v;
draw(flag); //这句可以删去了,没有意义
system("clear");
draw(flag);
cout《《endl;
}
int test(char flag,char t) //若是想再来一局返回1,否则返回0
{int i,j;
for(i=1;i《N;i++)
{for(j=1;j《M;j++)
if((flag==’#’)||
(flag==’0’)||
(flag==’#’)||
(flag==’0’)||
(flag==’#’)||
(flag==’0’)||
(flag==’#’)||
(flag==’0’))
{cout《《t《《"胜,你服不?还想被虐不?Y/N:"《《endl;
char c;
cin》》c;
if(c==’y’||c==’Y’)
//main(); //调用main函数,我没试过。。。你可以改变一下main函
return 1; //中的语句来实现,还是删掉吧
else
return 0;}
}
}
int main1() //将main函数改成main1,让main1封装所有功能。
{
char flag;
init(flag);
cout《《endl;
for(int i=0;i《(N-1)*(M-1);i++)
{
ciin(flag,’A’,’#’);
if(test(flag,’A’)==1)
{return 1;} //这是还想再来一局的意思
ciin(flag,’B’,’0’);
if(test(flag,’B’)==1)
{return 1;}
}
return 0;
}
void main()
{
while(1)
{
if(main1()==0)
break; //如果不想继续,则退出循环结束程序
else
continue; //如果想继续,则重新循环。
}
}
最后再说几句,C++的经典之处在与封装,他更倾向于面向对象程序设计,而你的思维还局限在C语言中,没有领悟到C++的经典之处,有待揣摩,其实,你可以做成一个class类,将所有的东西封装在里面,然后创建一个类对象就好了。这样做才是真正的C++
鉴定完毕
求助 五子棋用c语言怎么编
#include 《*****》
#include 《*****》
#include 《*****》
#include 《*****》
#include 《*****》
#define CROSSRU 0xbf /*右上角点*/
#define CROSSLU 0xda /*左上角点*/
#define CROSSLD 0xc0 /*左下角点*/
#define CROSSRD 0xd9 /*右下角点*/
#define CROSSL 0xc3 /*左边*/
#define CROSSR 0xb4 /*右边*/
#define CROSSU 0xc2 /*上边*/
#define CROSSD 0xc1 /*下边*/
#define CROSS 0xc5 /*十字交叉点*/
/*定义棋盘左上角点在屏幕上的位置*/
#define MA**OFT 5
#define MAPYOFT 2
/*定义1号玩家的操作键键码*/
#define PLAY1UP 0x1157/*上移--’W’*/
#define PLAY1DOWN 0x1f53/*下移--’S’*/
#define PLAY1LEFT 0x1e41/*左移--’A’*/
#define PLAY1RIGHT 0x2044/*右移--’D’*/
#define PLAY1DO 0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#define PLAY2UP 0x4800/*上移--方向键up*/
#define PLAY2DOWN 0x5000/*下移--方向键down*/
#define PLAY2LEFT 0x4b00/*左移--方向键left*/
#define PLAY2RIGHT 0x4d00/*右移--方向键right*/
#define PLAY2DO 0x1c0d/*落子--回车键Enter*/
/*若想在游戏中途退出, 可按 Esc 键*/
#define ESCAPE 0x011b
/*定义棋盘上交叉点的状态, 即该点有无棋子 */
/*若有棋子, 还应能指出是哪个玩家的棋子 */
#define CHESSNULL 0 /*没有棋子*/
#define CHESS1 ’O’/*一号玩家的棋子*/
#define CHESS2 ’X’/*二号玩家的棋子*/
/*定义按键类别*/
#define KEYEXIT 0/*退出键*/
#define KEYFALLCHESS 1/*落子键*/
#define KEYMOVECURSOR 2/*光标移动键*/
#define KEYINVALID 3/*无效键*/
/*定义符号常量: 真, 假 --- 真为1, 假为0 */
#define TRUE 1
#define FALSE 0
/**********************************************************/
/* 定义数据结构 */
/*棋盘交叉点坐标的数据结构*/
struct point
{
int x,y;
};
/**********************************************************/
/*自定义函数原型说明 */
void Init(void);
int GetKey(void);
int CheckKey(int press);
int ChangeOrder(void);
int ChessGo(int Order,struct point Cursor);
void DoError(void);
void DoOK(void);
void DoWin(int Order);
void MoveCursor(int Order,int press);
void DrawCross(int x,int y);
void DrawMap(void);
int JudgeWin(int Order,struct point Cursor);
int JudgeWinLine(int Order,struct point Cursor,int direction);
void ShowOrderMsg(int Order);
void EndGame(void);
/**********************************************************/
/**********************************************************/
/* 定义全局变量 */
int gPlayOrder; /*指示当前行棋方 */
struct point gCursor; /*光标在棋盘上的位置 */
char gChessBoard;/*用于记录棋盘上各点的状态*/
/**********************************************************/
/**********************************************************/
/*主函数*/
void main()
{
int press;
int bOutWhile=FALSE;/*退出循环标志*/
Init();/*初始化图象,数据*/
while(1)
{
press=GetKey();/*获取用户的按键值*/
switch(CheckKey(press))/*判断按键类别*/
{
/*是退出键*/
case KEYEXIT:
clrscr();/*清屏*/
bOutWhile = TRUE;
break;
/*是落子键*/
case KEYFALLCHESS:
if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/
DoError();/*落子错误*/
else
{
DoOK();/*落子正确*/
/*如果当前行棋方赢棋*/
if(JudgeWin(gPlayOrder,gCursor)==TRUE)
{
DoWin(gPlayOrder);
bOutWhile = TRUE;/*退出循环标志置为真*/
}
/*否则*/
else
/*交换行棋方*/
ChangeOrder();
ShowOrderMsg(gPlayOrder);
}
break;
/*是光标移动键*/
case KEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
break;
/*是无效键*/
case KEYINVALID:
break;
}
if(bOutWhile==TRUE)
break;
}
/*游戏结束*/
EndGame();
}
/**********************************************************/
/*界面初始化,数据初始化*/
void Init(void)
{
int i,j;
char *Msg=
{
"Player1 key:",
" UP----w",
" DOWN--s",
" LEFT--a",
" RIGHT-d",
" DO----space",
"",
"Player2 key:",
" UP----up",
" DOWN--down",
" LEFT--left",
" RIGHT-right",
" DO----ENTER",
"",
"exit game:",
" ESC",
NULL,
};
/* 先手方为1号玩家 */
gPlayOrder = CHESS1;
/* 棋盘数据清零, 即棋盘上各点开始的时候都没有棋子 */
for(i=0;i《19;i++)
for(j=0;j《19;j++)
gChessBoard=CHESSNULL;
/*光标初始位置*/
*****=*****=0;
/*画棋盘*/
textmode(**0);
DrawMap();
/*显示操作键说明*/
i=0;
textcolor(BROWN);
while(Msg!=NULL)
{
gotoxy(25,3+i);
cputs(Msg);
i++;
}
/*显示当前行棋方*/
ShowOrderMsg(gPlayOrder);
/*光标移至棋盘的左上角点处*/
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*画棋盘*/
void DrawMap(void)
{
int i,j;
clrscr();
for(i=0;i《19;i++)
for(j=0;j《19;j++)
DrawCross(i,j);
}
/*画棋盘上的交叉点*/
void DrawCross(int x,int y)
{
gotoxy(x+MA**OFT,y+MAPYOFT);
/*交叉点上是一号玩家的棋子*/
if(gChessBoard==CHESS1)
{
textcolor(LIGHTBLUE);
putch(CHESS1);
return;
}
/*交叉点上是二号玩家的棋子*/
if(gChessBoard==CHESS2)
{
textcolor(LIGHTBLUE);
putch(CHESS2);
return;
}
textcolor(GREEN);
/*左上角交叉点*/
if(x==0&&y==0)
{
putch(CROSSLU);
return;
}
/*左下角交叉点*/
if(x==0&&y==18)
{
putch(CROSSLD);
return;
}
/*右上角交叉点*/
if(x==18&&y==0)
{
putch(CROSSRU);
return;
}
/*右下角交叉点*/
if(x==18&&y==18)
{
putch(CROSSRD);
return;
}
/*左边界交叉点*/
if(x==0)
{
putch(CROSSL);
return;
}
/*右边界交叉点*/
if(x==18)
{
putch(CROSSR);
return;
}
/*上边界交叉点*/
if(y==0)
{
putch(CROSSU);
return;
}
/*下边界交叉点*/
if(y==18)
{
putch(CROSSD);
return;
}
/*棋盘中间的交叉点*/
putch(CROSS);
}
/*交换行棋方*/
int ChangeOrder(void)
{
if(gPlayOrder==CHESS1)
gPlayOrder=CHESS2;
else
gPlayOrder=CHESS1;
return(gPlayOrder);
}
/*获取按键值*/
int GetKey(void)
{
char lowbyte;
int press;
while (bioskey(1) == 0)
;/*如果用户没有按键,空循环*/
press=bioskey(0);
lowbyte=press&0xff;
press=press&0xff00 + toupper(lowbyte);
return(press);
}
/*落子错误处理*/
void DoError(void)
{
sound(1200);
delay(50);
nosound();
}
/*赢棋处理*/
void DoWin(int Order)
{
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
sound(1500);delay(100);
sound(0); delay(50);
sound(800); delay(100);
sound(0); delay(50);
nosound();
textcolor(RED+BLINK);
gotoxy(25,20);
if(Order==CHESS1)
cputs("PLAYER1 WIN!");
else
cputs("PLAYER2 WIN!");
gotoxy(25,21);
cputs("\n");
getch();
}
/*走棋*/
int ChessGo(int Order,struct point Cursor)
{
/*判断交叉点上有无棋子*/
if(gChessBoard==CHESSNULL)
{
/*若没有棋子, 则可以落子*/
gotoxy(*****+MA**OFT,*****+MAPYOFT);
textcolor(LIGHTBLUE);
putch(Order);
gotoxy(*****+MA**OFT,*****+MAPYOFT);
gChessBoard=Order;
return TRUE;
}
else
return FALSE;
}
/*判断当前行棋方落子后是否赢棋*/
int JudgeWin(int Order,struct point Cursor)
{
int i;
for(i=0;i《4;i++)
/*判断在指定方向上是否有连续5个行棋方的棋子*/
if(JudgeWinLine(Order,Cursor,i))
return TRUE;
return FALSE;
}
/*判断在指定方向上是否有连续5个行棋方的棋子*/
int JudgeWinLine(int Order,struct point Cursor,int direction)
{
int i;
struct point pos,dpos;
c***t int testnum = 5;
int count;
switch(direction)
{
case 0:/*在水平方向*/
*****=Cursor.x-(testnum-1);
*****=*****;
*****=1;
*****=0;
break;
case 1:/*在垂直方向*/
*****=*****;
*****=Cursor.y-(testnum-1);
*****=0;
*****=1;
break;
case 2:/*在左下至右上的斜方向*/
*****=Cursor.x-(testnum-1);
*****=*****+(testnum-1);
*****=1;
*****=-1;
break;
case 3:/*在左上至右下的斜方向*/
*****=Cursor.x-(testnum-1);
*****=Cursor.y-(testnum-1);
*****=1;
*****=1;
break;
}
count=0;
for(i=0;i《testnum*2+1;i++)/*????????i《testnum*2-1*/
{
if(*****》=0&&*****《=18&&*****》=0&&*****《=18)
{
if(gChessBoard==Order)
{
count++;
if(count》=testnum)
return TRUE;
}
else
count=0;
}
*****+=*****;
*****+=*****;
}
return FALSE;
}
/*移动光标*/
void MoveCursor(int Order,int press)
{
switch(press)
{
case PLAY1UP:
if(Order==CHESS1&&*****》0)
gCursor.y--;
break;
case PLAY1DOWN:
if(Order==CHESS1&&*****《18)
*****++;
break;
case PLAY1LEFT:
if(Order==CHESS1&&*****》0)
gCursor.x--;
break;
case PLAY1RIGHT:
if(Order==CHESS1&&*****《18)
*****++;
break;
case PLAY2UP:
if(Order==CHESS2&&*****》0)
gCursor.y--;
break;
case PLAY2DOWN:
if(Order==CHESS2&&*****《18)
*****++;
break;
case PLAY2LEFT:
if(Order==CHESS2&&*****》0)
gCursor.x--;
break;
case PLAY2RIGHT:
if(Order==CHESS2&&*****《18)
*****++;
break;
}
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*游戏结束处理*/
void EndGame(void)
{
textmode(C80);
}
/*显示当前行棋方*/
void ShowOrderMsg(int Order)
{
gotoxy(6,MAPYOFT+20);
textcolor(LIGHTRED);
if(Order==CHESS1)
cputs("Player1 go!");
else
cputs("Player2 go!");
gotoxy(*****+MA**OFT,*****+MAPYOFT);
}
/*落子正确处理*/
void DoOK(void)
{
sound(500);
delay(70);
sound(600);
delay(50);
sound(1000);
delay(100);
nosound();
}
/*检查用户的按键类别*/
int CheckKey(int press)
{
if(press==ESCAPE)
return KEYEXIT;/*是退出键*/
else
if
( ( press==PLAY1DO && gPlayOrder==CHESS1) ||
( press==PLAY2DO && gPlayOrder==CHESS2)
)
return KEYFALLCHESS;/*是落子键*/
else
if
( press==PLAY1UP || press==PLAY1DOWN ||
press==PLAY1LEFT || press==PLAY1RIGHT ||
press==PLAY2UP || press==PLAY2DOWN ||
press==PLAY2LEFT || press==PLAY2RIGHT
)
return KEYMOVECURSOR;/*是光标移动键*/
else
return KEYINVALID;/*按键无效*/
}
编写一道五子棋的C语言程序,如何写一个鼠标点击的函数,麻烦哪位高手帮我写一个简单易懂的
#include "*****"
#include 《*****》
#include 《*****》
#include 《*****》
int main(int argc, char* argv)
{
SetC***oleTitle("1111111111");
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
INPUT_RECORD inRec;
DWORD res;
while (1)
{
ReadC***oleInput(hInput, &inRec, 1, &res);
if (***** == MOUSE_EVENT && ***** == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
{
SetC***oleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),*****);
printf("Hello World!");
}
Sleep(100);
}
return 0;
}
帮忙编程序,C语言,简化的五子棋
图呢??????????
#include 《*****》
#include 《*****》
#include 《*****》
c***t int LOSE=1,WIN=2,UNFINISHED=3,DRAW=4;//用于表达下棋4种结果
int ches**oard;//棋盘
void outboad();
void psset();
void cpset();
int cprand();
void outboard()//输出当前棋盘
{
printf("当前棋盘如下:\n");
for(int i=0;i《3;i++)
{
for(int j=0;j《3;j++)
{
if(ches**oard==-1)
printf(" O |");
else if(ches**oard==1)
printf(" X |");
else
printf(" |");
}
printf("\n——————\n");
}
}
void psset()//用户落子
{
int row,col;
printf("请输入落子坐标(1,1)~(3,3),如2,1:\n");
scanf("%d,%d",&row,&col);
while(ches**oard!=0||row》3||col》3||row《1||col《1)//对输入坐标进行检测,是否输入新坐标
{
printf("输入的坐标有误,请重新输入:");
scanf("%d,%d",&row,&col);
}
ches**oard=1;
}
void cpset()//电脑落子
{
int row,col;
row=cprand();
col=cprand();
while(ches**oard!=0)//对随机产生的坐标进行检测,是否产生新坐标
{
if(ches**oard!=0)
row=cprand();
else col=cprand();
}
ches**oard=-1;
}
int cprand()//电脑随机产生落子坐标,刷新时间为1秒
{
srand((unsigned)time(NULL));
return rand()%3;
}
int result()//下棋结果判断,4总结果,输、赢、和、未完
{
int sum=0;
for(int i=0;i《3;i++)
{
int j;
for(j=0,sum=0;j《3;j++)
{
sum+=ches**oard;
}
if(sum==3||sum==-3)
break;
for(j=0,sum=0;j《3;j++)
{
sum+=ches**oard;
}
if(sum==3||sum==-3)
break;
sum=0;
sum+=ches**oard;
if(sum==3||sum==-3)
break;
sum=0;
sum+=ches**oard;
if(sum==3||sum==-3)
break;
}
if(sum==-3)
return LOSE;
else if(sum==3)
return WIN;
else
{
int point=0;
for(int i=0;i《3;i++)
for(int j=0;j《3;j++)
if(ches**oard!=0)
point+=1;
if(point==9)
return DRAW;
else return UNFINISHED;
}
}
int main()
{
for(int row=0;row《3;row++)
for(int col=0;col《3;col++)
ches**oard=0;
int over=UNFINISHED;
while(over==UNFINISHED)
{
system("CLS");
outboard();
over=result();
if(over==UNFINISHED)
{
psset();
system("CLS");
outboard();
}
else if(over==WIN)
{
printf("\nYOU WIN!");
break;
}
else if(over==LOSE)
{
printf("\nYOU LOSE!");
break;
}
else{
printf("\nNO WIN,NO LOSE!");
break;
}
over=result();
if(over==UNFINISHED)
{
cpset();
system("CLS");
outboard();
}
else if(over==WIN)
{
printf("\nYOU WIN!");
break;
}
else if(over==LOSE)
{
printf("\nYOU LOSE!");
break;
}
else{
printf("\nNO WIN,NO LOSE!");
break;
}
}
}//说一下,代码我只试运行了3种结果,和、赢、输,没有异常。没有试运行所有落子方案,若发现落子方案运行出错请联系。
更多文章:
teradata 端口(有关Mac Address already in use 端口占用问题)
2026年4月24日 08:40
多地出台房价限跌令(多个城市出台房价限跌令,限跌令主要为的是什么)
2026年4月24日 08:00
excel公式evaluate设置(excel表格EVALUATE的用法,急)
2026年4月24日 07:20
自主开发编程语言(我想自己开发软件赚钱,也可以看做是接私活,那么学哪种编程语言合适呢自己一个人开发)
2026年4月24日 07:00
php函数参数传递方式三种(php中构造函数的参数是接口类型,在实例化一个对象时这个参数怎么传)
2026年4月24日 06:40
五子棋c语言最简单代码(C语言编五子棋(二维数组),很简单)
2026年4月24日 05:40






