C语言实现三子棋(通过数组)

  • 需要包含的头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
  • 创建一个全局数组

    因为如果数组大小变化,游戏规则和实现思路都会有很大的变化,所以不进行宏定义常量来定义数组
char board[3][3];
  • 设计主程序框架

    game()函数为游戏过程框架
int main()
{ do
{
int i = 0;
printf("1.Start the game\n");
printf("2.Quit the game\n");
printf("Please enter your options->");
scanf("%d", &i);
switch (i)
{
case 1:
game(); //game()函数为游戏过程框架
break;
case 2:
return 0;
default:
printf("Input error,please enter again!\n");
break;
}
} while(1);
}
  • 设计游戏过程框架
void game()
{
initBoard();
srand((unsigned)time(NULL)); //生成随机种子,后面需要生成随机坐标
char temp = ' '; //定义一个字符变量,用于接收后面判断函数返回值,用于决定游戏胜负
do
{
printBoard(); //打印棋盘的函数
userPlay(); //玩家下棋的函数
temp = judge(); //判断游戏是否分出胜负
if (temp != ' ')
break;
robotPlay(); //电脑下棋的函数
temp = judge();
} while (temp == ' ');
printBoard();
switch (temp)
{
case '@':
printf("User WIN!\n");
break;
case '$':
printf("Bobot WIN!\n");
break;
case '*':
printf("Dogfall !\n");
break;
dafault:
break;
}
}
  • 设计棋盘样式

    有兴趣的可以搞的更加花里胡哨,这里草草了事,呸,简单设计一下 哈
//##########
// | |
//_|_|_
// | |
//_|_|_
// | |
//##########
  • 打印棋盘

    重点就在这了,棋盘设计的再牛逼,也得能打印出来才行

    这里棋盘设计的比较简易,打印起来也比较简单,关键是思路要清晰
void printBoard()
{
printf("##########\n");
int i = 0,j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (j != 2)
{
printf("%c|",board[i][j]);
}
else
printf("%c\n",board[i][j]); }
if (i != 2)
printf("_|_|_\n");
}
printf("##########\n");
}
  • 玩家下棋

    本人习惯用界面编程的坐标系表示坐标,因此下面赋值时横坐标和纵坐标倒过来了
void userPlay()
{
printf("Please enter coordinates->");
int x = 0,y = 0;
while(1)
{
scanf("%d %d", &x, &y);
if (x > 0 && x < 4 && y > 0 && y < 4)
{ if (board[y - 1][x - 1] == ' ')
{
board[y - 1][x - 1] = '@';
break;
}
else
printf("There are chess pieces here,please enter again!->");
}
else
printf("Input error,please enter again!->");
}
}
  • 电脑下棋

    这里关键是 要生成可行的坐标,以及随机数的生成
void robotPlay()
{
int i = 0, j = 0;
while (1)
{
i = rand() % 3;
j = rand() % 3;
if (board[i][j] == ' ')
{
board[i][j] = '$';
break;
}
} }
  • 判断游戏胜负

    这里就到了最难分析的一部分了

    废话不多说,直接看代码
char judge()
{
int i = 0, j = 0;
//判断两条对角线 对i j 的值不做带动,所以放在前面
if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')
return board[i][j];
if (board[i][j + 2] == board[i + 1][j + 1] && board[i][j + 2] == board[i + 2][j] && board[i][j] != ' ')
return board[i][j + 2];
//依次判断三行、三列
for (i = 0,j = 0; j < 3; j++)
{
if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] != ' ')
return board[i][j];
}
for (i = 0,j = 0; i < 3; i++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] != ' ')
return board[i][j];
}
//判断棋盘是否满了(平局)
for (i = 0; i < 3; i++)
{
for (j = 0;j < 3; j++)
{
if (board[i][j] == ' ')
return board[i][j];
}
}
//如果没出现以上情况,随便返回一个不同符号,使游戏继续进行
return '*'; }

源代码链接(Github)

C语言数组实现三子棋的更多相关文章

  1. c语言小游戏-三子棋的完成

    三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...

  2. c语言实现:三子棋

    问题描述:两个游戏者在3*3棋盘里轮流作标记,如果一个人在行,列或者两个对角线可以作三个标记,则为获胜. 我们首先得打印菜单供玩家选择(可以选择玩游戏或者退出游戏) void menu() { pri ...

  3. 用c语言实现三子棋

    1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...

  4. C语言简易三子棋

    这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...

  5. 51Nod:1995 三子棋

    1995 三子棋  题目来源: syu校赛 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 小的时候大家一定玩过"井"字棋吧.也就是在 ...

  6. React + Ts 实现三子棋小游戏

    在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少(假设你有react基础,没有也行,只要你会三大框架的任意一种,上手react不难) 游戏规则 双方各执一 ...

  7. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  8. C语言 数组 列优先 实现

    C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ...

  9. C语言 数组 行优先 实现

    C语言数组结构行优先顺序存储的实现 (GCC编译). /** * @brief C语言 数组 行优先 实现 * @author wid * @date 2013-11-02 * * @note 若代码 ...

随机推荐

  1. 【springcloud】服务熔断与降级(Hystrix)

    转自:https://blog.csdn.net/pengjunlee/article/details/86688858 服务熔断 服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的 ...

  2. spring加载Bean的解析过程(二)

    1.例如: BeanFactory bf = new XmlBeanFactory(new ClassPathResource("spring.xml")); User user ...

  3. 模拟文件上传(三):使用apache fileupload组件进行文件批量上传

    其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...

  4. MediaWiki 语法简介

    本文尚在完善中... 图片 图片官方教程 图文并茂的内容读起来总是更加舒服,让我们在wiki里引入图片. 内部图片 上传图片 点击右侧上传文件,上传文件后会获得文件名 编辑图片 文件上传后在编辑框,如 ...

  5. PS-头发丝抠图

    [PS版本]Photoshop CS5 [主题]头发丝抠图 [操作步骤] 第一步:打开待处理图片,复制图层: 第二步:快速选择工具选择主体(也可用魔术棒用具选择背景色,然后反向): 第三步:点击&qu ...

  6. 移动端 uni-app 滑动事件 精确判断手指滑动方向

    移动端根据手指滑动操作判断滑动方向 设计思路: 1.根据移动端touchstart和touchend方法获取手指触摸屏幕的开始坐标和结束坐标 2.根据两个坐标计算与水平方向的夹角 3.根据夹角判断当前 ...

  7. QT程序打包成多平台可执行文件

    一.简述 QT项目开发完成后,需要打包发布程序,在实际生产中不可能把源码发给别人,所以需要将源码打包正可执行文件或者安装程序. 二.设置应用图标 把 ico 文件放到源代码目录下,在QT项目中的'.p ...

  8. aes加解密后续问题contentType不是application/json时候后台解析请求对象request

    一.post请求的三种content-type 1.application/x-www-form-urlencoded 主要用于如下:1.1: 最常见的POST提交数据方式.1.2:原生form默认的 ...

  9. outerHTML和outerText的赋值是异步的

    用JavaScript操作DOM时,经常有生成复杂HTML结构的需求.此时,通常不是用标准DOM接口(如createElement().setAttribute().append()等)来语句式地生成 ...

  10. 我用MRS-ClickHouse构建的用户画像系统,让老板拍手称赞

    摘要:在移动互联网时代,用户数量庞大,标签数量众多,用户标签的数据量巨大.用户画像系统中,对于标签的存储和查询,不同的企业有不同的实现方案.当前主流的实现方案采用ElasticSearch方案.但基于 ...