700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【C语言】实现三子棋代码

【C语言】实现三子棋代码

时间:2021-03-05 04:53:42

相关推荐

【C语言】实现三子棋代码

前言

本文介绍如何使用C语言实现三子棋游戏

思路

难点在于如何实现棋盘的打印,落子,以及如何判断胜利

棋盘打印

这里棋盘打印没有硬性要求,只要可以明显区分开

三子棋:三行三列

将棋盘拆分开,其实就是由两行三列的 '---|' 以及三行两列 '|' 组成

使用3x3的二维数组打印棋盘

#define han 3#define lie 3void display_board(char board[han][lie], int row,int cul);

功能代码实现

void display_board(char board[han][lie], int row, int cul){//使用for循环遍历数组,并给数组赋值‘|’int i = 0;for (i = 0; i < row; i++){int j;for (j = 0; j < cul; j++){//为了美观,这里使用if else语句判断在第三列不打印'|'if (j < cul - 1){printf(" %c |",board[i][j]);}else{printf(" %c ",board[i][j]);}}printf("\n");//使用for循环遍历数组,并给数组赋值'|'//这里注意,由于‘---|’是从第二行开始打印if(i < row-1){for (j = 0; j < cul; j++){//依旧判断一下,在最后一行不打印'---|'而打印'---'if (j < cul-1){printf("---|");}else{printf("---");}}printf("\n");}}}

void initialize_board(char board[han][lie], int row, int cul){int i = 0;int j = 0;//初始化数组,数组每个元素赋值空格,不然打印出来显示0;for (i = 0; i < row; i++){for (j = 0; j <cul; j++){board[i][j] =' ';}}}

玩家和电脑落子的实现

玩家:可以有键盘输入坐标位置来实现落子

电脑:使用随机数生成坐标位置来落子

void player(char board[han][lie], int row, int cul){//定义坐标变量int x = 0;int y = 0;to:printf("玩家下>:\n");scanf_s("%d%d", &x, &y);if ( x <= row && y <= cul && x > 0 && y > 0)//设置坐标的范围,依旧棋盘而定{//判断没有落子才能输入if (board[x-1][y-1] == ' '){board[x-1][y-1] = '*';}else if (board[x-1][y-1] == '*'){printf("你已经下过这个地方了,请重新下>:\n");goto to;}}else{printf("坐标输入错误请重新输入>:\n");goto to;}}void com_player(char board[han][lie], int row, int cul){int x = 0;int y = 0;printf("电脑下>:\n");to://生成随机值,rand();实现//这里%是将随机数值通过取余将数值控制在0~3之间x = rand() % (row+1);y = rand() % (cul+1);if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '#';}else if (board[x - 1][y - 1] !=' '){goto to;}}

判断胜利条件

三子棋的胜利条件:任意条线三个一样子即为胜利

即:三个横排以及三竖屏和两个对角线

所以需要分别判定

这里注意可以在判断胜利时返回一个值来用于结束的游戏的判断

当然也可以设置平局判断,这个感觉很难做下平局的场景

char win_player(char board[han][lie], int row, int cul){int i = 0;int j = 0;//横排赢for (i = 0; i < row; i++){if (board[i][0] == '*' && board[i][1] == '*'&& board[i][2] == '*'){printf("玩家赢\n");return 'p';}}//竖排赢for (i = 0; i < cul; i++){if (board[0][i] == '*' && board[1][i] == '*'&& board[2][i] == '*'){printf("玩家赢\n");return 'p';}}//对角线if (board[0][0] == '*' && board[1][1] == '*'&& board[2][2] == '*'){printf("玩家赢\n");return 'p';}else if (board[0][2] == '*' && board[1][1] == '*'&& board[2][0] == '*'){printf("玩家赢\n");return 'p';}return 0 ;}char win_com_player(char board[han][lie], int row, int cul){int i = 0;//横排赢for (i = 0; i < row; i++){if (board[i][0] == '#' && board[i][1] == '#'&& board[i][2] == '#'){printf("电脑赢\n");return 'c';}}//竖排赢for (i = 0; i < cul; i++){if (board[0][i] == '#' && board[1][i] == '#'&& board[2][i] == '#'){printf("电脑赢\n");return 'c';}}//对角线if (board[0][0] == '#' && board[1][1] == '#'&& board[2][2] == '#'){printf("电脑赢\n");return 'c';}else if (board[0][2] == '#' && board[1][1] == '#'&& board[2][0] == '#'){printf("电脑赢\n");return 'c';}return 0;}

开始界面

主函数:使用do...while语句循环游戏选择界面,这样游玩结束可以继续游玩。

switch语句判断是否进行游戏

int main(){do{play();//游戏选择界面函数scanf_s("%d", &input);switch (input){case 1:printf("开始游戏\n");game();//游玩界面函数break;case 0:printf("退出游戏\n");input = 0;break;default:printf("输入错误\n");break;}} while (input);return 0;}

游戏模块

void game(){char board[han][lie] = { 0 };//定义二维数组initialize_board(board, han, lie);//使用二维数组初始棋盘display_board(board, han, lie);//打印棋盘while (1){player(board, han, lie);//玩家游玩display_board(board, han, lie);//判断玩家是否胜利if (win_player(board, han, lie)=='p'){break;}com_player(board, han, lie);//电脑游玩display_board(board, han, lie);//判断电脑是否胜利if (win_com_player(board, han, lie) == 'c'){break;}}printf("游戏结束\n");}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。