井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

很简单,就是在画一个井图形里面画符号,谁先到3个就赢了.

试想一下,我们第一步肯定是需要读入输入的符号,我们用 X  和  O  代替.

那记录判断我们是否赢了的方法, 需要用到数组和遍历

然后就是判断结果.就可以了.

下面开始实施阶段:

按照我们理想化的步骤来实现

第一步

我们是想要如图的图案,那就输入回车和制表符,很简单,但是不定长的数字就不好控制了,所以我们用

for循环依次输出:

printf("\t 0 \t 1 \t 2 \t\n\n");for(int i=0;i<3;i++){printf(" %d\t ___\t___\t___\t\n\n",i);}

第二步:实现输入字符

需要我们用数组保存我们输入的坐标地址

定义数组

int board[size][size];

等玩家输入对应坐标后,对二维数组的值进行对应赋值,

printf("玩家一请输入坐标\n");scanf("%d %d",&i,&j);board[i][j]=1;printf("请玩家二输入坐标\n");scanf("%d %d",&i,&j);board[i][j]=0;

我们会根据对应的数组的值进行遍历,是我们需要的就赋值对应图形的形状  X   O

遍历的话都是一样的,同样道理,这里列出来一个

for(int i=0; i<size;i++){for(int j=0;j<size; j++ ){if(board[i][j]==1){printf("_X_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}    }else if(board[i][j]==-1){printf("___");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}else if(board[i][j] == 0){printf("_O_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}}}

根据不同的数,进行不同的赋值

然后我们可以根据输入对应的坐标进行游戏了

第三步:判断输赢家. 

那如何让电脑判定谁赢了呢?

接下来,就是遍历,计数每一行,每一列,正对角线,副对角线是否出现同样图案一条线的了,玩家一先划

,接着玩家二画图案.

我们可以根据玩家输入的数字进行对对应的二维数组赋值,然后分三次遍历计数,

第一次,先确定一行,遍历列,这样就把每一行便利判断完了

 //检查行for (int i=0; i<size ; i++ ){numofo=0;numofx=0;for( j=0; j<size; j++ ){if( board[i][j] == 1){numofx++;// printf("numofx的值是:%d\n",numofx);}else if(board[i][j]==0){numofo++;//  printf("numofo的值是:%d\n",numofo);}else{}}if(numofo == size){result = 0;cnt_o++;} else if(numofx == size) {result =1;cnt_x++;} else{result =-1;}}

第二次,和第一次差不多,调换了以下顺序,先确定列,遍历行,逐渐加一,直到把所有的列遍历完

//检查列for( j=0; j<size ; j++){numofo = numofx = 0;for( i=0; i<size; i++){if( board[i][j] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if(numofo == size){result = 0;cnt_o++;  }else if(numofx == size){result = 1;cnt_x++;}}

第三次,正对角线

每次的行号和列号是相等的

//正对角线numofo = numofx = 0;for(i=0; i<size; i++){if( board[i][i] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if( numofo == size){result = 0;cnt_o++;}else if( numofx == size){result = 1;cnt_x++;}//  printf("3.检查的正对角线\n cnt_o值是:%d\n cnt_x值是:%d\n",cnt_o,cnt_x);//斜对角线numofo = numofx = 0;for( i=0; i<size; i++ ){if( board[i][size-i-1] == 1){numofx++;}else if( board[i][size-i-1] == 0){numofo++;}}if( numofo == size){result = 0;cnt_o++;}else if(numofx == size){result = 1;cnt_x++;}

第四次,斜对角线

和正对角线不同的是, 斜对角线对应数组行列不一样.

具体的话,验算一下,相对于正对角线,加了一个size,但是我们是从0计算坐标的,所以再减去1,对比一下, 就知道了:

board[i][size - i - 1]

numofo = numofx = 0;for( i=0; i<size; i++ ){if( board[i][size-i-1] == 1){numofx++;}else if( board[i][size-i-1] == 0){numofo++;}}if( numofo == size){result = 0;cnt_o++;}else if(numofx == size){result = 1;cnt_x++;}

检查完了后,如何判断是否够一条线呢?  就是在每次判断同样图案后,加一个计数器

当等于一条线的长度时,就对对应的数加一,这样我们就可以判断, 游戏是否结束, 并且谁获胜,或者是平局了

if( numofo == size){
            result = 0;
            cnt_o++;
        }else if(numofx == size){
            result = 1;
            cnt_x++;
        }

第六步:就是判断游戏结束

当游戏的九个空格输入完前,  判断游戏是否结束,  我们的游戏是否继续,我们使用嵌套

do{

}

while(cnt_o==0 && cnt_x==0 &&count<(size*size-1)/2);

第七步:  根据具体计数器的结果, 判断谁胜谁负

if(cnt_x==1 && cnt_o==0&& count<=(size*size-1)/2){
        printf("恭喜玩家一,你赢啦!\n");
    }else if(cnt_o==1 && cnt_x==0){
        printf("恭喜玩家二,你赢啦!\n");
    }else if(cnt_o==0 &&cnt_x==0 && count==(size*size-1)/2){
        printf("恭喜双方打成平局,以和为贵!");
    }else if(cnt_o==1 &&cnt_x==1 ){
        printf("恭喜你们双赢啦!\n");
        printf("请按回车键继续:\n");
        getchar();getchar();
        printf("开个玩笑,其实是 玩家一 赢了!\n");
    }

第八步,其实现在大概已经实现了

但是还有几个小改进,需要注意一下

①如果我们想要让玩家每次输入对应坐标后,  就可以看见对应符号在数组中的位置,  就需要刚开始第一部输入的表格, 然后我们接着遍历输入对应的符号就可以了.

②因为我们判断游戏结束, 是当两个人都输入完后才判断的,  有一种情况是,  玩家一最后才输入完,

然后格子占满了,  玩家二不用输入了,仍然会出现让玩家二输入的情况.

我们的解决办法是, 在玩家二输入后边 加了一个计数器,  当

while(cnt_o==0 && cnt_x==0 &&count<(size*size-1)/2);

当玩家二输入4次时候,  如果判断没有玩家赢的话,  需要玩家一接着输入一次

所以我们 在玩家二输入四次的时候,  就跳出循环, 给玩家一,  单独来一个套娃,  (这里作者能力有限,只能套娃)  ,就是把前面的重新拷贝一下,  把玩家二的删除救行了.   这里就解决了最后一次不能输入的问题

源代码奉上:

#include <stdio.h>int main(int argc, char *argv[])
{const int size = 3;int board[size][size];int i,j;int numofx=0;int numofo=0;int result=-1; //-1:没人赢,1:x赢, 0:0赢int cnt_o=0;int cnt_x=0;int count=0;for( i=0; i<size; i++){for( j=0; j<size; j++){board[i][j]=-1;}}// printf("%d",board[2][2]);//读入矩阵printf("\t 0 \t 1 \t 2 \t\n\n");for(int i=0;i<3;i++){printf(" %d\t ___\t___\t___\t\n\n",i);}do  {//printf("游戏还未结束,请继续:\n");printf("玩家一请输入坐标\n");scanf("%d %d",&i,&j);printf("\n");printf("\t");for(int k=0;k<size;k++){printf("%d \t",k);}//   printf("\t 0 \t 1 \t 2 \t");printf("\n\n");printf(" 0 \t");board[i][j]=1;int ope=0;for(int i=0; i<size;i++){for(int j=0;j<size; j++ ){if(board[i][j]==1){printf("_X_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}    }else if(board[i][j]==-1){printf("___");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}else if(board[i][j] == 0){printf("_O_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}}}//    printf("board[%d][%d]=%d\n",i,j,board[i][j]);printf("请玩家二输入坐标\n");scanf("%d %d",&i,&j);count++;printf("\n");printf("\t");for(int k=0;k<size;k++){printf("%d \t",k);}// printf("\t 0 \t 1 \t 2 \t");printf("\n\n");printf(" 0 \t");board[i][j]=0;int opes=0;for(int i=0; i<size;i++){for(int j=0;j<size; j++ ){if(board[i][j]==1){printf("_X_");opes++;if(opes%size==0){if(opes/size==size){printf("\n\n\n");}else if(opes/size<size){printf("\n\n\n %d\t",opes/size);}}else{printf("\t");}  }else if(board[i][j]==-1){printf("___");opes++;if(opes%size==0){if(opes/size==size){printf("\n\n\n");}else if(opes/size<size){printf("\n\n\n %d\t",opes/size);}}else{printf("\t");}}else if(board[i][j] == 0){printf("_O_");opes++;if(opes%size==0){if(opes/size==size){printf("\n\n\n");}else if(opes/size<size){printf("\n\n\n %d\t",opes/size);}}else{printf("\t");}}}}//  printf("board[%d][%d]=%d\n",i,j,board[i][j]);//  printf("%d",board[2][2]);//检查行for (int i=0; i<size ; i++ ){numofo=0;numofx=0;for( j=0; j<size; j++ ){if( board[i][j] == 1){numofx++;//  printf("numofx的值是:%d\n",numofx);}else if(board[i][j]==0){numofo++;//  printf("numofo的值是:%d\n",numofo);}else{}}if(numofo == size){result = 0;cnt_o++;} else if(numofx == size) {result =1;cnt_x++;} else{result =-1;}}//  printf("1.检查的行\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);//检查列for( j=0; j<size ; j++){numofo = numofx = 0;for( i=0; i<size; i++){if( board[i][j] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if(numofo == size){result = 0;cnt_o++;  }else if(numofx == size){result = 1;cnt_x++;}}//    printf("2.检查的列\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);//正对角线numofo = numofx = 0;for(i=0; i<size; i++){if( board[i][i] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if( numofo == size){result = 0;cnt_o++;}else if( numofx == size){result = 1;cnt_x++;}//   printf("3.检查的正对角线\n cnt_o值是:%d\n cnt_x值是:%d\n",cnt_o,cnt_x);//斜对角线numofo = numofx = 0;for( i=0; i<size; i++ ){if( board[i][size-i-1] == 1){numofx++;}else if( board[i][size-i-1] == 0){numofo++;}}if( numofo == size){result = 0;cnt_o++;}else if(numofx == size){result = 1;cnt_x++;}//    printf("4.检查的斜对角线\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);}while(cnt_o==0 && cnt_x==0 &&count<(size*size-1)/2);//int count=9;if(cnt_x==0 && cnt_o==0 && count==(size*size-1)/2){do  {//printf("游戏还未结束,请继续:\n");printf("玩家一请输入坐标\n");scanf("%d %d",&i,&j);printf("\n");printf("\t");for(int k=0;k<size;k++){printf("%d \t",k);}//             printf("\t 0 \t 1 \t 2 \t");printf("\n\n");printf(" 0 \t");board[i][j]=1;int ope=0;for(int i=0; i<size;i++){for(int j=0;j<size; j++ ){if(board[i][j]==1){printf("_X_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}    }else if(board[i][j]==-1){printf("___");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}else if(board[i][j] == 0){printf("_O_");ope++;if(ope%size==0){if(ope/size==size){printf("\n\n\n");}else if(ope/size<size){printf("\n\n\n %d\t",ope/size);}}else{printf("\t");}}}}//检查行for (int i=0; i<size ; i++ ){numofo=0;numofx=0;for( j=0; j<size; j++ ){if( board[i][j] == 1){numofx++;//   printf("numofx的值是:%d\n",numofx);}else if(board[i][j]==0){numofo++;//  printf("numofo的值是:%d\n",numofo);}else{}}if(numofo == size){result = 0;cnt_o++;} else if(numofx == size) {result =1;cnt_x++;} else{result =-1;}}//  printf("1.检查的行\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);//检查列for( j=0; j<size ; j++){numofo = numofx = 0;for( i=0; i<size; i++){if( board[i][j] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if(numofo == size){result = 0;cnt_o++;  }else if(numofx == size){result = 1;cnt_x++;}}//    printf("2.检查的列\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);//正对角线numofo = numofx = 0;for(i=0; i<size; i++){if( board[i][i] == 1){numofx ++;}else if(board[i][j]==0) {numofo ++;}}if( numofo == size){result = 0;cnt_o++;}else if( numofx == size){result = 1;cnt_x++;}//   printf("3.检查的正对角线\n cnt_o值是:%d\n cnt_x值是:%d\n",cnt_o,cnt_x);//斜对角线numofo = numofx = 0;for( i=0; i<size; i++ ){if( board[i][size-i-1] == 1){numofx++;}else if( board[i][size-i-1] == 0){numofo++;}}if( numofo == size){result = 0;cnt_o++;}else if(numofx == size){result = 1;cnt_x++;}//    printf("4.检查的斜对角线\n cnt_o值是:%d\ncnt_x值是:%d\n",cnt_o,cnt_x);}while(cnt_o==0 && cnt_x==0 &&count<(size*size-1)/2);}if(cnt_x==1 && cnt_o==0&& count<=(size*size-1)/2){printf("恭喜玩家一,你赢啦!\n");}else if(cnt_o==1 && cnt_x==0){printf("恭喜玩家二,你赢啦!\n");}else if(cnt_o==0 &&cnt_x==0 && count==(size*size-1)/2){printf("恭喜双方打成平局,以和为贵!");}else if(cnt_o==1 &&cnt_x==1 ){printf("恭喜你们双赢啦!\n");printf("请按回车键继续:\n");getchar();getchar();printf("开个玩笑,其实是 玩家一 赢了!\n");}return 0;
}

井字棋(C语言实现,可运行玩耍,自行编写)相关推荐

  1. 三子棋_井字棋(C语言实现)

    率先完成三子就是胜利! 具体实现.功能函数定义.函数声明分别放在了三个文件中. 从main函数入口开始. 啥也也不说了,都在代码里了 运行截图: 一个运行结果: 函数声明在game.h文件 #prag ...

  2. C语言小游戏->井字棋

    井字棋想必大家都玩过,今天教大家一个用C语言写一个井字棋小游戏 这个游戏大致可以分为两个部分:游戏菜单和游戏过程. 首先就是创建一个menu()函数来写菜单页面 这里出现了不同指令对应的结果,即输入1 ...

  3. C语言实现小游戏之井字棋

    目录 前言 一.井字棋游戏的主流程 二.游戏部分 1.游戏函数 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋(两个难度等级) 6.判断游戏是否结束 三. 源码展示 总结 前言 这是我在学习 ...

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

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

  5. 从井字棋程序总结C语言初学的知识

    #井字棋程序的可实现性以及实现思路# 目录 #井字棋程序的可实现性以及实现思路# 1.程序的可实现性 2.实现程序的思路 菜单界面 游戏主体 棋盘的显示 玩家下棋子 电脑随机下棋子 判断输赢 1.程序 ...

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

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

  7. C语言第十课:编写井字棋游戏(综合练习1)

    目录 前言: 一.文件建立: 1.头文件game.h: 2.函数定义文件game.c: 3.工程测试文件test.c: 二.编写井字棋游戏: 1.程序整体执行思路: 2.menu菜单函数实现: 3.g ...

  8. C语言实现井字棋游戏(含算法优化)

    目录 序言 代码1 小结 算法优化 代码2 总结 序言 井字棋 英文名叫Tic-Tac-Toe 想必大家对这个小游戏都不陌生了 无论是小时候课堂上被画的全是"井"字的草稿纸 还是长 ...

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

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

最新文章

  1. 麦克风阵列降噪_黄鹂智声降噪耳机E100u,与喧嚣说再见
  2. 帝国cms7.5电脑端手机端多终端解决方案之选择哪种方案
  3. java handler使用方法_Android中Handler的使用方法及实例(基础回顾)
  4. centos 7挂载windows共享目录
  5. linux如何自动调jiaob,最牛B的 Linux Shell 命令 系列连载(四)
  6. 数学建模 整数规划的基本原理和标准形式
  7. 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
  8. Hibernate之关联映射
  9. python zip dict函数
  10. Redis的几种拓展方案,你都清楚吗?
  11. ASP.net 连接interbase数据库
  12. module 'tensorflow.python.keras.backend' has no attribute 'get_graph'
  13. 如何使用Movavi Slideshow Maker进行幻灯片制作?
  14. 怎么用计算机算全勤奖,全勤奖计算与发放细则
  15. Java多线程和并发(一),进程与线程的区别
  16. 西南交大数据结构c语言版集合的并,交实验报告答案,数据结构(C语言版)实验报告 集合的交并差...
  17. photoshop 调用扫描仪扫描证件至电脑
  18. stm32串口通信以及C语言程序里的内存分配
  19. python是一门跨平台语言_python属于跨平台语言码
  20. (附源码)springboot跨境电商系统 毕业设计 211003

热门文章

  1. 2015百度之星复赛(hdu5258 - 5262)
  2. 计算机二级C语言编程题解读:计算学生成绩的标准差
  3. 简述对css盒子模型的理解_css 盒子模型理解
  4. 链接脚本lds 相关的知识
  5. Android 音视频开发(三) -- Camera2 实现预览、拍照功能
  6. activiti 撤销
  7. Dialogue Summarization with Supporting Utterance Flow Modeling and Fact Regularization阅读笔记
  8. nike air max polska 2016 ważne jest
  9. Daily English - ... is driving me up a wall.
  10. 四个数列 || 二分