目录

前言

一、创建三子棋的思路过程?

二、游戏模块

1.棋盘初始化

2.开始下棋

3.判断输赢

三、测试模块

四、源码

总结


前言

用c语言实现一个三子棋的游戏,当然也可以实现多子棋,修改一点参数即可


一、创建三子棋的思路过程?

1.首先是需要创建一个头文件和两个源文件(在以后的项目开发过程中,一般是不会将源文件开放的,这里就开始模拟以后的开发过程)

2.头文件用来声明我的游戏模块函数

3.一个测试文件,一个游戏模块文件

二、游戏模块

1.首先是初始化棋盘,将棋盘打印出来

2.玩家下棋,电脑下棋

3.判断输赢

有了思路之后,写代码就会好很多了,先将整体的框架搭建好,细节都是可以慢慢完善的

1.棋盘初始化

棋盘初始化时,先要初始化棋盘的内容,然后将棋盘打印出来,这里就将棋盘内容全部初始化为空

代码如下(示例):

void init_board(char board[Row][Col],int row,int col)//初始化棋盘
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = ' ';}}
}void print_board(char board[Row][Col],int row ,int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf(" %c ", board[i][j]);//打印棋盘内容if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1)//打印棋盘下划线{for (int j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}
}

2.开始下棋

玩家下棋:

这里的思路大概就是玩家随便输入一个坐标,电脑判断坐标是否合法,合法的坐标就将一个字符输入进棋盘,这里的做法是将二维数组的对应下标值对应的那个字符更改

电脑下棋:

随机生成两个数作为棋盘的下标,生成时保证下标合法

代码如下(示例):

void player_move(char board[Row][Col], int row, int col)
{int x, y;printf("玩家下棋,请输入棋盘坐标:");while (true){scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该位置已落子,请重新选择!");}}else{printf("坐标输入错误!,请重新输入");}}
}void computer_move(char board[Row][Col], int row, int col)
{printf("电脑下棋:\n");while (true){int x = rand() % row;int y = rand() % col;if (x >= 1 && x <= row && y >= 0 && y <= col){if (board[x][y] == ' '){board[x][y] = '#';break;}}}
}

3.判断输赢

通过对每一行、每一列、对角线的字符是否相等来判定输赢,这里的判断优化过了,不管是几子棋,这个判定程序都能够实现

同时如果棋盘满了还没有判断出来输赢,则这局游戏为平局

代码如下(示例):

int is_full(char board[Row][Col], int row, int col)//棋盘满了就不再继续了
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;
}char is_win(char board[Row][Col], int row, int col)//判断输赢
{int row1 = 0;int i = 0;int count = 0;for (int i = 0; i < row; i++)//判断行相等{int j = 0;count = 0;for (int j = 0; j < col; j++){if (board[i][j] == ' '){row1 = 0;break;}if (board[i][0] == board[i][j]){row1 = 1;count++;if (count == col){return board[i][0];}}else if (board[i][0] != board[i][j]){row1 = 0;}}}int col1 = 0;for (int i = 0; i < row; i++)//判断列相等{count = 0;for (int j = 0; j < col; j++){if (board[0][i] == ' '){col1 = 0;break;}if (board[0][i] == board[j][i]){col1 = 1;count++;if (count == row){return board[0][i];}}else if (board[0][i] != board[j][i]){col1 = 0;}}}int x = 0;count = 0;for (int i = 0; i < row;i++)//判断正对角线相等{if (board[i][i] == ' '){x = 0;break;}if (board[0][0] == board[i][i]){x = 1;count++;if (count == row){return board[0][0];}}else if (board[0][0] != board[i][i]){col1 = 0;}}count = 0;x = 0;for (int i = 0, j=col-1; i < row ; i++,j--)//判断反对角线相等{if (board[i][j] == ' '){x = 0;break;}if (board[0][col-1] == board[i][j]){x = 1;count++;if (count == row){return board[0][col-1];}}else if (board[0][col-1] != board[i][j]){x = 0;}}if (is_full(board, row, col) == 1){return 'Q';}return 'C';
}

三、测试模块

1.将所有的模块整合,将这个游戏实现出来

2.制作一个简易的图形化处理界面

3.循环游戏,通过玩家的输入数字来决定是否继续

4.游戏进行时也要循环,只有获胜或者平局是游戏才结束

代码如下(示例):

void menu()
{printf("********************\n");printf("*****1.开始游戏*****\n");printf("*****0.退出游戏*****\n");printf("********************\n");
}void game()
{char board[Row][Col];char ret;init_board(board,Row,Col);print_board(board, Row, Col);while (true){player_move(board, Row, Col);print_board(board, Row, Col);ret = is_win(board, Row, Col);if (ret != 'C'){break;}computer_move(board, Row, Col);print_board(board, Row, Col);ret = is_win(board, Row, Col);if (ret != 'C'){break;}}if (ret == 'Q'){printf("平局");}else if (ret == '*'){printf("玩家胜利");}else if (ret == '#'){printf("电脑胜利");}
}int main()
{int input;do{menu();printf("请输入你的选择");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入有误!请重新输入!");}printf("\n");} while (input);
}

四、源码

//头文件#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define Row 3
#define Col 3//初始化棋盘
void init_board(char board[Row][Col], int row, int col);//打印棋盘
void print_board(char board[Row][Col], int row, int col);//玩家下棋
void player_move(char board[Row][Col], int row, int col);//电脑下棋
void computer_move(char board[Row][Col], int row, int col);//判断输赢
char is_win(char board[Row][Col], int row, int col);//游戏模块#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void init_board(char board[Row][Col],int row,int col)//初始化棋盘
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = ' ';}}
}void print_board(char board[Row][Col],int row ,int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf(" %c ", board[i][j]);//打印棋盘内容if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1)//打印棋盘下划线{for (int j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}
}void player_move(char board[Row][Col], int row, int col)
{int x, y;printf("玩家下棋,请输入棋盘坐标:");while (true){scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该位置已落子,请重新选择!");}}else{printf("坐标输入错误!,请重新输入");}}
}void computer_move(char board[Row][Col], int row, int col)
{printf("电脑下棋:\n");while (true){int x = rand() % row;int y = rand() % col;if (x >= 1 && x <= row && y >= 0 && y <= col){if (board[x][y] == ' '){board[x][y] = '#';break;}}}
}int is_full(char board[Row][Col], int row, int col)//棋盘满了就不再继续了
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;
}char is_win(char board[Row][Col], int row, int col)//判断输赢
{int row1 = 0;int i = 0;int count = 0;for (int i = 0; i < row; i++)//判断行相等{int j = 0;count = 0;for (int j = 0; j < col; j++){if (board[i][j] == ' '){row1 = 0;break;}if (board[i][0] == board[i][j]){row1 = 1;count++;if (count == col){return board[i][0];}}else if (board[i][0] != board[i][j]){row1 = 0;}}}int col1 = 0;for (int i = 0; i < row; i++)//判断列相等{count = 0;for (int j = 0; j < col; j++){if (board[0][i] == ' '){col1 = 0;break;}if (board[0][i] == board[j][i]){col1 = 1;count++;if (count == row){return board[0][i];}}else if (board[0][i] != board[j][i]){col1 = 0;}}}int x = 0;count = 0;for (int i = 0; i < row;i++)//判断正对角线相等{if (board[i][i] == ' '){x = 0;break;}if (board[0][0] == board[i][i]){x = 1;count++;if (count == row){return board[0][0];}}else if (board[0][0] != board[i][i]){col1 = 0;}}count = 0;x = 0;for (int i = 0, j=col-1; i < row ; i++,j--)//判断反对角线相等{if (board[i][j] == ' '){x = 0;break;}if (board[0][col-1] == board[i][j]){x = 1;count++;if (count == row){return board[0][col-1];}}else if (board[0][col-1] != board[i][j]){x = 0;}}if (is_full(board, row, col) == 1){return 'Q';}return 'C';
}//测试模块#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void menu()
{printf("********************\n");printf("*****1.开始游戏*****\n");printf("*****0.退出游戏*****\n");printf("********************\n");
}void game()
{char board[Row][Col];char ret;init_board(board,Row,Col);print_board(board, Row, Col);while (true){player_move(board, Row, Col);print_board(board, Row, Col);ret = is_win(board, Row, Col);if (ret != 'C'){break;}computer_move(board, Row, Col);print_board(board, Row, Col);ret = is_win(board, Row, Col);if (ret != 'C'){break;}}if (ret == 'Q'){printf("平局");}else if (ret == '*'){printf("玩家胜利");}else if (ret == '#'){printf("电脑胜利");}
}int main()
{int input;do{menu();printf("请输入你的选择");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入有误!请重新输入!");}printf("\n");} while (input);
}

总结

以上就是三子棋的全部实现内容了,有些地方还没有优化好,但是支持各种棋盘,大家有兴趣的可以拷到电脑上玩一下

三子棋游戏(支持多子棋)相关推荐

  1. 【C语言】简单三子棋游戏/井字棋游戏

    基本实现思路: 写出棋盘界面 通过二维数组来编辑棋子 玩家下棋/电脑下棋(随机) 输赢/平局的判断 在程序中,新建出两个源文件:"test.c" 和 "game.c&qu ...

  2. 三子棋的升华———多子棋的代码实现

    以五子棋为例 关键代码(其他代码同三子棋)  注意:红色标记是细节之处,不细心很容易出错!

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

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

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

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

  5. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  6. 用C语言实现简单的一字棋游戏

    问题分析设计目录 棋盘显示和标记以及棋盘的设计 搜索树叶子节点设计 搜索树设计 节点静态估值计算 完整代码 总结 棋盘显示和标记以及棋盘的设计 用int一维数组表示一字棋的棋盘位置,0~8,数组位置i ...

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

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

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

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

  9. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

    本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...

最新文章

  1. linux 防火墙 命令
  2. vue 新手指引_精通react/vue组件设计之快速实现一个可定制的进度条组件
  3. 黑马程序员Linux系统开发视频之mmap使用注意事项
  4. promise存在的意义分析resolve reject catch
  5. Java项目出现的问题01----学习
  6. C++ vector容器中常见的三种遍历方式
  7. 数论杂谈(欧拉定理与费马小定理结论与应用)
  8. linux驱动头文件查找目录,在Fedora 20中查找简单设备驱动程序的头文件
  9. 综合短网址缩短和还原源码
  10. 配置MyEclipse的版本为jdk1.7
  11. [转]WINDOW进程通信的几种方式
  12. python 统计excel表格_Python实现对excel文件列表值进行统计的方法
  13. 关联分析购物篮案例python_购物篮分析案例_关联分析算法_如何做销售数据分析 – 帆软...
  14. centos7随机生成密码
  15. 【废墟】知我者谓我心忧,不知我者谓我何求~
  16. PyTorch 轻松节省显存的小技巧
  17. 【MySQL】--架构简介
  18. 《大学“电路分析基础”课程实验合集.实验五》丨线性有源二端网络等效电路的研究
  19. 可行解、最优解、基解、基可行解、基最优解
  20. bed文件 坐 标的调整(awk的用法)

热门文章

  1. 图像风格迁移cvpr2020_CVPR 2018:一种交互式纹理迁移通用框架
  2. 手把手教你SSM整合开发办公系统(OA)——报销单(含源码)
  3. CSS3的2D、3D变换、过度与动画效果
  4. 如何在spss结果输出页面显示命令/运行代码
  5. ThreeJS 骨架图显示、骨骼修改颜色
  6. [图论] 平面图 平面性的判定
  7. 述职报告(2017-2018年度)
  8. 利用 Docker 配置 Pytorch 镜像流程
  9. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)
  10. Games101学习笔记二(锯齿、模糊等失真的本质)