推荐阅读:超级详细的注释C语言简单实现童年小游戏:贪吃蛇_有·意思的博客-CSDN博客

三子棋游戏规则

是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

主要思路

从规则上可以把三字棋看成是一个3×3的矩阵,只要行、列或对角线上形成三个相同的图案判断为胜利。所以我可以把三子棋的棋盘看成是一个三行三列的数组,去判断数组元素的异同根据三子棋胜利规则判断胜利,当然这里主要实现的是人机交互的三子棋(玩家与玩家的三子棋只需要做一些小的改动即可)

人机交互的话,游戏的实现就需要玩家下棋步骤与电脑自动下棋步骤,可以分别用两个函数实现。这里主要只写了电脑走的函数void diannao(char str[row][col],int x,int y)实现电脑走,玩家下棋部分包含在了函数void game_sanzi()中。

电脑走函数:

//定义char str二维数组形参,row col为数组行列包含在头文件game_san.h
//x,y为了传递行数和列数这里我觉得有单多余但是懒得修改了void diannao(char str[row][col],int x,int y)
{system("cls");//清屏函数printf("电脑走->:\n");while (1)//设置死循环直到电脑随机产生的坐标可以落子退出{int m = rand() % x;int n = rand() % y;if (str[m][n] == ' ')//判断是否为空格若是可以落棋{str[m][n] = '#';//‘#’代表电脑棋子break;//下完棋退出这个随机循环}else if (str[m][n] == '*')continue;//判断如果次坐标有玩家棋子不能落子再次循环}
}

控制游戏进行game_sanzi()函数:

void game_sanzi()
{int z;int s;int count=0;char str[row][col];//定义一个二维数组for(int i=0;i<row;i++)//用空格初始化数组for (int x = 0; x < col; x++){str[i][x] = ' ';}while (1)//死循环重复下棋直到胜利退出{print(str, row, col);//自定义显示三子棋棋盘与棋子函数printf("玩家走->(坐标输入例如:11或者12)   :  ");//玩家输入坐标为十进制两位数scanf("%d", &z);if ((z >= 31 && z <= 33) || (z >= 21 && z <= 23) || (z >= 11 && z <= 13)){//条件限制玩家输入的坐标能对应棋盘的数组坐标count = 0;//计数器归零str[(z / 10) - 1][(z % 10) - 1] = '*';//玩家棋子‘*’落子print(str, row, col);//输出显示当前棋子棋盘s=win_(is_win(str, row, col));//判断是否胜利if (s == 1)break;//玩家胜利退出循环diannao(str,3,3);//电脑下棋print(str, row, col);//system("cls");//清屏这里有点问题,可以去掉这里放在上一行s=win_(is_win(str, row, col));//判断是否有胜利方if (s == 0)break;//电脑胜利退出循环//if((str[1][1]==str[12]==str[13])||(str[1][1]==str[2][2]==str[3][3]=='*')||(str[]))continue;//否则继续下棋}else//若玩家输入坐标超过三次失误退出游戏{printf("请重新输入有效坐标你还有%d次机会否则退出\n",(3-count));count++;if (count == 3)exit(0);continue;}}}

棋盘显示函数:

void print(char (*str)[3],int x,int y)
{for(int i=0;i<x;i++)//控制行for (int m = 0; m < y; m++)//控制列{if (m >= 0 && m <= 1)//若列数在0,1则输出竖线控制棋盘格式{printf("%c |", str[i][m]);}elseprintf("%c", str[i][m]);if (m == 2){printf("\n");printf("-- -- --\n");//控制棋盘横线格式}}
}

判断输赢:

//这里主要是写在头文件“game_san.h”中
//所以要用这里面的函数的话需要引用头文件#pragma once
#include"game_san.h"
char is_win(char str[][3],int m,int y)
{int count1=0;for (int i = 0; i < row; i++)//判断每行是否有相同的‘*’或则‘#’{if (str[i][0] != ' ' && str[i][1] == str[i][2] && str[i][0] == str[i][1]){return str[i][0];}}for (int i = 0; i < col; i++)//判断每列是否有相同的‘*’或则‘#’{if (str[0][i] != ' ' && str[1][i] == str[2][i] && str[0][i] == str[1][i]){return str[0][i];}}//对角线上判断是否相同if ((str[0][0] != ' ' && str[1][1] == str[2][2] && str[1][1] == str[0][0]) || (str[1][1] != ' ' && str[1][1] == str[2][0] && str[0][2] == str[1][1])){return str[1][1];}
}//判断是那一方胜利并且返回0,1结束循环并打印
int win_(char x)//这个函数有点多余主要是我的代码不够精简
{if (x == '*'){printf("玩家获胜!!!\n"); return 1;}else if (x == '#'){printf("电脑获胜!!!\n"); return 0;}
}

主要函数代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include"game_san.h"
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include"is_win.h"void menu(int *x)
{printf("***************************\n");printf("****** 1--开始游戏  *******\n");printf("*******2--退出游戏*********\n");printf("***************************\n");scanf("%d",x);
}void print(char (*str)[3],int x,int y)
{for(int i=0;i<x;i++)for (int m = 0; m < y; m++){if (m >= 0 && m <= 1){printf("%c |", str[i][m]);}elseprintf("%c", str[i][m]);if (m == 2){printf("\n");printf("-- -- --\n");}}
}
void diannao(char str[row][col],int x,int y)
{system("cls");printf("电脑走->:\n");while (1){int m = rand() % x;int n = rand() % y;if (str[m][n] == ' '){str[m][n] = '#';break;}else if (str[m][n] == '*')continue;}
}
void game_sanzi()
{int z;int s;int count=0;char str[row][col];for(int i=0;i<row;i++)for (int x = 0; x < col; x++){str[i][x] = ' ';}while (1){print(str, row, col);printf("玩家走->(坐标输入例如:11或者12)   :  ");scanf("%d", &z);if ((z >= 31 && z <= 33) || (z >= 21 && z <= 23) || (z >= 11 && z <= 13)){count = 0;str[(z / 10) - 1][(z % 10) - 1] = '*';print(str, row, col);s=win_(is_win(str, row, col));if (s == 1)break;diannao(str,3,3);print(str, row, col);system("cls");s=win_(is_win(str, row, col));if (s == 0)break;//if((str[1][1]==str[12]==str[13])||(str[1][1]==str[2][2]==str[3][3]=='*')||(str[]))continue;}else{printf("请重新输入有效坐标你还有%d次机会否则退出\n",(3-count));count++;if (count == 3)exit(0);continue;}}}
int main()
{srand((unsigned int)time(NULL));int x;menu(&x);while (1){switch (x){case 1:game_sanzi(); break;case 2:exit(0); break;default:printf("请重新输入:\n"); break;}}return 0;
}

弊端:这个代码还不够精简,有些步骤可以简化并且此代码没有考虑到如何实现电脑和玩家平局的局面,可以后期修改,码字不易,多多鼓励。不足之处还希望指出,谢谢。

补充:game_san.h头文件中只包括:

#define row  3
#define col  3

C语言实现简单的小游戏之三子棋相关推荐

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

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

  2. 【C语言】小游戏系列——三子棋(保姆级教程)

    我相信三子棋大家并不陌生,小时候经常玩,深受大家的喜欢.今天我们用c语言来编写一个简单的三子棋小游戏,在C语言的学习中,就应该用一些有趣的代码来激励我们,增加我们对编程的热爱.下面我来讲述如何去实现一 ...

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

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

  4. c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...

    [2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 一.实验目的与要求 (1)了解极大极小算法的原理和使用方法,并 ...

  5. c语言编写五子棋小游戏ppt,C语言实现简单五子棋小游戏

    五子棋简单功能实现,供大家参考,具体内容如下 游戏功能演示 代码如下: #include #include #include #include // 棋盘 char board[15][15]; // ...

  6. 【C语言入门小游戏】三子棋

    快点点赞 目录 文本目录 前言 一.游戏整体思路 二.代码实现以及思路 1.棋盘的初始化 2.棋盘的打印 3.玩家下棋 4.电脑自动下棋(智障化下棋) 5.判断输赢 三.代码的运行 前言 相信很多学习 ...

  7. 入门级c语言小游戏———实现三子棋(图文详解,代码可复制)

    想必大家都曾有过上课和同桌一起下三子棋的经历吧,你有没有想过在计算机上写一个三子棋游戏呢?欢迎打开本篇博客,接下来和博主一起用c语言实现简易版三子棋吧! 文章目录 一.问题描述 二.基本实现流程 三. ...

  8. C语言小游戏之——三子棋

    首先我们给出代码,结合代码我们进行解释: 首先,我们可以将游戏的进入及退出写入一个test函数,然后在主函数里只需写test();就可以访问了,主函数内不需要写太多的东西. void test() { ...

  9. C语言#(C语言小游戏:三子棋)

    目录 一.准备与规划 二.各类步骤 1.制作简易的界面(在test.c文件中)​编辑 2.游戏开始选择(在test.c文件中) 3.设置行,列(建议使用预处理指令#define定义)(在game.h中 ...

  10. C语言小游戏,三子棋游戏(适合初学者练习)

    三子棋代码 耗时三天,本人很菜,疯狂debug 不细心写代码真的很累 **本代码使用vs2019编译 所以使用了scanf_s(懂得都懂) 如果使用别的编译器请注意将起改为scanf #include ...

最新文章

  1. 新冠疫苗厂商科兴成立房地产公司?网友:准备打疫苗送房子了?
  2. 为什么 Redis 默认 16 个库?90% 以上程序员不知道!
  3. sql2012简体中文版安装
  4. linux入门_Linux超详细0基础入门篇(一)
  5. 如何使用Java创建AWS Lambda函数
  6. Java中的HashSet
  7. 使用Hibernate在CQRS读取模型中进行快速开发
  8. python泰坦尼克号数据预测_使用python预测泰坦尼克号生还
  9. 【转】jsp+servlet和SSM分别是如何实现文件上传(示例)
  10. numpy—np.eye、np.diag与np.tile
  11. 【nodejs】使用put方式向后端提交数据
  12. ngrok转发mysql连接_使用小米球 -Ngrok 实现内网转发
  13. 集训队论文之经典数学题【收藏】
  14. PSpice应用B-4
  15. optim优化器的使用
  16. [BZOJ 3654] 图样图森破
  17. React高级话题之Refs and the DOM
  18. redis的发布和订阅功能
  19. ARM各版本架构区别,各架构的系列芯片。
  20. 手写JDBC的几个步骤(针对MySQL8.0以上的mysql数据库)

热门文章

  1. poi导出execl固定表头表尾
  2. 冒泡排序原理+冒泡排序代码详解
  3. mongodb 备份 导入导出
  4. 数据结构-二叉树(求二叉树叶子节点数的递归和非递归算法)
  5. Sketch 56.2 Mac中文版
  6. 【最新】python爬取全国主要城市经纬度
  7. python偏最小二乘法公式_最小二乘法及其python实现详解
  8. 论大数据仓库的事务处理之法
  9. matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
  10. python 文件合并