前言

井字棋是我们小时候常玩的一种简单的小游戏,今天就让我们来实践一下自己做出一个井字棋。

目录

整体思路

打印菜单

初始化棋盘

打印棋盘

玩家移动

电脑移动

判断输赢

整合

项目整体


整体思路

有一句话小黄非常赞同,”敲代码是一个项目中最简单的步骤,单纯的敲代码就和放积木一样没意思,只有决定如何去拼这个积木的时候才是最有挑战性的“。所以在完成类似的项目前,我们首先要制定一个整体的思路,然后按照框架一步步实现我们所需要的功能,才能做到快速高效的完成代码。

打印菜单

首先为了增加项目的可读性,我们可以简单加一个菜单,让玩家决定是否开始游戏,代码如下:

void meun()
{printf("------------------------------\n");printf("----------1.游戏开始----------\n");printf("----------0.游戏结束----------\n");printf("------------------------------\n");printf("请选择->");
}

初始化棋盘

井字棋是一个 3  * 3 的棋盘,那么为了去表达棋子有哪些,我们采用一个字符类型的二维数组来记录当前其棋盘内的棋子。而为了可以重复开始游戏,我们每次进行完一句游戏也需要将棋盘清空,所以设置一个可以清空棋盘的函数,而之后需要打印棋盘,故初始化为空格字符,具体如下:

void IntBoard(char arr[lie][hang], int Lie, int Hang)
{int m, n;for (m = 0; m < Lie; m++){for (n = 0; n < Hang; n++){arr[m][n] = ' ';}}
}

打印棋盘

为了增加可玩性,我们肯定不希望每一次下棋都需要我们自己去记住位置,因此需要设置一个可以打印当前棋盘的函数,在每次下棋之后都打印一次棋盘,具体代码如下:

void DisplayBoard(char arr[lie][hang], int Lie, int Hang)
{int  m, n;for (m = 0; m < Lie; m++){for (n = 0; n < Hang; n++){printf(" %c ", arr[m][n]);if (n < Hang - 1)printf("|");}printf("\n");if (m < Lie - 1)printf("---|---|--- \n");}
}

打印效果如图(棋盘为空的情况下):

玩家移动

当玩家开始下棋的时候我们利用 ” * “ 来代表一个棋子,但是众所周知,井字棋不一定每次都可以分出胜负,也就是说,我们还需要考虑到期盼已经被下满的情况,因此玩家下棋的时候我们总共要考虑到一下几点:

1/ 下子的地方是否有效?即是否超出界外或者已经有棋子存在。

2/ 棋盘上是否还能落子?即棋盘上的棋子数量少于等于九个。

具体代码实现如下:

void playermove(char arr[lie][hang],int *n) // n利用传址调用,实现对整个棋子数量的改变
{printf("轮到您下子了->");int x, y;while (1){scanf("%d%d", &x, &y);if (arr[x - 1][y - 1] == ' '){arr[x - 1][y - 1] = '*';++(*n);break;}elseprintf("你妈的看不到那里不能走吗?\n");}
}

电脑移动

我们在此采用利用生成随机数的方式来模拟电脑下棋,当然这种方式下的电脑会显得特别的”蠢“。但是无妨,在此我们主要展示如何解决井字棋这样一个项目,至于如何提升电脑获胜概率可以自己思考一下。随机数我们采用srand函数来设置种子。

在此值得注意的是,种子的设置需要放在函数之外,即游戏开始之前,这样可以避免重复设置种子导致电脑下棋时间很长,因为我们随机数也是需要判断是否可以落子的,因此随机数有可能需要多次生成,若每次生成都设置一次种子,将造成很多时间浪费,具体代码实现如下:

void computermove(char arr[lie][hang],int *a)
{int m, n;printf("轮到电脑下子了->\n");Sleep(2000);while (1){m = rand() % 3;n = rand() % 3;if (arr[m - 1][n - 1] == ' '){arr[m - 1][n - 1] = '#';++(*a);break;}}
}

判断输赢

判断输赢的方式还是很简单的,判断每一行每一列以及两个斜向是否是同一种棋子即可,当我们发现是同一种棋子的时候,用一个char类型的变量记录下这个棋子,然后对其进行判断即可,同时判断是否平局也要在这一步进行,当棋子数量达到9且没有满足前面的输赢的条件时,我们就选择输出平局,并结束此局游戏,具体代码实现如下:

void iswin(char arr[lie][hang], int *n)
{int i;char k = ' ';for (i = 0; i < lie; i++){if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' '){k = arr[i][0];break;}else if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' '){k = arr[0][i];break;}else if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' '){k = arr[1][1];break;}else if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' '){k = arr[1][1];break;}}if (k == '*'){printf(" You Win! \n");*n = 10;}else if (k == '#'){printf(" Compuer Win! \n");*n = 10;}else if (k == ' ' && *n == 9){printf(" 平局 \n");*n = 10;}
}

整合

至此,整个游戏所需要的基本的函数我们已经全部完成,接下来,我们利用一个game函数来表示开始进行的游戏,并且把这些函数整合起来 ,同时进行一些简单的小调整,列如先前判断输赢是以函数实现的,不能直接退出game这个函数,因此单独在每次判断输赢之后加一个判断棋子数量是否未10,而棋子数量为10只有判断输赢条件成立之后对其赋值才可以实现。具体代码实现如下:

void game()
{char Board[lie][hang];int  n = 0;char m = 0;IntBoard(Board, lie, hang);DisplayBoard(Board, lie, hang);while (1){playermove(Board, &n);DisplayBoard(Board, lie, hang);iswin(Board, &n); if (n == 10)break;computermove(Board, &n);DisplayBoard(Board, lie, hang);iswin(Board, &n);if (n == 10)break;}
}

项目整体

小黄在这里采用了函数分开的写法,即多文件的写法,因此将其上传到了码云,可自取,地址如下:Tic Tac Toe · 濡白/Some topics - 码云 - 开源中国 (gitee.com)

Tic Tac Toe简单井字棋相关推荐

  1. python实现简单小游戏_python实现简单井字棋小游戏

    #Tic-Tac-Toe 井字棋游戏 #全局常量 X="X" O="O" EMPTY=" " #询问是否继续 def ask_yes_no( ...

  2. python井字棋_python实现简单井字棋游戏

    井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子 ...

  3. python写井字棋_python实现简单井字棋游戏

    #!/usr/bin/env python3 # -*- coding:utf-8 -*- u''' Created on 2019年4月13日 @author: wuluo ''' author = ...

  4. Java实现简单井字棋小游戏代码实例

    Java第一次实验,老师让做一个井字棋,电脑随机下棋. 然后就想能不能聪明一点,可以判断出走哪一步棋:然后只能做到不会输,还是不够聪明,只能呆板地堵住用户,smartRobot的第三个判断逻辑找不到最 ...

  5. python设计小游戏谁先走到17_python实现简单井字棋小游戏

    #Tic-Tac-Toe 井字棋游戏 #全局常量 X="X" O="O" EMPTY=" " #询问是否继续 def ask_yes_no( ...

  6. Java实现简单井字棋(OX游戏)V2.0

    简介 还是承接着上次的OX游戏,这次老师提的要求奇奇怪怪的,说实话真的挺费解的,但多读几遍以后要抓住几个关键点,"左上角"."绘制".看刚好学了paint嘛,所 ...

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

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

  8. python二维游戏示例_Python实现的井字棋(Tic Tac Toe)游戏示例

    本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏.分享给大家供大家参考,具体如下: 说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码 ...

  9. python井字棋游戏代码_Python实现的井字棋(Tic Tac Toe)游戏示例

    Python实现的井字棋(Tic Tac Toe)游戏示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现的井字棋(Tic Tac Toe)游戏示 ...

  10. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

最新文章

  1. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path
  2. 一起学nRF51xx 23 -  s130蓝牙API介绍
  3. 我是该高兴呢还是悲伤呢?
  4. 小程序 bindtouchmove 使用拖动按钮 页面跟着滑动并拖动卡顿感 问题
  5. 什么是页损坏 mysql_MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题...
  6. UML--交互图(时序图、协作图)
  7. PyTorch 多机多卡训练:分布式实战与技巧
  8. [C++][基础]8_容器
  9. 应用--学生宿舍卫生管理系统
  10. paperwhite3翻页_亚马逊Kindle Paperwhite 3G / Wi-Fi评论
  11. 虚幻4英雄联盟模型分享——荆棘之刺婕拉
  12. c艹入门->入土 ( 二 )
  13. 五、完成Teigha.net对CAD文件中的Entity实体进行编辑修改功能,包括字体,样式,颜色,备注XData等属性
  14. ESAYUI filebox 隐藏
  15. 体育赛事系统设计方案
  16. 什么是PUGC、UGC、PGC、OGV、PUGV,了解视频平台运营模式
  17. 品牌连锁店5G/4G无线组网方案
  18. 螺旋线java_java 小测试,关于画螺旋线的问题.
  19. Docker自定义镜像上传阿里云
  20. 发个谷歌,百度网盘,谷歌学术可用的网站

热门文章

  1. github python100天_GitHub - ychgithub/Python-100-Days: Python - 100天从新手到大师
  2. Java开发者,我到底要不要学大数据开发?
  3. sudoku_solver :数独解题器
  4. VR,“看房”容易“卖房”难
  5. amoeba mysql mmm_MMM+Amoeba搭建MySQL高可用负载均衡群集
  6. VScode前进后退快捷键
  7. illumina 肿瘤分析流程
  8. Mac工具 shimo 无法正常使用(macOS 系统版本问题)
  9. YOLOX论文逐句翻译
  10. perl安装的详细步骤