整体思路:

首先,因为三子棋实现较为复杂,因此需要分模块编写,分为game.c,gsme.h和text.c模块。game.c中存放游戏实现的代码,game.h中存放有关游戏实现的函数声明,text.c里面放的是测试模块。

另外,写这种复杂的代码实现时,我们不能一次性写到底,需要每完成一部分就看程序是否能够成功执行,这样才能更有效的发现错误。

接下来进行一部部实现

text.c:

首先,玩游戏需要有一个菜单,并且当用户不想继续玩的时候能够通过输入指定的值来进行退出游戏,我们可以把打印菜单封装成一个menu()函数,然后创建一个变量来接收用户输入的值,然后用switch语句来判断用户是否进行游戏,这里可以用一个do...while循环,进入时先判断用户是否想要玩游戏,然后当用户玩了很多把游戏不想玩的时候,可以退出循环。

下面是这部分的代码实现:

#include"game.h"
#include<stdlib.h>
#include<time.h>
#include<windows.h>void menu()
{printf("******************\n");printf("***** 1.play *****\n");printf("***** 2.exit *****\n");printf("******************\n");printf("请选择:>");
}void text(void)
{int choice = 0;do {menu();scanf("%d", &choice);switch (choice){case 1:printf("三子棋\n");Sleep(1000);system("cls");break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");Sleep(1000);system("cls");break;}} while (choice);
}int main()
{text();return 0;
}

这里运用了Sleep()函数和cls清空输出窗口函数,目的是为了让等下玩游戏时界面更加简洁,当然这里肯定不能打印一个三子棋就完事,所以应该用game()函数封装游戏的实现。

game()函数

首先,要玩三子棋,肯定要先用一个二维数组储存落子的位置,在此之前,应该将每个位置都初始化为空格,并且为了让落子位置更加美观,我们需要打印一个棋盘,然后把玩家下棋封装成一个函数,电脑下棋封装成一个函数,然后每次下完棋之后需要判断是否有人胜利,如果胜利,结束游戏,如果平局,也结束游戏,如果都没有,那么游戏继续。可以创建函数is_win(),通过其的返回值来判断是否继续游戏。

接下来是全部代码实现:

text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include<stdlib.h>
#include<time.h>
#include<windows.h>void menu()
{printf("******************\n");printf("***** 1.play *****\n");printf("***** 0.exit *****\n");printf("******************\n");printf("请选择:>");
}void game(void)
{char c = 0;char board[ROW][COL] = { 0 };init_board(board,ROW,COL);print_board(board,ROW,COL);while(1){player_move(board, ROW, COL);system("cls");print_board(board, ROW, COL);c = is_win(board, ROW, COL);//每次电脑和玩家下完都应该判断游戏是否结束//如果玩家胜利,返回*,电脑胜利,返回#,平局返回Q,继续返回Cif (c != 'C')break;pc_move(board, ROW, COL);Sleep(1000);system("cls");print_board(board, ROW, COL);c = is_win(board, ROW, COL);if (c != 'C')break;}switch (c){case '*':printf("玩家胜利\n");break;case '#':printf("电脑胜利\n");break;case 'Q':printf("平局\n");break;}
}void text(void)
{srand((unsigned int)time(NULL));int choice = 0;do {menu();scanf("%d", &choice);switch (choice){case 1:game();Sleep(1000);system("cls");break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");Sleep(1000);system("cls");break;}} while (choice);
}int main()
{text();return 0;
}

game.h

#define ROW 3
#define COL 3#include<stdio.h>void init_board(char arr[ROW][COL], int row, int col);
//初始化棋盘void print_board(char arr[ROW][COL],int row,int col);
//打印棋盘void player_move(char arr[ROW][COL],int row,int col);
//玩家下棋void pc_move(char arr[ROW][COL],int row,int col);
//电脑下棋char is_win(char arr[ROW][COL], int row, int col);
//判断输赢

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"
#include<stdlib.h>
#include<time.h>int is_full(char arr[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++)if (arr[i][j] == ' ')return 0;}return 1;
}void init_board(char arr[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++)arr[i][j] = ' ';}
}void print_board(char arr[ROW][COL],int row ,int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", arr[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");}}
}void player_move(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf("请输入下棋的坐标:>");//这里需要判断玩家下棋的位置是否已经被下过棋以及下棋的范围是否准确while(1){scanf("%d %d", &i, &j);if (i > 0 && (i - 1) < row && j > 0 && (j - 1) < col){if (arr[i-1][j-1] == ' '){arr[i-1][j-1] = '*';break;}else{printf("该位置已被占用,请重新输入");}}else{printf("输入错误,请重新输入");}}
}void pc_move(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf("电脑下棋\n");while(1){i = rand() % row;j = rand() % col;if (arr[i][j] == ' '){arr[i][j] = '#';break;}}
}char is_win(char arr[ROW][COL], int row, int col)
{int i = 0;//判断三行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' '){return board[i][0];}}//判断三列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}//对角线if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//平局?if (is_full(board, row, col) == 1){return 'Q';}//继续//没有玩家或者电脑赢,也没有平局,游戏继续return 'C';
}

那如果想实现只要改动宏定义中的ROWheCOL就能将三子棋换成五子棋该怎么办呢?

这里发现,逻辑上有问题的只有判断输赢时的函数,用循环的形式判断输赢就可做到,其他地方都不需要变化。也就是说只需更换is_win函数中的代码即可

game.c升级版

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"
#include<stdlib.h>
#include<time.h>int is_full(char arr[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++)if (arr[i][j] == ' ')return 0;}return 1;
}void init_board(char arr[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++)arr[i][j] = ' ';}
}void print_board(char arr[ROW][COL],int row ,int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", arr[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");}}
}void player_move(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf("请输入下棋的坐标:>");//这里需要判断玩家下棋的位置是否已经被下过棋以及下棋的范围是否准确while(1){scanf("%d %d", &i, &j);if (i > 0 && (i - 1) < row && j > 0 && (j - 1) < col){if (arr[i-1][j-1] == ' '){arr[i-1][j-1] = '*';break;}else{printf("该位置已被占用,请重新输入");}}else{printf("输入错误,请重新输入");}}
}void pc_move(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;printf("电脑下棋\n");while(1){i = rand() % row;j = rand() % col;if (arr[i][j] == ' '){arr[i][j] = '#';break;}}
}char is_win(char arr[ROW][COL], int row, int col)
{//判断行int i = 0;char d = 0;for (i = 0; i < row; i++){int j = 0;d = arr[i][0];for (j = 1; j < col; j++)if (d == arr[i][j]&&d!=' ')continue;elsebreak;if (j == col)return d;}//判断列for (i = 0; i < col; i++){int j = 0;d = arr[0][i];for (j = 1; j < row; j++)if (d == arr[j][i]&&d!=' ')continue;elsebreak;if (j == col)return d;}//判主对角线d = arr[0][0];for (i = 1; i < col; i++){if (d != arr[i][i]) break;}if (i == col&&d!=' ')return d;//判断斜对角线d = arr[0][col-1];for (i = 1; i < row; i++){if (arr[i][col - 1 - i] != d)break;}if(i == row&&d!=' ')return d;if (is_full(arr,ROW,COL))return 'Q';return 'C';
}

这样就能实现多子棋啦!!!

三子棋实现(多子棋实现)相关推荐

  1. 我看你骨骼惊奇,送你本武林秘籍--《三子棋至多子棋的扩展》

    前言: 这篇文章将会手把手带你从程序设计需求出发,用代码思维来实现三子棋游戏. 每一步都会按照这个流程进行 1.要实现什么(程序设计需求) 例如:三子棋的游戏规则 用户的游玩方式 2.怎么实现 代码设 ...

  2. 【C/C++】题解:从三子棋到多子棋

    [C/C++]题解:三子棋延伸为多子棋 导读 该篇文章将会从三子棋延伸到多子棋,介绍如何实现一个多子棋程序,并希望可以体会到如何去设计一个简单的程序,如何去抽象出每个函数模块,掌握编写函数的方法论: ...

  3. C语言实现三子棋及多子棋的制作(初学者)

    游戏的逻辑: 1,首先打印一个菜单供给用户使用,这里使用一个do while循环,通过返回的值来分析玩家玩游戏或者退出. 2,玩家如果选择开始游戏,则进入游戏函数,反之,则退出或者报错. 3,,首先要 ...

  4. c语言实现简单的多子棋游戏

    c语言实现简单的多子棋游戏# 系列文章目录 c语言实现简单的多子棋游戏 前言 *大家好呀!今天我们要探究怎么用c语言实现以三子棋为基础的五子棋.十子棋等等多子棋游戏.游戏对代码的要求不高,只需要学习c ...

  5. 三子棋游戏(支持多子棋)

    目录 前言 一.创建三子棋的思路过程? 二.游戏模块 1.棋盘初始化 2.开始下棋 3.判断输赢 三.测试模块 四.源码 总结 前言 用c语言实现一个三子棋的游戏,当然也可以实现多子棋,修改一点参数即 ...

  6. 三子棋——可修改为多子棋

    三子棋:是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙等.将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了. 本程序可修改为多子棋,只需要修改#def ...

  7. 三子棋(五子棋,多子棋)的实现:c语言

    ​​​ 想必大家都玩过三子棋,话不多说,解释一下游戏规则,在九宫格中,每一行或每一列中出现三个相同的棋子,或者正对角线,逆对角线出现相同的棋子,则获胜,如下图 下面对代码进行实现: 文章目录 #1.打 ...

  8. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

  9. 简单c语言实现三子棋/多子棋

    简单c语言实现三子棋/多子棋主要是想实现以下几个功能 (先做再循环)do while 一.目录: 1.play 0.exit 二.选择:(Switch)选择 三.进行游戏: 1.储存数据 - 二维数组 ...

最新文章

  1. VC++从txt文本中读取字符和数字
  2. 给SAP云平台的global账号添加Leonardo机器学习服务
  3. 进程控制块PCB(进程描述符)
  4. 阿里P8大佬亲自教你!java程序设计第四版pdf
  5. Win10下OpenCV3.2.0+VS2015配置
  6. c#实现播放器的集中方式
  7. MySQL中使用adddate函数产生随机日期+时间
  8. building a blog
  9. 【Python】【jupyter-notebook】
  10. 深度学习笔记_基本概念_神经网络中的epoch、batch_size和iteration
  11. centos nginx php_Centos7下NGINX+PHP的安装及配置
  12. 940mx黑苹果驱动_黑苹果 Clover 驱动配置文件分享
  13. 音乐类Demo资源大全
  14. MongoDB学习记录10-分片-副本集(mongodb3.2版本以前)
  15. Investigating Typed Syntactic Dependencies for Targeted Sentiment Classification Using GAT(2020)
  16. 商贸零售行业2021年投资策略:市场下沉、渠道效率升级,新品牌新业态乘风而起
  17. b丅151组成的充电器电路_手机万能充电器电路原理与维修
  18. R: RStudio的中文读取、保存与显示
  19. python面试自我介绍_我的python面试简历
  20. 与sourceinsight媲美的代码阅读工具

热门文章

  1. 已解决sqlalchemy.exc.ProgrammingError: (pymssql._pymssql.ProgrammingError) (102, b“Incorrect syntax nea
  2. Codeforces1562 C. Rings(构造)
  3. 1099端口占用问题解决方案
  4. 2018.8.25T2(随机化)
  5. 浙江临海一民警收到“红牌警告”:立即停止工作
  6. Python之路【第十六篇】:Django【基础篇】
  7. 测试枕头软件,360度模拟人体睡眠测试,选对枕头让睡眠一步到位
  8. telegram协议电报群组采集,群用户提取,私发消息,群拉人,关键词监控回复等引流自动化
  9. C++ 如何加载lib
  10. 挂缀codevs2382