文章目录

  • 前言
  • 一、main函数所在源文件:test.c
  • 二、游戏相关函数定义源文件:game.c
  • 三、头文件、宏定义、游戏函数等声明头文件:game.h
  • 总结

前言

个人写的三子棋C语言实现,望交流


一、main函数所在源文件:test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"// 三子棋void Game(void) {// 用头文件的宏定义来确定棋盘大小char board[ROW][LINE] = {0};// 初始化棋盘,放在循环外Init(board);// 游戏过程放在死循环,用break跳出while (1) {// 打印棋盘//Print(board);//玩家下棋printf("玩家下棋:\n");Player(board);// 打印棋盘Print(board);// 判定棋局char ret = Judge(board);if ('*' == ret) {printf("游戏结束,玩家胜利!\n");break;}else if ('#' == ret) {printf("游戏结束,电脑胜利!\n");break;}else if('=' == ret) {printf("游戏结束,平局!\n");break;}else {printf("游戏继续!\n");}printf("\n------------------------\n");// 电脑下棋printf("电脑下棋:\n");Robot(board);// 打印棋盘Print(board);// 判定棋局ret = Judge(board);if ('*' == ret) {printf("游戏结束,玩家胜利!\n");break;}else if ('#' == ret) {printf("游戏结束,电脑胜利!\n");break;}else if ('=' == ret) {printf("游戏结束,平局!\n");break;}else {printf("游戏继续!\n");}printf("\n------------------------\n");}}int main() {srand(time(NULL));// 首先根据用户需要来决定是否要玩游戏或结束,且将用户的输入作为循环条件,0表示结束可以直接退出循环int input = 0;do {printf("请问您是否继续开始游戏(0结束/1开始)\n");scanf("%d", &input);// switch分支来根据用户输入判别switch (input){case 1:Game();break;case 0:printf("已退出\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

二、游戏相关函数定义源文件:game.c

#define _CRT_SECURE_NO_WARNINGS 1
// game源文件实现函数定义#include "game.h"void Init(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {board[i][j] = ' ';}}
}void Print(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {if (LINE - 1 == j) {printf("| %c |", board[i][j]);}else {printf("| %c ", board[i][j]);}}printf("\n");for (j = 0; j < LINE; j++) {printf("——");}printf("\n");}
}void Player(char board[ROW][LINE]) {// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满while (1) {// 玩家输入想下棋的位置(玩家棋子:*)int x = 0;int y = 0;// 玩家选择坐标直接根据从0开始数printf("请选择您要下的位置(x y)\n");//以%d,%d输入时,小心逗号格式必须也为英文的,对应起来scanf("%d %d", &x, &y);// 判断该位置是否合法if (x > 0 && y > 0 && x <= ROW && y <= LINE && ' ' == board[x - 1][y - 1]) {board[x - 1][y - 1] = '*';break;}else if ('=' == Judge(board)) {// 已满,退出即可,游戏函数紧接着后面就有判定break;}else {printf("该位置不合法,请重新输入\n");}}}void Robot(char board[ROW][LINE]) {// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满while (1) {// 电脑确定下棋的位置(电脑棋子:#)// x、y分别为0-ROW 和 0-LINE的数字int x = rand() % ROW;int y = rand() % LINE;// 判断该位置是否合法(与玩家判定下标有点区别)if (x >= 0 && y >= 0 && x < ROW && y < LINE && ' ' == board[x][y]) {board[x][y] = '#';break;}else if('=' == Judge(board)) {// 已满,退出即可,游戏函数紧接着后面就有判定break;}else {printf("该位置不合法,请重新筛选\n");}}}int Is_Full(char board[ROW][LINE]) {int i = 0;int j = 0;for (i = 0; i < ROW; i++) {for (j = 0; j < LINE; j++) {if (' ' == board[i][j]) {// 说明未满,直接返回0return 0;}}}// 否则满了返回1return 1;
}// 判定函数看答案了,自己写的有问题!!!!!!!!!!!!!!!!
// 只要在一行中任意3个连续位置都有同一个棋子,则一方胜利
// 玩家胜利返回*
// 电脑胜利返回#
// 平局(棋盘满)返回=
// 继续返回+(直接在函数最外面return '+')
char Judge(char board[ROW][LINE]) {// 判定行int i = 0;int j = 0;for (i = 0; i < ROW; i++) {//自己写的:for (j = 0; j < LINE; j++) {for (j = 1; j < LINE - 1; j++) {// 如果一行内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i][j - 1] == board[i][j] && board[i][j] == board[i][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 判定列for (j = 0; j < LINE; j++) {//自己写的从0开始for (i = 1; i < ROW - 1; i++) {// 如果一列内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i - 1][j] == board[i][j] && board[i][j] == board[i + 1][j] && board[i][j] != ' ') {return board[i][j];}}}// 判定主对角线for (i = 0; i < ROW; i++) {//自己写的从0开始for (j = 1; j < LINE - 1; j++) {// 如果主对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i - 1][j - 1] == board[i][j] && board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 判定次对角线for (i = 0; i < ROW; i++) {//自己写的从0开始for (j = 1; j < LINE - 1; j++) {// 如果次对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符// 自己写的没有判断不为空if (board[i + 1][j - 1] == board[i][j] && board[i][j] == board[i - 1][j + 1] && board[i][j] != ' ') {return board[i][j];}}}// 当判断是否满的函数返回1时为满,返回0时继续// 相当if (1 == Is_full(board))if (Is_Full(board)) {return '=';}else {// 判断平局return '+';}
}

三、头文件、宏定义、游戏函数等声明头文件:game.h

#pragma once
// 头文件实现声明// //易错:宏定义后面不加分号;
#define ROW 3
#define LINE 3#include <stdio.h>
#include <stdlib.h>
#include <time.h>extern void Init(char board[ROW][LINE]);extern void Print(char board[ROW][LINE]);extern void Player(char board[ROW][LINE]);extern void Robot(char board[ROW][LINE]);extern char Judge(char board[ROW][LINE]);extern int Is_Full(char board[ROW][LINE]);

总结

这里对文章进行总结:
以上就是今天总结的内容,本文包括了所有个人写的三子棋C语言代码,分享给大家。

【三子棋(井字棋)----C语言实现】相关推荐

  1. qt制作棋牌游戏之XO棋(井字棋)

    原理很简单,就是点击鼠标进行下子,电脑与你进行博弈 没事做做还是挺有意思的. 源码在下面: mylabel.h #ifndef MYLABEL_H #define MYLABEL_H#include ...

  2. 井字棋,一个不错的选择

    学习的时候总会感到无聊,困乏,需要再适当的时间放松一下,但是玩自己做的游戏会更有成就感!这次就自己做一个井字棋来看一看吧. 目录 大致流程 搭建棋盘 二维数组的初始 主函数的运行 玩家下棋 电脑下棋 ...

  3. python井字棋ai,python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  4. 用IE网页学游戏-井字棋

    IE网页学游戏-井字棋 井字棋实现交互的简单小游戏,学习使用表格,理解javascript函数. 1.构造棋盘 用table元素的行列构造三行三列的表格.设置好120像素的井字棋背景,三个小图表示方格 ...

  5. Java 面向对象之井字棋

    文章目录 基本介绍 面向对象 井字棋 项目结构 接口 IGame IChessman IMap IUser 下棋玩家User(Human/Computer) User implements IUser ...

  6. 井字棋--课后程序(Python程序开发案例教程-黑马程序员编著-第7章-课后作业)

    实例2:井字棋 井字棋是一种在3 * 3格子上进行的连珠游戏,又称井字游戏.井字棋的游戏有两名玩家,其中一个玩家画圈,另一个玩家画叉,轮流在3 * 3格子上画上自己的符号,最先在横向.纵向.或斜线方向 ...

  7. c语言井字棋程序框图,C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O"代表电脑下的子,'X" ...

  8. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

  9. 【C语言小游戏】三子棋(井字棋)

    hello,csdn的伙伴们,大家好,我们已经学习到了分支与循环,函数,数组这三大块知识,那么我们现在就可以尝试综合运用前面所学的知识,来完成一个简单的小游戏-----三子棋(井字棋) 目录 一.采用 ...

  10. C语言小游戏——三子棋(井字棋)

    文章目录 前言 一.前期准备 二.游戏整体结构及思路 1.程序主体结构: 2.代码解读 3.完整源代码 总结 前言 相信大家小时候都玩过井字棋小游戏,拿石子在地上画或是用笔在纸上画······今天我们 ...

最新文章

  1. Python【每日一问】08
  2. WTM框架使用技巧之:Layui版本嫁接Vue+ElementUI
  3. 说透Applet的数字签名之2——数字签名
  4. 近7成开发者无开源收入、最想操作系统开源、Java最受欢迎 | 揭晓中国开源开发者现状...
  5. HDU1262 寻找素数对
  6. Python做接口自动化测试框架
  7. 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
  8. 前端-深克隆与浅克隆
  9. Mac上的网络视频会议软件
  10. ZDNS正式成为“.ren”顶级域名注册管理机构
  11. su VS sudo
  12. html 卡片布局 怎么,卡片式格局(CardLayout)
  13. mnist 数据集 下载 训练 测试 pytorch
  14. python实现矩阵共轭和共轭转置
  15. wsappx关不掉_教你wsappx进程如何关
  16. 为GOOGLE 搜索栏添加google.cn
  17. 用原生JavaScript写出类似jQuery中slideUp和slideDown效果
  18. Chrome桌面提醒功能
  19. 从“平地春雷”到“风林火山”,SSD“中国芯”迎来升级
  20. 计算机专业英语第13章,第13章计算机专业英语.doc

热门文章

  1. 基于TCP的QQ聊天工具
  2. 使用three.js导入OBJ模型,变更、修改成其他OBJ模型和模型不可见原因说明
  3. 编译32/64位OpenCASCADE的详细步骤
  4. Linux系统编程总结
  5. 双十一广告弹窗问题找到了!金山词霸,原来是你!
  6. Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use
  7. 摇滚童话 Should I stay or should I go
  8. 代码随想录——Dota2参议院
  9. PHP语言:微信开放平台PC端扫码登录
  10. 前端开发工程师书籍值得推荐,你是否都看过叻?