三子棋
三子棋介绍
三子棋又叫井字棋、圈圈叉叉、一条龙等等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将本身的三个棋子走成一条线,对方就算输了。可是,有不少时候会出现和棋的状况。windows
描述
用c语言编写一个三子棋。数组
基本流程
1.建立一个用户交互菜单;
2.建立一个棋盘并初始化;
3.打印一个棋盘;
4.玩家落子(玩家经过输入行列坐标落子);
5.断定胜负关系;
6.电脑落子(电脑采用随机落子的方式落子);
7.断定胜负关系;
8.游戏结束。
函数
代码实现
用户交互菜单
int menu(){ printf("=====================\n"); printf("1.开始游戏\n"); printf("0.结束游戏\n"); printf("=====================\n"); printf("请输入您的选择:"); int choice = 0; scanf("%d", &choice); return choice; }
咱们首先建立一个用户交互菜单来实现与用户的交互。spa
打印棋盘
void PrintChessBoard(char ChessBoard[MAX_ROW][MAX_COL]){ //打印棋盘 printf("+---+---+---+\n"); for (int row = 0; row < MAX_ROW; row++){ printf("| %c| %c| %c|\n", ChessBoard[row][0], ChessBoard[row][1], ChessBoard[row][2]); printf("+---+---+---+\n"); } }
咱们经过一个函数来打印棋盘,棋盘的边框用+号和-号来完成,再经过一个for循环来实现每行每一个格子的边框实现。这里的%c是输入一个字符。指针
棋盘初始化
void Init(char ChessBoard[MAX_ROW][MAX_COL]){ // 把数组中的每一个元素都设为 空格 for (int row = 0; row < MAX_ROW; row++){ for (int col = 0; col < MAX_COL; col++){ ChessBoard[row][col] = ' '; } } }
初始化过程当中,咱们经过采用两重循环使棋盘初始化,让棋盘一开始的每一个格子中的元素都是空格。code
玩家落子
void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){ //玩家落子 while (1){ printf("请玩家输入坐标(row,col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); if (row<0 || row>=MAX_ROW || col<0 || col>=MAX_COL){ printf("您的输入有误,请从新输入!\n"); continue; } if (ChessBoard[row][col] != ' '){ printf("此处已经落子!\n"); continue; } ChessBoard[row][col] = 'x'; break; } }
玩家采用输入行列的方式坐标的方式来落子,同时咱们须要排除玩家出入的坐标是否正确的问题,若是玩家输入的坐标超出了范围,则提示玩家输入错误,从新输入,若是玩家输入的坐标的格子已经有一个元素了,则提醒玩家此处已经落子。当玩家正确落子时,咱们规定落子的元素为‘X’。游戏
电脑落子
void computerMove(char ChessBoard[MAX_ROW][MAX_COL]){ //电脑落子 while (1){ int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (ChessBoard[row][col] != ' '){ continue; } ChessBoard[row][col] = 'o'; break; } }
电脑落子时,咱们采用随机数的方式来让电脑落子,在后面的main()函数中使用srand((unsigned int)time(0)),unsigned int的做用是强制转换类型,这里是转换成int型。it
断定胜负关系
char iswin(char ChessBoard[MAX_ROW][MAX_COL]){ //断定胜负 for (int row = 0; row < MAX_ROW; row++){ //断定行 if (ChessBoard[row][0] != ' ' &&ChessBoard[row][0] == ChessBoard[row][1] && ChessBoard[row][0] == ChessBoard[row][2]){ return ChessBoard[row][0]; } } for (int col = 0; col < MAX_COL; col++){ //断定列 if (ChessBoard[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] && ChessBoard[col][0] == ChessBoard[col][2]){ return ChessBoard[col][0]; } } if (ChessBoard[0][0] !=' ' && ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[0][0] == ChessBoard[2][2]){ return ChessBoard[0][0]; } if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[2][0] == ChessBoard[0][2]){ return ChessBoard[2][0]; } if (isfull(ChessBoard)){ return 'q'; } return ' '; }
在游戏介绍中咱们知道三子棋获胜的方式就是在一条直线上有3个相同的元素,这样则断定为胜利。io
断定和棋状况
int isfull(char ChessBoard[MAX_ROW][MAX_COL]){ //判断和棋状况 for (int row = 0; row < MAX_ROW; row++){ for (int col = 0; col < MAX_COL; col++){ if (ChessBoard[row][col] == ' '){ return 0; } } } return 1; }
和棋状况的描述就是在棋盘中再没有空格,且玩家与电脑双方都没有获胜的状况。for循环
game()函数
void game(){ char ChessBoard[MAX_ROW][MAX_COL] = { 0 }; Init(ChessBoard); char winner = ' '; while (1){ PrintChessBoard(ChessBoard);//打印棋盘 playerMove(ChessBoard);//玩家落子 winner = iswin(ChessBoard);//胜负断定 if (winner != ' '){ break; } computerMove(ChessBoard); winner = iswin(ChessBoard); if (winner != ' '){ break; } } PrintChessBoard(ChessBoard); if (winner == 'x'){ printf("恭喜您,打败了人工智障!\n"); } if (winner == 'o'){ printf("很遗憾,您连人工智障都不如!\n"); } if (winner == 'q'){ printf("您和人工智障五五开!\n"); } }
在game()函数中,咱们就要引用咱们刚才所写的棋盘初始化,打印棋盘,断定胜负关系等函数。这里要注意的是在玩家和电脑落子时,咱们都要对其进行一一断定。
总代码
#include<stdio.h>//三子棋 #include<windows.h> #pragma warning(disable:4996) #include<time.h> #define MAX_ROW 3 #define MAX_COL 3 //1.首先打印棋盘(并让棋盘初始化) //2.玩家落子 //3.断定胜负 //4.电脑落子 //5.断定胜负 void Init(char ChessBoard[MAX_ROW][MAX_COL]){ // 把数组中的每一个元素都设为 空格 for (int row = 0; row < MAX_ROW; row++){ for (int col = 0; col < MAX_COL; col++){ ChessBoard[row][col] = ' '; } } } void PrintChessBoard(char ChessBoard[MAX_ROW][MAX_COL]){ //打印棋盘 printf("+---+---+---+\n"); for (int row = 0; row < MAX_ROW; row++){ printf("| %c| %c| %c|\n", ChessBoard[row][0], ChessBoard[row][1], ChessBoard[row][2]); printf("+---+---+---+\n"); } } void playerMove(char ChessBoard[MAX_ROW][MAX_COL]){ //玩家落子 while (1){ printf("请玩家输入坐标(row,col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); if (row<0 || row>=MAX_ROW || col<0 || col>=MAX_COL){ printf("您的输入有误,请从新输入!\n"); continue; } if (ChessBoard[row][col] != ' '){ printf("此处已经落子!\n"); continue; } ChessBoard[row][col] = 'x'; break; } } void computerMove(char ChessBoard[MAX_ROW][MAX_COL]){ //电脑落子 while (1){ int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (ChessBoard[row][col] != ' '){ continue; } ChessBoard[row][col] = 'o'; break; } } int isfull(char ChessBoard[MAX_ROW][MAX_COL]){ //判断和棋状况 for (int row = 0; row < MAX_ROW; row++){ for (int col = 0; col < MAX_COL; col++){ if (ChessBoard[row][col] == ' '){ return 0; } } } return 1; } char iswin(char ChessBoard[MAX_ROW][MAX_COL]){ //断定胜负 for (int row = 0; row < MAX_ROW; row++){ //断定行 if (ChessBoard[row][0] != ' ' &&ChessBoard[row][0] == ChessBoard[row][1] && ChessBoard[row][0] == ChessBoard[row][2]){ return ChessBoard[row][0]; } } for (int col = 0; col < MAX_COL; col++){ //断定列 if (ChessBoard[col][0] != ' ' &&ChessBoard[col][0] == ChessBoard[col][1] && ChessBoard[col][0] == ChessBoard[col][2]){ return ChessBoard[col][0]; } } if (ChessBoard[0][0] !=' ' && ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[0][0] == ChessBoard[2][2]){ return ChessBoard[0][0]; } if (ChessBoard[2][0] != ' ' && ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[2][0] == ChessBoard[0][2]){ return ChessBoard[2][0]; } if (isfull(ChessBoard)){ return 'q'; } return ' '; } void game(){ char ChessBoard[MAX_ROW][MAX_COL] = { 0 }; Init(ChessBoard); char winner = ' '; while (1){ PrintChessBoard(ChessBoard);//打印棋盘 playerMove(ChessBoard);//玩家落子 winner = iswin(ChessBoard);//胜负断定 if (winner != ' '){ break; } computerMove(ChessBoard); winner = iswin(ChessBoard); if (winner != ' '){ break; } } PrintChessBoard(ChessBoard); if (winner == 'x'){ printf("恭喜您,打败了人工智障!\n"); } if (winner == 'o'){ printf("很遗憾,您连人工智障都不如!\n"); } if (winner == 'q'){ printf("您和人工智障五五开!\n"); } } int menu(){ printf("=====================\n"); printf("1.开始游戏\n"); printf("0.结束游戏\n"); printf("=====================\n"); printf("请输入您的选择:"); int choice = 0; scanf("%d", &choice); return choice; } int main(){ srand((unsigned int)time(0)); while (1){ int choice = menu();//建立一个简单的用户交互菜单 if (choice == 1){ game(); } else if (choice == 0){ printf("Goodbye!\n"); break; } else{ printf("您的输入有误,请从新输入!\n"); } } system("pause"); return 0; }
ok ,文章就先到这里了,但愿这篇文章可以帮助到你对指针的认识,如有不足或者不正之处,但愿谅解并欢迎批评指正!
若是本文章对你有帮助,哪怕一点点,那就请点一个赞呗,谢谢~~