三(五)子棋实现

设计一个小游戏其实是对自己掌握一门编程语言的一个升华,几百行代码分项目进行这种很让人着迷的感觉哦!

  与五子棋游戏其实本质区别只不过是判输赢的条件不同,这里我打算写写三子棋小游戏。

代码的最后我将所有源代码整理了,大家急用可以直接复制哦不过要记得分项目哦。

  本文的三子棋代码修改只需要改一下一些关于判输赢条件即可 棋盘大小可以自由修改。

一.程序设计

  写这样的一个小游戏项目-----先要进行设计:    

                                                              1.数据结构

                                                               2.整体规划

                                                              3.接口设计

                                                            4.实现具体功能

 1.1数据结构以及接口                   

     存放棋盘上的棋子我们可以用*和#来代替,所以这样了棋盘存放棋子的数据机构可以用数组 下面我用静态数组形式实现 -------形式为 char Broad[ROW][COL] ;  当棋盘对应的棋子为空格表示这个位置不就是空位置么。

1.2整体规划

2. 棋盘创建

主函数这边先给大家一下便于们理解代码过程:
enum Choice {Exit,Play};
menu()
{printf("*******************\n");printf("*****0.exit********\n");printf("*****1.paly********\n");printf("*******************\n");printf("*******************\n");}void game()
{char Board[ROW][COL] = { 0 };int size = 0;// 用来后续判满BoardInit(Board);BoardPrint(Board);}int main() {enum  Choice input = 0;do{menu();scanf("%d", &input);switch (input) {case Exit:printf("hehe");break;case Play:game();break;default:printf("请输入正确选项>.");}} while (input);return 0;
}

总结: 对于棋盘的创建我们其实直接用了数组创建,但是实际上在展现棋盘的时候我们可以对打印过程总一些分割线的随之打印可以让你的棋盘更加美观。

3.玩家和电脑

tip:其实二者思路都很简单只需要将棋盘的数据结构修改进行 (这里是数组) 说白了就是将数组中的元素修改

4.判断输赢情况:

ISwin函数

输赢情况:             

    1.一个是对角线三子合一

     2.或者是某一行或者某一列 

      3. 满了而且和了

行列判断: 根据他的连续性  

 

 思路:根据连续性我们固定行不动 遍历列上所有点 创建一个flag 只有当棋子相同且连续才++否则就重新赋值为0 这样就可以记录输赢了。

行和列的判赢思路是类似的下面是具体实现:

对角线判断:判赢最难的就是任意棋盘大小下判对角线的了: 这里介绍一种      即任意对角线从左到下  和任意对角线从右到下。

  任意一个点都判断它关于对角线的关系:  ----要知道对角线中的元素 行和列都相差一个同样的分量 。

最后是判满条件:

最后是判满 其实判满很简单 :

1. 既然一直没赢满了就和

2. 刚好下了就满了

     我这里甚至没有单独写一个判满函数 而是直接这样是因为我提前做了逻辑判断

就两种情况 因为如果是下最后一个满棋这里是先判输赢在判满 所以赢在前 就直接结束了

如果没有结果在用判满 和了

-------------我们前面指定了一个size就是拿来判满的。

五.程序优缺以及实现状况

1.本三子棋的创建其实有许多小细节没有做的通用,比如对于判断赢的棋子数3可以用#difine这样后期想修改为五子棋也就方便了。
2. 本程序一开始对于电脑下棋产生的随机数没有进行限制这可能会出现一种情况,已经有棋子的位置被电脑下棋赋盖。
缺陷 : 其实还有一个不利于美观的实现就是对于分割线的打印我们这里如果棋盘大小改变还要我们自己去修改分割线长度,但是其实也比较好修改,朋友们试试吧。(如果有疑问可以私聊我哦)
3.优点:最为满意的是其中对角线的判断这是对于任意棋盘大小都可以使用所以这个算法是很不错的。以及使用了枚举类型便于其中的选择的理解。

实现情况:接下来我们来验证一下

尝试:

玩家下棋后电脑会立刻下棋,然后打印棋盘

行胜利情况:

列:

对角线胜利

六.项目具体实现

         朋友们需要的直接拿走吧,但是麻烦给我一个小小的赞和关注作为鼓励呢!

game.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 5
#define COL 5void BoardInit(char(*Board)[COL]);
void BoardPrint(char(*Board)[COL]);
void  PeopleMove(char(*Board)[COL], int* size);
void  ComputerMove(char(*Board)[COL],int*size);
char IsWin(char(*Board)[COL]);
int IsFull(int* size);

game.c

#include"game.h"void BoardInit(char(*Board)[COL])
{for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){Board[i][j] = ' ';}}}void BoardPrint(char(*Board)[COL])
{for (int i = 0; i < ROW; i++){printf("_______________________________\n");for (int j = 0; j < COL; j++){printf("|  ");printf("%c", Board[i][j]);//   |  *  |  *  |  *  |  *  |printf("  ");              //  _________________________if (j == COL-1)printf("|");}printf("\n");if(i==ROW-1)printf("_______________________________\n");}}void  PeopleMove(char(*Board)[COL],int*size)
{int x = 0;int y = 0;// 坐标 printf("玩家输入坐标:");scanf("%d %d",&x,&y);x--;y--;if(x<ROW&&x>=0&&y<COL&&y>=0)Board[x][y] = '*';(*size)++;}void  ComputerMove(char(*Board)[COL],int* size)
{int x = 0;int y = 0;// 坐标 while (1){x = rand() % ROW;y = rand() % COL;if (Board[x][y] == ' ') {Board[x][y] = '#';(*size)++;break;}}}int  Diag(char(*Board)[COL], int row,int col,int dr, int dc)
{char point = Board[row][col];if (point == ' ')return 0;int count = 0;for (int i = 0; i < 3; i++){int r = row + dr * i;int c = col + dc * i;if (r < 0 || r >= ROW || c < 0 || c >= ROW || Board[r][c] != point)return 0;count++;}return count == 3;}char IsWin(char(*Board)[COL])
{// 行满// 方向确定为从上往下for (int i = 0; i < ROW; i++){int flag = 0;int j = 1;for (j; j < COL; j++){if (Board[i][j] != Board[i][j - 1])// * * ***{flag = 0;}if (Board[i][j] == Board[i][j - 1] && Board[i][j] != ' '){flag++;if (flag == 2)return Board[i][j];}}}// 列for (int i = 0; i < COL; i++){int flag = 0;int j = 1;for ( j ; j < ROW; j++){if (Board[j-1][i] != Board[j][i]){flag = 0;}if (Board[j-1][i] == Board[j][i]&&Board[j][i]!=' '){flag++;if (flag == 2)return Board[j][i];}}}// 对角线判for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){// 每一个点左上到右下 右上到左下if (Diag(Board, i, j, 1, -1) || Diag(Board, i, j, 1, 1)){return Board[i][j];}}}return ' ';}int IsFull(int* size)
{return size == COL * ROW;}

test.c

#include"game.h"enum Choice {Exit,Play};
menu()
{printf("*******************\n");printf("*****0.exit********\n");printf("*****1.paly********\n");printf("*******************\n");printf("*******************\n");}
void game()
{char Board[ROW][COL] = { 0 };int size = 0;// 用来后续判满BoardInit(Board);BoardPrint(Board);srand((unsigned int)time(NULL));while (1) {if (IsWin(Board)!=' '){if (IsWin(Board) == '*')printf("玩家获胜\n");elseprintf("电脑获胜\n");return;}if (size == ROW * COL) {printf("和了\n");return;}PeopleMove(Board, &size);BoardPrint(Board);printf("\n电脑操作:\n");ComputerMove(Board, &size);BoardPrint(Board);}}int main() {enum  Choice input = 0;do{menu();scanf("%d", &input);switch (input) {case Exit:printf("hehe");break;case Play:game();break;default:printf("请输入正确选项>.");}} while (input);return 0;
}

  小节

本期就到这里了,其中我们使用的思想其实非常贴合程序设计模型的一个周期,当然虽然我调试过很多次但是还是有许多不足但是值得各位借鉴的我想也会有,如果朋友们有不理解的欢迎大家私聊我,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/415044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网之MQTT

一&#xff0c;MQTT 及其在物联网中的应用 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;设计用于低带宽、延迟高、不稳定的网络环境&#xff0c;特别适合物联网&#xff08;IoT&#xff09;应用。它采用了发布/订…

pet薄膜高速度视觉软件丝印应用

卷对卷生产的PET薄膜&#xff0c;以其优异的物理、化学性能及尺寸稳定性&#xff0c;在塑料薄膜行业中占据重要地位。它透明度高、光泽度好&#xff0c;强韧性出色&#xff0c;抗张强度和抗冲击强度远高于一般薄膜&#xff0c;且具有良好的耐热、耐寒、耐油和耐酸性。这些特性使…

(二)、软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)

HealthyPi Move是一款开放式硬件设备&#xff0c;可让您高精度地跟踪所有生命体征。它不仅仅是另一款带有心率监测器的智能手表&#xff0c;它还是手腕上的完整生命体征监测和记录设备&#xff0c;可以测量心电图(ECG)、光电容积脉搏波 (PPG)、SpO₂、血压(基于手指)、EDA/GSR、…

scikit-learn:一个强大的机器学习Python库

我是东哥&#xff0c;一个热衷于用Python解决实际问题的技术爱好者。今天&#xff0c;我要和大家分享一个强大的机器学习库——scikit-learn。你是否曾经对机器学习充满好奇&#xff0c;却觉得它高深莫测&#xff1f;scikit-learn库将帮你轻松入门&#xff0c;让你在机器学习的…

《TSMaster开发从入门到精通》——创作者背后的故事...

背后的故事 由汽车行业畅销书作者杨金升老师牵头&#xff0c;同星智能研发团队和应用支持团队全力参与的《TSMaster开发从入门到精通》书籍已由清华大学出版社印付。此书一经上架&#xff0c;就获得汽车行业人士的一致认可和好评&#xff08;京东自营100%好评率&#xff0c;并…

基于DPU与SmartNIC的K8s Service解决方案

1. 方案背景 1.1. Kubernetes Service介绍 Kubernetes Service是Kubernetes中的一个核心概念&#xff0c;它定义了一种抽象&#xff0c;用于表示一组提供相同功能的Pods&#xff08;容器组&#xff09;的逻辑集合&#xff0c;并提供了一种方式让这些Pods能够被系统内的其他组…

python-uinput虚拟输入

文章目录 python-uinput虚拟输入背景库简介&#xff1a;什么是python-uinput&#xff1f;安装指南&#xff1a;如何获取这个强大的工具&#xff1f;快速上手&#xff1a;五个核心函数的介绍与使用1. 创建虚拟设备2. 模拟键盘输入3. 模拟鼠标移动4. 模拟鼠标点击5. 模拟触摸屏操…

嵌入式全栈开发学习笔记---Linux系统编程(进程间通信)

目录 进程间通信概述 进程通信目的 进程间通信的发展 进程间通信分类 管道通信 无名管道 有名管道mkfifo() 信号 发送信号kill & raise 忽略信号signal() 发送信号alarm() 消息队列 消息队列使用的步骤 创建消息队列msgget() 读写消息队列msgrcv()/msgsnd()…

【C语言】十六进制、二进制、字节、位、指针、数组

【C语言】十六进制、二进制、字节、位 文章目录 [TOC](文章目录) 前言一、十六进制、二进制、字节、位二、变量、指针、指针变量三、数组与指针四、指针自加运算五、二维数组与指针六、指向指针的指针七、指针变量作为函数形参八、函数指针九、函数指针数组十、参考文献总结 前…

高经费打造的史诗级视觉盛宴,惊叹于每一帧的奢华

8月29日&#xff0c;备受期待的《指环王&#xff1a;力量之戒》第二季终于上线了。这一季一上架就放出了三集&#xff0c;立刻引发了影迷们的热烈讨论。 自从2022年首季首播以来&#xff0c;《指环王&#xff1a;力量之戒》就一直备受瞩目。尽管首季受到了不少争议&#xff0c;…

【C++ Primer Plus习题】9.4

问题: 解答: main.cpp #include <iostream> #include "sales.h" using namespace std; using namespace SALES;int main() {Sales s1, s2;double de[QUARTERS] { 12.1,32.1,42.1,51.1 };setSales(s1, de, QUARTERS);showSales(s1);cout << endl;setSal…

springsecurity快速入门

Spring Security 是一个功能强大且高度可定制的安全框架&#xff0c;主要用于保护基于 Spring 的应用程序。它提供了一整套用于身份验证、授权、加密、会话管理等功能的工具和 API&#xff0c;从而帮助开发者快速、有效地保护应用程序。 Configuration EnableWebSecurity pu…

Hive 安装

目录 Hive 安装 Hive 安装地址 Hive 安装部署 安装 Hive 启动并使用 Hive Hive 安装 Hive 安装地址 1&#xff09;Hive 官网地址 Apache Hivehttp://hive.apache.org/ 2&#xff09;文档查看地址 GettingStarted - Apache Hive - Apache Software Foundationhttps://cwik…

“转移阻抗”?求你们不要再玩新梗了!

高速先生成员--黄刚 在SI这个行业待久了&#xff0c;Chris发现其实也蛮卷的&#xff0c;就好像前几周写的电容滤板半径这篇文章&#xff0c;最近一些和Chris很熟的网友也评论说&#xff1a;现在好好做设计&#xff0c;好好做仿真都不行啦&#xff1f;一定要发明一些听起来很高…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

VMS-WS-485使用简明教程(485通信类型变送器)

VMS-WS-485使用简明教程 该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 文章主要介绍485通信类型变送器的硬件连接、软件配置、数据读写以温湿度计算 1 硬件连接 2 软件配置 将变送器硬件部分正确连接后&…

物联网之云平台架构

一&#xff0c;一个典型的物联网云平台 一个典型的物联网&#xff08;IoT&#xff09;云平台需要实现多个功能&#xff0c;以支持物联网设备的接入、数据处理、设备管理、实时控制等需求。 &#xff08;一&#xff09;核心功能 1&#xff0c;设备接入与管理&#xff1a; - 设…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时&#xff0c;发现里面使用了IAT Hook&#xff0c;这一块没有接触过&#xff0c;去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解&#xff0c;索性将PE文件结构的资料找出来&#xff0c;系统学习一下。 PE文件结构 Portable…

Java中类的成员介绍

我的后端学习大纲 我的Java学习大纲 4.类的成员&#xff1a; 3.1.类的成员 -> 属性介绍&#xff08;成员变量&#xff09;&#xff1a; a.语法格式&#xff1a; 1.修饰符 数据类型 属性名 初始化值 ;2.说明1: 修饰符 常用的权限修饰符有&#xff1a;private、缺省、prot…

【论文】A Collaborative Transfer Learning Framework for Cross-domain Recommendation

Intro 业界常见的跨域建模方案主要分为两种范式[22][32][5][36][17][14][20]&#xff1a;1) 将源样本和目标样本进行联合和混合&#xff0c;然后执行多任务学习技术&#xff0c;以提高在所有域中的性能&#xff1b;2) 使用混合或数据丰富的源域数据预先训练模型&#xff0c;然…