C语言怎样实现简易三子棋
作者
这篇文章将为大家详细讲解有关C语言怎样实现简易三子棋,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
前言
检验学习成果最好的方式是实践,在学习完C语言的函数和数组以后,就可以简易的实现一些小游戏,本文将介绍如何实现三字棋小游戏。欢迎探讨
思路分析
三子棋的规则是在3X3的棋盘里,率先将自己的三个棋子连成一条直线为赢家,程序实现的核心是玩家的落子以及输赢的判断。核心流图:当前棋盘->玩家1移动->当前棋盘->输赢判断->玩家2移动->当前棋盘->判断输赢->玩家1移动······
函数实现
玩家落子
玩家输入坐标将棋子落入棋盘中,即为向一个二维数组赋值。需要注意的时,输入的坐标不能超出数组范围,并且不能占用被输入的位置。
voidPlayerMove(charboard[ROW][COL],introw,intcol) { printf("玩家走:>\n"); intx=0; inty=0; while(1) { printf("请输入坐标:>"); scanf("%d%d",&x,&y); if(x>=1&&x<=row&&y>=1&&y<=col) { if(board[x-1][y-1]=='') { board[x-1][y-1]='*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } }
当前棋盘
实质是输出二维数组输出二维数组,但是为了美化棋盘,我们需要一些符号来分割棋盘,让它结构清晰。
voidDisplayBoard(charboard[ROW][COL],introw,intcol) { inti=0; for(i=0;i<row;i++) { intj=0; for(j=0;j<col;j++) { printf("%c",board[i][j]); if(j<col-1) printf("|"); } printf("\n"); if(i<row-1) { for(j=0;j<col;j++) { printf("---"); if(j<col-1) printf("|"); } } printf("\n"); } }
判断输赢
只要我们找到三个连成一条直线的棋子即可,这里选三个棋子中中间那个即可。然后判断是不是满足条件。说明:返回*,表示输入*的玩家赢;返回#,表示输入#的玩家赢;返回 Q,表示平局;返回C,表示游戏继续。
charIsWin(charboard[ROW][COL],introw,intcol){ inti,j,count=0; for(i=0;i<row;i++) for(j=0;j<col;j++){ if(board[i][j]=='*'){ if(i-1>=0&&i+1<row&&board[i-1][j]=='*'&&board[i+1][j]=='*') return'*'; if(j-1>=0&&j+1<col&&board[i][j-1]=='*'&&board[i][j+1]=='*') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j-1]=='*'&&board[i+1][j+1]=='*') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j+1]=='*'&&board[i+1][j-1]=='*') return'*'; } if(board[i][j]=='#'){ if(i-1>=0&&i+1<row&&board[i-1][j]=='#'&&board[i+1][j]=='#') return'#'; if(j-1>=0&&j+1<col&&board[i][j-1]=='#'&&board[i][j+1]=='#') return'#'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j-1]=='#'&&board[i+1][j+1]=='#') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j+1]=='#'&&board[i+1][j-1]=='#') return'#'; } if(board[i][j]=='') count++; } if(count==0) return'Q'; else return'C'; }
源码实现
#define_CRT_SECURE_NO_WARNINGS #include<stdio.h> #defineROW3 #defineCOL3 voidInitBoard(charboard[ROW][COL],introw,intcol); voidDisplayBoard(charboard[ROW][COL],introw,intcol); voidPlayer1Move(charboard[ROW][COL],introw,intcol); voidPlayer2Move(charboard[ROW][COL],introw,intcol); charIsWin(charboard[ROW][COL],introw,intcol); voidInitBoard(charboard[ROW][COL],introw,intcol) { inti=0; for(i=0;i<row;i++) { intj=0; for(j=0;j<col;j++) { board[i][j]=''; } } }//棋盘初始化,二维数组全部初始化空格 voidDisplayBoard(charboard[ROW][COL],introw,intcol) { inti=0; for(i=0;i<row;i++) { intj=0; for(j=0;j<col;j++) { printf("%c",board[i][j]); if(j<col-1) printf("|"); } printf("\n"); if(i<row-1) { for(j=0;j<col;j++) { printf("---"); if(j<col-1) printf("|"); } } printf("\n"); } }//棋盘打印函数,打印出当前棋盘 voidPlayer1Move(charboard[ROW][COL],introw,intcol) { printf("玩家1走:>\n"); intx=0; inty=0; while(1) { printf("请输入坐标:>"); scanf("%d%d",&x,&y);//21-->10 if(x>=1&&x<=row&&y>=1&&y<=col) { if(board[x-1][y-1]=='') { board[x-1][y-1]='*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } } voidPlayer2Move(charboard[ROW][COL],introw,intcol) { printf("玩家1走:>\n"); intx=0; inty=0; while(1) { printf("请输入坐标:>"); scanf("%d%d",&x,&y);//21-->10 if(x>=1&&x<=row&&y>=1&&y<=col) { if(board[x-1][y-1]=='') { board[x-1][y-1]='#'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,超出范围\n"); } } } charIsWin(charboard[ROW][COL],introw,intcol){ inti,j,count=0; for(i=0;i<row;i++) for(j=0;j<col;j++){ if(board[i][j]=='*'){ if(i-1>=0&&i+1<row&&board[i-1][j]=='*'&&board[i+1][j]=='*') return'*'; if(j-1>=0&&j+1<col&&board[i][j-1]=='*'&&board[i][j+1]=='*') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j-1]=='*'&&board[i+1][j+1]=='*') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j+1]=='*'&&board[i+1][j-1]=='*') return'*'; } if(board[i][j]=='#'){ if(i-1>=0&&i+1<row&&board[i-1][j]=='#'&&board[i+1][j]=='#') return'#'; if(j-1>=0&&j+1<col&&board[i][j-1]=='#'&&board[i][j+1]=='#') return'#'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j-1]=='#'&&board[i+1][j+1]=='#') return'*'; if(i-1>=0&&i+1<row&&j-1>=0&&j+1<col&&board[i-1][j+1]=='#'&&board[i+1][j-1]=='#') return'#'; } if(board[i][j]=='') count++; } if(count==0) return'Q'; else return'C'; } intmain() { charboard[ROW][COL]; InitBoard(board,ROW,COL); DisplayBoard(board,ROW,COL); charret=0; while(1) { Player1Move(board,ROW,COL); DisplayBoard(board,ROW,COL); ret=IsWin(board,ROW,COL); if(ret!='C') { break; } Player2Move(board,ROW,COL); DisplayBoard(board,ROW,COL); ret=IsWin(board,ROW,COL); if(ret!='C') { break; } } if(ret=='*') { printf("玩家赢\n"); } elseif(ret=='#') { printf("电脑赢\n"); } else { printf("平局\n"); } return0; }
关于“C语言怎样实现简易三子棋”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~