三字棋优化 ,主要是针对棋局大小及方式的优化,可实现ROW*COL个格子,ZI字棋。也即棋盘方式,与下法都可以变化。

其中game.c中分别写了纯三字棋>优化>ROW*COL三字棋>优化>ROW*COL个格子ZI字棋的三种写法。

运行过程如下

主程序代码:test.c#pragma warning(disable : 4996)
#pragma warning(disable : 6031)#include "game.h"
#include "menu.h"int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择->");scanf("%d", &input);clc();switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误请重新输入\n");break;}} while (input);return 0;
}
菜单栏头文件menu.h#ifndef __MENU_H__
#define __MEBU_H__void menu();#endif 
菜单栏c文件menu.c#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#include "game.h"
void menu()
{printf("****************************************\n");printf("*******棋盘模式%d行,%d列,%d字棋*********\n", ROW, COL, ZI);printf("********  1:play   0:exit  ***********\n");printf("****************************************\n");
}
游戏程序代码,头文件game.h#pragma warning(disable : 4996)
#pragma warning(disable : 6031)#ifndef __GAME_H__
#define __GAME_H__#define ROW 3   //3行
#define  COL 5  //5列
#define  ZI 3   //后续需传参几字棋
#include "stdio.h"
#include "stdlib.h"
#include "time.h"void game();
void InitChess(char chess[ROW][COL]);
void DisplayChess(char chess[ROW][COL]);
void PlayerMove(char chess[ROW][COL]);
void ComputerMove(char chess[ROW][COL]);
void clc();                   //清除多余字符
char IsWin(char chess[ROW][COL]);
int IsFull(char chess[ROW][COL]);#endif // !__GAME_H__
游戏程序代码,c文件game.c#pragma warning(disable : 4996)
#pragma warning(disable : 6031)#include "game.h"void game()
{char ret;char chess[ROW][COL]; InitChess(chess);     //初始化棋盘DisplayChess(chess);  //输入棋盘while (1){PlayerMove(chess);    //玩家下棋DisplayChess(chess);ret=IsWin(chess);if(ret!= 'C')break;ComputerMove(chess);   //电脑下棋DisplayChess(chess);ret = IsWin(chess);if (ret != 'C')break;}if (ret == '*')printf("玩家赢!\n");else if (ret == '#')printf("电脑赢!\n");elseprintf("平局!\n");
} //player win  return '*'
//computer win return '#'
//平局 return  'Q'
//继续 return 'C'void InitChess(char chess[ROW][COL])
{int i, j;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){chess[i][j] = ' ';}}
}void DisplayChess(char chess[ROW][COL])
{int i, j;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){printf(" %c ", chess[i][j]);if(j<COL-1)printf("|");}printf("\n");for (j = 0; j < COL; j++){if (i == ROW - 1)break;printf("---");if (j < COL - 1)printf("|");} printf("\n");}
}void clc()
{int ch = 0;while ((ch = getchar()) != '\n'){;}
}void PlayerMove(char chess[ROW][COL])
{printf("输入坐标形式例如>>3,4<<,表示第3行第4列\n");int i, j;while (1){printf("玩家下棋请输入:>");scanf("%d,%d", &i, &j);clc();if (i >= 1 && i <= ROW && j>=1 && j <= COL){if (chess[i - 1][j - 1] == ' '){chess[i - 1][j - 1] = '*';break;}elseprintf("此处已有棋子,换一处吧~\n");}elseprintf("输入格式错误,请重新输入!\n");}
}void ComputerMove(char chess[ROW][COL])
{printf("电脑下棋:>\n");while (1){int x = rand() % ROW;int y = rand() % COL;if (chess[x][y] == ' '){chess[x][y] = '#';break;}}
}char IsWin(char chess[ROW][COL])
{int row,col,x,i,j;//纯纯的3字棋//横三行判断//for (row = 0; row < ROW; row++)//{//  if (chess[row][0] == chess[row][1] && chess[row][0] == chess[row][2] && chess[row][1] != ' ')//  {//     return chess[row][0];// }//}竖三行判断//for (col = 0; col < COL; col++)//{//   //  if (chess[0][col] == chess[1][col] && chess[0][col] == chess[2][col] && chess[2][col]  != ' ')// {//     return chess[0][col];// }//}两个对角线//if (chess[0][0] == chess[1][1] && chess[0][0] == chess[2][2] && chess[2][2] != ' ')// return chess[0][0];//if (chess[2][0] == chess[1][1] && chess[2][0] == chess[0][2] && chess[0][2] != ' ')//   return chess[0][0];/**************************************************************************************************************************/优化1   N行N列,3字棋判断列连续////for (i = 0; i < ROW-2; i++)//{// for (j = 0; j < COL; j++)//   {//     if (chess[i][j] == chess[i + 1][j] && chess[i][j] == chess[i + 2][j] && chess[i][j] != ' ')//          return chess[i][j];//   }//}判断行连续//for (j = 0; j < COL-2; j++)//{//   for (i = 0; i < ROW; i++)//   {       //      if (chess[i][j] == chess[i][j+1] && chess[i][j] == chess[i][j+2] && chess[i][j] != ' ')//          return chess[i][j];//   }//}左对角//for (i = 0; i < ROW-2; i++)//{// for (j = 0; j < COL-2; j++)// {//     if (chess[i][j] == chess[i + 1][j+1] && chess[i][j] == chess[i + 2][j+2] && chess[i][j] != ' ')//            return chess[i][j];//   }//}右对角//for (i = 2; i < ROW; i++)//{//   for (j = 0 ; j < COL-2; j++)//    {//     if (chess[i][j] == chess[i - 1][j + 1] && chess[i][j] == chess[i - 2][j + 2] && chess[i][j] != ' ')//          return chess[i][j];//   }//}/***************************************************************************************************************************///优化2   ROW行COL列,ZI字棋//判断列连续for (i = 0; i < ROW-ZI+1; i++){for (j = 0; j < COL; j++){int sum = 0;for (row = 0; row < ZI ; row++)sum += chess[i + row][j];if (sum == ZI * '*')return '*';else if (sum == ZI * '#')return '#';}}//判断行连续for (j = 0; j < COL-ZI+1; j++){for (i = 0; i < ROW; i++){int sum = 0;for (col = 0; col < ZI; col++)sum += chess[i][j+col];if (sum == ZI * '*')return '*';else if (sum == ZI * '#')return '#';}}//左对角for (i = 0; i < ROW-ZI+1; i++){for (j = 0; j < COL-ZI+1; j++){int sum = 0;for (x = 0; x < ZI; x++)sum += chess[i + x][j + x];if (sum == ZI * '*')return '*';else if (sum == ZI * '#')return '#';}}//右对角for (i = ZI-1; i < ROW ; i++){for (j = 0; j < COL - ZI + 1; j++){int sum = 0;for (x = 0; x < ZI; x++)sum += chess[i - x][j + x];if (sum == ZI * '*')return '*';else if (sum == ZI * '#')return '#';}}if (IsFull(chess) == 1)return 'Q';return 'C';
}int IsFull(char chess[ROW][COL])
{//flag适用于需要都执行完的程序,此处效率低,用return更好int i, j;
//  int flag=1;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (chess[i][j] == ' ')return 0;//          flag = 0;}}return 1;
}

C语言三字棋优化,实现ROW*COL个格子,ZI字棋相关推荐

  1. java版井字棋的设计与实现_JAVA版井字棋的设计与实现.doc

    JAVA版井字棋的设计与实现.doc 优秀论文,值得下载 优秀论文精选 JAVA版井字棋的设计不实现 仇宾 摘要井字棋是大家所熟知的一个小游戏,虽然简单,但其中包含了一些编程的基本 技巧和基本算法,本 ...

  2. 【C语言】(实例游戏)实现童年游戏——井字棋

    初学C语言,虽然学到的内容不是很多,但是有一些简单的同年游戏我们是可以实现的,接下来,我们就看一下井字棋的实现,首先创建3个文件,分别为头文件 --定义与声明 函数的实现  以及测试文件 首先我们先说 ...

  3. python井字棋如何判断输赢_Python|找出井字棋的获胜者

    井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" ...

  4. java井字棋ai_JavaScript实现一个带AI的井字棋游戏源码

    JavaScript实现一个带AI的井字棋游戏源码 发布时间:2020-09-05 00:56:12 来源:脚本之家 阅读:100 作者:小楼夜听雨QAQ 最近有一门课结束了,需要做一个井字棋的游戏, ...

  5. 用Java实现简单的井字棋程序(α-β剪枝)

    利用α-β剪枝实现井字棋程序 剪枝思路如下: α可以认为是你的收益>=α,β可以认为是你的收益<=β,当α>β的时候,收益比α要大,比β要小,显然是一个空集.所以进行剪枝. α的初始 ...

  6. 3D游戏编程与设计-井字棋

    3D游戏编程与设计-井字棋 目录 3D游戏编程与设计-井字棋 A. 简答题 1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系 ① 游戏对象 ② 资源 2. 下载几个游戏案 ...

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

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

  8. 7-5 井字棋 (15分)

    7-5 井字棋 (15分) 大佬和小白玩 "井"字棋.也就是在九宫格中,只要任意行.列,或者任意对角线上面出现三个连续相同的棋子,就能获胜.请根据棋盘状态,判断当前输赢. 输入格式 ...

  9. 一个n维井字棋的游戏

    前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计.n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵 ...

最新文章

  1. 使用分发服务器的作用
  2. v-charts修改点击图例事件,legendselectchanged
  3. AI+时代,谈谈产品经理对图像识别技术的阈值控制
  4. python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表
  5. java 接口中的成员只有静态常量和_Java中抽象类和接口的具体区别是什么?
  6. Operation not permitted - /usr/bin/xcodeproj
  7. Error running Tomcat8: Address localhost:1099 is already in use
  8. 如何快速制作漫画App?
  9. 金蝶K3后台SQL修改数据-科目余额表、科目表核算项目
  10. 病毒之Worm.Win32.AutoRun
  11. Epoll水平触发(Level Triggered)工作模式和边缘触发(Edge Triggered)工作模式区别
  12. 【网络空间安全数学基础第8章】环和域
  13. 微型计算机系统中存储容量最大的部件,微型计算机中存储容量最大的部件是什么?...
  14. Webpack安装与配置
  15. https://b23.tv/av...【相关研究】
  16. 雷达原理笔记之恒虚警概率检测
  17. 74161计数器设计十二和二十进制计数器
  18. Excel VBA下调用exe的方法
  19. 《python深度学习》学习笔记
  20. 2021CVPR-Cross Modal Focal Loss for RGBD Face Anti-Spoofing

热门文章

  1. Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序
  2. 我去拜访了IPFS的创始人 Juan Benet
  3. 个人收集的一些手机研发资料
  4. EPIC公司免费放出虚幻unreal3 游戏软件开发包 Unreal 3 Development Kit(UDK)2009
  5. 强大的抠图换背景工具
  6. 更换计算机电源线,由更换电源引发的一次理线记录
  7. javaScript的作用域、闭包
  8. 转融通证券出借业务介绍
  9. 记录一下身份证是否有效的验证方法
  10. zk - zookeeper实现分布式锁代码