C语言三字棋优化,实现ROW*COL个格子,ZI字棋
三字棋优化 ,主要是针对棋局大小及方式的优化,可实现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字棋相关推荐
- java版井字棋的设计与实现_JAVA版井字棋的设计与实现.doc
JAVA版井字棋的设计与实现.doc 优秀论文,值得下载 优秀论文精选 JAVA版井字棋的设计不实现 仇宾 摘要井字棋是大家所熟知的一个小游戏,虽然简单,但其中包含了一些编程的基本 技巧和基本算法,本 ...
- 【C语言】(实例游戏)实现童年游戏——井字棋
初学C语言,虽然学到的内容不是很多,但是有一些简单的同年游戏我们是可以实现的,接下来,我们就看一下井字棋的实现,首先创建3个文件,分别为头文件 --定义与声明 函数的实现 以及测试文件 首先我们先说 ...
- python井字棋如何判断输赢_Python|找出井字棋的获胜者
井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" ...
- java井字棋ai_JavaScript实现一个带AI的井字棋游戏源码
JavaScript实现一个带AI的井字棋游戏源码 发布时间:2020-09-05 00:56:12 来源:脚本之家 阅读:100 作者:小楼夜听雨QAQ 最近有一门课结束了,需要做一个井字棋的游戏, ...
- 用Java实现简单的井字棋程序(α-β剪枝)
利用α-β剪枝实现井字棋程序 剪枝思路如下: α可以认为是你的收益>=α,β可以认为是你的收益<=β,当α>β的时候,收益比α要大,比β要小,显然是一个空集.所以进行剪枝. α的初始 ...
- 3D游戏编程与设计-井字棋
3D游戏编程与设计-井字棋 目录 3D游戏编程与设计-井字棋 A. 简答题 1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系 ① 游戏对象 ② 资源 2. 下载几个游戏案 ...
- python井字棋ai,python 井字棋(Tic Tac Toe)
说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...
- 7-5 井字棋 (15分)
7-5 井字棋 (15分) 大佬和小白玩 "井"字棋.也就是在九宫格中,只要任意行.列,或者任意对角线上面出现三个连续相同的棋子,就能获胜.请根据棋盘状态,判断当前输赢. 输入格式 ...
- 一个n维井字棋的游戏
前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计.n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵 ...
最新文章
- 使用分发服务器的作用
- v-charts修改点击图例事件,legendselectchanged
- AI+时代,谈谈产品经理对图像识别技术的阈值控制
- python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表
- java 接口中的成员只有静态常量和_Java中抽象类和接口的具体区别是什么?
- Operation not permitted - /usr/bin/xcodeproj
- Error running Tomcat8: Address localhost:1099 is already in use
- 如何快速制作漫画App?
- 金蝶K3后台SQL修改数据-科目余额表、科目表核算项目
- 病毒之Worm.Win32.AutoRun
- Epoll水平触发(Level Triggered)工作模式和边缘触发(Edge Triggered)工作模式区别
- 【网络空间安全数学基础第8章】环和域
- 微型计算机系统中存储容量最大的部件,微型计算机中存储容量最大的部件是什么?...
- Webpack安装与配置
- https://b23.tv/av...【相关研究】
- 雷达原理笔记之恒虚警概率检测
- 74161计数器设计十二和二十进制计数器
- Excel VBA下调用exe的方法
- 《python深度学习》学习笔记
- 2021CVPR-Cross Modal Focal Loss for RGBD Face Anti-Spoofing
热门文章
- Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序
- 我去拜访了IPFS的创始人 Juan Benet
- 个人收集的一些手机研发资料
- EPIC公司免费放出虚幻unreal3 游戏软件开发包 Unreal 3 Development Kit(UDK)2009
- 强大的抠图换背景工具
- 更换计算机电源线,由更换电源引发的一次理线记录
- javaScript的作用域、闭包
- 转融通证券出借业务介绍
- 记录一下身份证是否有效的验证方法
- zk - zookeeper实现分布式锁代码