| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1317 人关注过本帖
标题:[求助]救命啊!!!请各位大哥务必要帮帮我,怎样用C语言来编一个围棋游戏。 ...
只看楼主 加入收藏
04l蓝色双鱼座
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2004-12-29
收藏
 问题点数:0 回复次数:5 
[求助]救命啊!!!请各位大哥务必要帮帮我,怎样用C语言来编一个围棋游戏。
       救命啊!!!请各位大哥务必要帮帮我,怎样用C语言来编一个围棋游戏。棋盘是8X8的棋盘,只要能玩围棋就行啦!!!我知道很多高手平时多深藏不露,BUT这次小弟“恋情”告急,请大家顶力相助!!!
搜索更多相关主题的帖子: C语言 围棋 游戏 救命 
2004-12-29 01:41
断线风筝
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-5-20
收藏
得分:0 
我都不知道围棋是怎么下的,只知道有黑白子
2004-12-29 09:12
Kyo
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:4536
专家分:1
注 册:2004-12-27
收藏
得分:0 
我最精象棋,不过我不懂怎么用C去表示将军。。。

2004-12-30 01:17
断线风筝
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2004-5-20
收藏
得分:0 
我也喜欢玩象棋,有空了切磋切磋
2004-12-30 09:03
飘博英姿
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2004-12-30
收藏
得分:0 

/*主函数*/ 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[i][j]=CHESSNULL; /*光标初始位置*/ gCursor.x=gCursor.y=0;

/*画棋盘*/ textmode(C40); DrawMap();

/*显示操作键说明*/ i=0; textcolor(BROWN); while(Msg[i]!=NULL) { gotoxy(25,3+i); cputs(Msg[i]); i++; }

/*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy(gCursor.x+MAPXOFT,gCursor.y+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+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/ if(gChessBoard[x][y]==CHESS1) { textcolor(LIGHTBLUE); putch(CHESS1); return; } /*交叉点上是二号玩家的棋子*/ if(gChessBoard[x][y]==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[Cursor.x][Cursor.y]==CHESSNULL) { /*若没有棋子, 则可以落子*/ gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE); putch(Order); gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoard[Cursor.x][Cursor.y]=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; const int testnum = 5; int count;

switch(direction) { case 0:/*在水平方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y; dpos.x=1; dpos.y=0; break; case 1:/*在垂直方向*/ pos.x=Cursor.x; pos.y=Cursor.y-(testnum-1); dpos.x=0; dpos.y=1; break; case 2:/*在左下至右上的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y+(testnum-1); dpos.x=1; dpos.y=-1; break; case 3:/*在左上至右下的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y-(testnum-1); dpos.x=1; dpos.y=1; break; }

count=0; for(i=0;i<testnum*2+1;i++) { if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18) { if(gChessBoard[pos.x][pos.y]==Order) { count++; if(count>=testnum) return TRUE; } else count=0; } pos.x+=dpos.x; pos.y+=dpos.y; }

return FALSE; }

/*移动光标*/ void MoveCursor(int Order,int press) { switch(press) { case PLAY1UP: if(Order==CHESS1&&gCursor.y>0) gCursor.y--; break; case PLAY1DOWN: if(Order==CHESS1&&gCursor.y<18) gCursor.y++; break; case PLAY1LEFT: if(Order==CHESS1&&gCursor.x>0) gCursor.x--; break; case PLAY1RIGHT: if(Order==CHESS1&&gCursor.x<18) gCursor.x++; break;

case PLAY2UP: if(Order==CHESS2&&gCursor.y>0) gCursor.y--; break; case PLAY2DOWN: if(Order==CHESS2&&gCursor.y<18) gCursor.y++; break; case PLAY2LEFT: if(Order==CHESS2&&gCursor.x>0) gCursor.x--; break; case PLAY2RIGHT: if(Order==CHESS2&&gCursor.x<18) gCursor.x++; break; }

gotoxy(gCursor.x+MAPXOFT,gCursor.y+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(gCursor.x+MAPXOFT,gCursor.y+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;/*按键无效*/ }

2004-12-30 12:12
飘博英姿
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2004-12-30
收藏
得分:0 
有点长..
2004-12-30 12:14
快速回复:[求助]救命啊!!!请各位大哥务必要帮帮我,怎样用C语言来编一个围棋 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021108 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved