C语言实践——双人五子棋(简易版)
双人五子棋
- 前言
- 一、五子棋的元素
- 二、五子棋规则(简单)
- 三、主要功能的设计
- 1.头文件和宏定义
- 2.初始化棋盘
- 3.打印棋盘
- 4.判断输赢
- 5.辅助函数
- 6.主函数
- 四、程序结果展示
前言
五子棋相信大家都玩过,今天就来讲一下如何用C语言来实现一个简单版的双人五子棋。
—
一、五子棋的元素
1.棋子
棋子符号包括:“X”和“0”
2.棋盘
棋盘符号包括:“+”
棋盘行数为15,列数为15,使用宏定义:
#define ROWS 15 //行 国际标准棋盘 15 * 15
#define COLS 15 //列
二、五子棋规则(简单)
“X”和“0”双方同类型棋子先形成五子连珠就获胜(行方向、列方向、主对角线、副对角线)
三、主要功能的设计
1.头文件和宏定义
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define ROWS 15 //行 国际标准棋盘 15 * 15
#define COLS 15 //列char board[ROWS][COLS]; // 棋盘
2.初始化棋盘
void init_board() // 初始化棋盘
{int i, j;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){board[i][j] = '+';}}
}
3.打印棋盘
void print_board() { // 打印棋盘int i, j;printf(" "); printf(" "); printf(" ");//空格调整for (i = 0; i <= 9; i++)//打印列标志{printf("%d ", i);}printf("A ");//A代替10,实现布局整齐printf("B ");//B代替11,实现布局整齐printf("C ");//C代替12,实现布局整齐printf("D ");//D代替13,实现布局整齐printf("E ");//E代替14,实现布局整齐printf("\n");for (i = 0; i < ROWS; i++)//一行一行地打印{if (i <= 9){printf("%d ", i);//打印行标志0-9}else{printf("%d ", i);//打印行标志10-14}for (j = 0; j < COLS; j++)//打印棋盘{printf("%c ", board[i][j]);}printf("\n");}
}
4.判断输赢
以每个棋子为中心,判断行方向、列方向、主对角线、副对角线是否形成同类型的五子连珠
int is_win(char c) // 判断是否胜利
{int i, j, k;for (i = 0; i < ROWS; i++)//一颗一颗扫描判断{for (j = 0; j < COLS; j++){if (board[i][j] == c){for (k = 1; k <5; k++){if (i + k < ROWS && board[i + k][j] == c &&i + k - 1 >= 0 && board[i + k - 1][j] == c &&i + k - 2 >= 0 && board[i + k - 2][j] == c &&i + k - 3 >= 0 && board[i + k - 3][j] == c &&i + k - 4 >= 0 && board[i + k - 4][j] == c)//判断列五颗棋子是否相同{return 1;}if (j + k < COLS && board[i][j + k] == c &&j + k - 1 >= 0 && board[i][j + k - 1] == c &&j + k - 2 >= 0 && board[i][j + k - 2] == c &&j + k - 3 >= 0 && board[i][j + k - 3] == c &&j + k - 4 >= 0 && board[i][j + k - 4] == c)//判断行五颗棋子是否相同{return 1;}if (i + k < ROWS && j + k < COLS && board[i + k][j + k] == c &&i + k - 1 >= 0 && j + k - 1 >= 0 && board[i + k - 1][j + k - 1] == c &&i + k - 2 >= 0 && j + k - 2 >= 0 && board[i + k - 2][j + k - 2] == c &&i + k - 3 >= 0 && j + k - 3 >= 0 && board[i + k - 3][j + k - 3] == c &&i + k - 4 >= 0 && j + k - 4 >= 0 && board[i + k - 4][j + k - 4] == c)//判断主对角线五颗棋子是否相同{return 1;}if (i + k < ROWS && j - k >= 0 && board[i + k][j - k] == c &&i + k - 1 >= 0 && j - k + 1 < COLS && board[i + k - 1][j - k + 1] == c &&i + k - 2 >= 0 && j - k + 2 < COLS && board[i + k - 2][j - k + 2] == c &&i + k - 3 >= 0 && j - k + 3 < COLS && board[i + k - 3][j - k + 3] == c &&i + k - 4 >= 0 && j - k + 4 < COLS && board[i + k - 4][j - k + 4] == c)//判断副对角线五颗棋子是否相同{return 1;//有一方胜利}}}}}return 0;
}
5.辅助函数
void safe_flush(FILE* fp)//清除scanf缓存区
{int ch;while ((ch = fgetc(fp)) != EOF && ch != '\n');
}
6.主函数
int main()
{int x, y, i = 0;char c = 'X';// X方 0方char k;//再战选择start: //goto标志system("cls");//清屏init_board(); //初始化棋盘print_board(); //打印棋盘while (1){printf("请%c方输入坐标(x,y): ", c);scanf("%d,%d", &x, &y);safe_flush(stdin);//清除scanf缓存区if (x < 0 || x >= ROWS || y < 0 || y >= COLS){printf("坐标不合法,请重新输入!\n");continue;}if (board[x][y] != '+'){printf("该位置已经有棋子,请重新输入!\n");continue;}system("cls");//清屏board[x][y] = c;print_board();if (is_win(c)){printf("%c方胜利!\n", c);break;}i++;if (i == ROWS * COLS)//棋盘已下满{printf("平局!\n");break;}c = (c == 'X' ? 'O' : 'X');//交换双方下子}printf("还要再来一把吗?输入y或n:>");//从开选择scanf("%c", &k);safe_flush(stdin);while (k != 'y' && k != 'n') {printf("输入错误,请重新输入\n"); scanf("%c", &k);safe_flush(stdin);}while (k == 'y'){goto start;}printf("谢谢使用!\n");return 0;
}
四、程序结果展示
1.程序开始
2.“X”输入坐标5,5
3.“0”输入坐标6,7
4.输入错误坐标
5.形成五子连珠(行)
6.形成五子连珠(列)
7.形成五子连珠(主对角线)
8.形成五子连珠(副对角线)
9.输入y再来一把
C语言实践——双人五子棋(简易版)相关推荐
- C语言实践——双人五子棋(进阶版)
双人五子棋 前言 一.棋盘的美化 二.棋子的美化 三.棋盘的打印 四.控制台修改颜色 五.五子棋源代码 前言 上一篇文章讲了如何用C语言写一个简易的双人五子棋小游戏,但是存在一些缺陷,比如棋盘太&q ...
- ❤️C语言通讯录管理系统(简易版)❤️
❤️C语言通讯录管理系统(简易版)❤️
- C语言扫雷游戏(简易版)
前言 经过学习数组.函数.循环语句.选择语句等C语言的一些基础知识后,我想借助编写扫雷小游戏来对所学知识进行一个巩固.游戏只会实现一些基本的功能,展开.标记雷.取消雷等不实现(还不会). 1.游戏编写 ...
- 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】
目录 一.扫雷游戏的运行逻辑 二.代码逻辑讲解+源码 1.打印一个简易的游戏开始菜单 2.创建数组储存数据并初始化数组 代码逻辑讲解 源码 3.布置雷 代码逻辑讲解 源码 4.排雷 代码逻辑 源码 三 ...
- c语言HTTP服务器,超级简易版。
算是对linux多线程的复习把,尝试这用socket写了一个简单的HTTP服务器,当访问它的时候它会给你发送一个HTML文件,这个HTML文件需要自己写. 代码: #include <stdio ...
- 类 Pascal语言词法分析实验(简易版)
一. 实验目的 设计.编制并调试一个词法分析程序,加深对词法分析原理的理解. 二. 实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关 ...
- c语言小游戏 精简_C语言开发简易版扫雷小游戏
C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...
- c语言实现学生二科成绩的单链表,c++链表实现学生成绩管理系统(简易版)
#include using namespace std; typedef struct student{ int id;//学号 string sex; string name; int cpp;/ ...
- C语言编程练手必备,C 语言快速实现五子棋!
五子棋大家一定都玩过,想不想试着用 C 语言来实现一个简易版的五子棋呢?下面就让我们现在开始,用最简单易懂的代码来编写一个控制台下的五子棋,并逐步完善它,每个人都能轻松学会哦! 下面是小编整理好的一套 ...
最新文章
- Github标星57k+,热榜第一,用Python实现所有算法
- 动手打造自己强大的右键菜单
- Java ArrayList的实现原理详解
- Delphi7函数大全
- 【4K HDR】2020年东京圣诞灯会/
- catch 语句的参数
- linux 套接口文件_继上一篇,继续介绍linux 套接口
- OpenCV之滑动条的创建和使用
- Linux_free(buffer与cache区别)
- markDown零碎整理
- hibernate5.0映射配置文件核心配置文件数据更新丢失
- 最新多种方式, 判断客户端IP是国内还是国外?
- PHP程序员简历模板
- 微信小程序富文本编辑器
- postgresql 查找慢sql之二: pg_stat_statements
- 2022年卫浴行业报告:套系化+智能化拓宽边际,箭牌家居内资领航
- vue的生命周期(详细)
- 什么是短视频电商,短视频电商的商业模式标题】
- linux里面sftp命令,Linux中sftp命令起什么作用呢?
- flask+gunicorn部署