当前位置: 首页 > article >正文

c语言 写一个五子棋

c语言

IsWin判赢

display 画 10 x 10 的棋盘

判断落子的坐标是否已有棋子

判断落子坐标范围是否超出范围

// 五子棋
#include <stdio.h>
#include <stdlib.h>// 画棋盘 10 x 10的棋盘,len为行数
void display(char map[][10], int len)
{system("clear");printf("   0 1 2 3 4 5 6 7 8 9\n");for (int i = 0; i < len; i++) {printf("%d ", i);for (int j = 0; j < 10; j++) {printf("|%c", map[i][j]);}printf("|\n");}
}// 判断是否赢棋
int IsWin(char map[][10], int len, int x, int y)
{int xx;int yy;int saves = 0;int count = 1;// 判断是否棋盘下满for (int i = 0; i < len; i++) {for (int j = 0; j < 10; j++) {if (map[i][j] == ' ') {saves += 1;}}}if (saves == 0) {printf("棋盘下满,平局!\n");return -1;}//判断赢棋,从横、纵、斜、反斜四个方向判断// 横向判断// count == 1 是因为下面 for循环判断是从坐标的横移左一个、横移右一个开始判断的for (yy = y-1; yy > -1; yy--) {if (map[x][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}for (yy = y+1; yy < 10; yy++) {if (map[x][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}if (count >= 5) {if (map[x][y] == 'O') {printf("白棋赢\n");return 1;} else {printf("黑棋赢\n");return 2;}}count = 1;// 纵向判断for (xx = x-1; xx > -1; xx--) {if (map[xx][y] == map[x][y] && map[x][y] != ' ') {count += 1;}}for (xx = x+1; xx < len; xx++) {if (map[xx][y] == map[x][y] && map[x][y] != ' ') {count += 1;}}if (count >= 5) {if (map[x][y] == 'O') {printf("白棋赢\n");return 1;} else {printf("黑棋赢\n");return 2;}}count = 1;// 反斜方向判断for (xx = x-1,yy = y + 1; xx > -1 && yy < 10; xx--,yy++) {if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}for (xx= x+1,yy = y-1; xx < len && yy > -1; yy--,xx++) {if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}if (count >= 5) {if (map[x][y] == 'O') {printf("白棋赢\n");return 1;} else {printf("黑棋赢\n");return 2;}}count = 1;// 斜线 方向判断for (xx = x-1,yy = y - 1; xx > -1 && yy > -1; xx--,yy--) {if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}for (xx= x+1,yy = y+1; xx < len && yy < 10; yy++,xx++) {if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {count += 1;}}if (count >= 5) {if (map[x][y] == 'O') {printf("白棋赢\n");return 1;} else {printf("黑棋赢\n");return 2;}}return 0;
}int main(void)
{char map[10][10] = {};for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {map[i][j] = ' ';}}display(map, 10);int x = 0, y = 0,ret = -1;while (1) {while (1) {printf("白旗落子\n"); // 'O'printf("请输入横坐标:");scanf("%d", &x);printf("请输入纵坐标:");scanf("%d", &y);if (x >= 0 && x <= 9 && y >=0 && y <= 9) {if (map[x][y] != ' ') {printf("该坐标已落子,请重新输入坐标\n");continue;} else {map[x][y] = 'O';display(map, 10);break;}}else {printf("输入坐标超出棋盘范围,请重新输入\n");continue;}}ret = IsWin(map, 10, x, y);if (ret != 0) {break;}while (1) {printf("黑旗落子\n"); // 'X'printf("请输入横坐标:");scanf("%d", &x);printf("请输入纵坐标:");scanf("%d", &y);if (x >= 0 && x <= 9 && y >=0 && y <= 9) {if (map[x][y] != ' ') {printf("该坐标已落子,请重新输入坐标!\n");continue;} else {map[x][y] = 'X';display(map, 10);break;}}else {printf("输入坐标超出棋盘范围,请重新输入!\n");continue;}}ret = IsWin(map, 10, x, y);if (ret != 0) {break;}}return 0;
}    

http://www.lryc.cn/news/2379696.html

相关文章:

  • Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)
  • Python爬虫实战:研究源码还原技术,实现逆向解密
  • WordPress Relevanssi插件时间型SQL注入漏洞(CVE-2025-4396)
  • Adobe Illustrator学习备忘
  • C#中的dynamic与var:看似相似却迥然不同
  • 求职困境:开发、AI、运维、自动化
  • 语言模型:AM-Thinking-v1 能和大参数语言模型媲美的 32B 单卡推理模型
  • ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式
  • docker compose up -d 是一个用于 通过 Docker Compose 在后台启动多容器应用 的命令
  • 智能视觉检测技术:制造业质量管控的“隐形守护者”
  • 利用html制作简历网页和求职信息网页
  • Problem E: List练习
  • 卷积神经网络进阶:转置卷积与棋盘效应详解
  • 用 Kotlin 脚本(KTS)重塑 Android 工程效能:2000 字终极实践指南
  • 2025年5月13日第一轮
  • HarmonyOs开发之———使用HTTP访问网络资源
  • 小结:Android系统架构
  • 单物理机上部署多个TaskManager与调优 Flink 集群
  • 基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析
  • VUE3_ref和useTemplateRef获取组件实例,ref获取dom对象
  • ISP中拖影问题的处理
  • C++.备考知识点
  • SQLMesh 模型管理指南:从创建到验证的全流程解析
  • HarmonyOS AVPlayer 音频播放器
  • ⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」
  • Filament引擎(一) ——渲染框架设计
  • c++从入门到精通(六)--特殊工具与技术-完结篇
  • JDK 1.8 全解析:从核心特性到企业实战的深度实践
  • MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频
  • 分布式微服务系统架构第134集:笔记1运维服务器经验,高并发,大数据量系统