【c语言】棋盘游戏--三子棋

一、问题概述

大家都玩过棋盘游戏吧,像五子棋一样,玩家或者是电脑一人下一次,当玩家或者是电脑的某一方先将各自的五个棋子下成一条线时,谁就赢,棋盘游戏就会结束。

                           

当然,我今天要介绍的是三子棋,和五子棋的原理是一样的,当玩家或者是电脑的某一方先将各自的三个棋子下成一条线时,谁就赢,棋盘游戏就会结束。

下面我们用如下棋盘模拟一下电脑上的棋盘:

      

有一点点小,害羞不要嫌弃哈。这就是初始的棋盘。那些空格的位置就是需要下棋的地方。

二、解决方案


(1)初始化棋盘,将棋盘可以要下的地方初始化为空格,这里我们用二维数组来存放这些空格,以便后边的替换;

(2)开始游戏时,先让玩家玩,输入玩家要下的坐标,然后让电脑玩,给定随机的坐标即可。

(3)当三个坐标成一条直线时,则下的那一方就赢。(判断坐标成一线)


三、实现代码

//ThreeChess.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#define Row 3
#define Col 3
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>//打印棋盘
void PrintChess(char arr[][Col],int row)
{printf("%c|%c|%c\n",arr[0][0],arr[0][1],arr[0][2]);printf("------\n");printf("%c|%c|%c\n",arr[1][0],arr[1][1],arr[1][2]);printf("------\n");printf("%c|%c|%c\n",arr[2][0],arr[2][1],arr[2][2]);
}//玩家下棋
void Player(char arr[][Col],int row)
{int x = 0;int y = 0;printf("玩家玩\n");printf("请输入坐标:>");scanf("%d%d",&x,&y);x = x-1;y = y-1;while(arr[x][y] != ' '){printf("输入数据不合法,请重新输入!\n");printf("请输入坐标:>");scanf("%d%d",&x,&y);x = x-1;       //现实中的坐标和计算机中的坐标相差1,所以横纵坐标各减1y = y-1;}if(arr[x][y] == ' '){arr[x][y] = '*';}PrintChess(arr,row);
}//电脑下棋
void Computer(char arr[][Col],int row)
{int x = rand()%row;int y = rand()%Col;printf("电脑玩\n");while(arr[x][y] != ' '){x = rand()%row;y = rand()%Col;}if(arr[x][y] == ' '){arr[x][y] = '#';}PrintChess(arr,row);
}int Check(char arr[][Col])
{int j = 0;int i = 0;int count = 0;//判断是否三个坐标为一条线for(i = 0;i < 3;i++){if((((arr[i][0] == arr[i][1])&&(arr[i][1] == arr[i][2]))&&(arr[i][1]== '*')) ||(((arr[0][i] == arr[1][i])&& (arr[1][i]== arr[2][i]))&&(arr[1][i]== '*')) ||(((arr[0][0] == arr[1][1])&&(arr[1][1]== arr[2][2]))&&(arr[1][1]== '*')) ||(((arr[0][2] == arr[1][1])&&(arr[1][1]== arr[2][0]))&&(arr[1][1]== '*'))){	return 1; }if((((arr[i][0] == arr[i][1])&&(arr[i][1] == arr[i][2]))&&(arr[i][1]== '#')) ||(((arr[0][i] == arr[1][i])&& (arr[1][i]== arr[2][i]))&&(arr[1][i]== '#')) ||(((arr[0][0] == arr[1][1])&&(arr[1][1]== arr[2][2]))&&(arr[1][1]== '#')) ||(((arr[0][2] == arr[1][1])&&(arr[1][1]== arr[2][0]))&&(arr[1][1]== '#'))){	return -1; }for(j = 0; j < 3;j++){if(arr[i][j] != ' '){count++;}}}if(count == 9){printf("平局\n");}}void Game()
{char arr[Row][Col];int i = 0;int j = 0;memset(arr,' ',sizeof(char)*Row*Col);PrintChess(arr,Row);while(1){Player(arr,Row);if(Check(arr) == 1){printf("玩家赢!\n");return;}Computer(arr,Row);if(Check(arr) == -1){printf("电脑赢!\n");return;}}
}

//ThreeChess.c

#include"ThreeChess.h"
#define _CRT_SECURE_NO_WARNINGS 1void FunTest()
{int select = 0;while(1){printf("------------------------------------\n");printf("------------- 1. play---------------\n");printf("------------- 2. exit---------------\n");printf("请选择:>\n");scanf("%d",&select);switch(select){case 1:Game();break;case 2:return;default:break;}}
}int main()
{FunTest();return 0;
}


四、运行结果




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

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

相关文章

【转】浅析task_struct结构体

https://blog.csdn.net/peiyao456/article/details/54407343

electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信

主进程与渲染进程之间的通信 这是渲染进程 // 渲染进程执行主进程里面的方法&#xff0c;主进程给渲染进程反馈处理结果 。 var sendreplayDomdocument.querySelector(#sendreplay); sendreplayDom.onclickfunction(){// alert(1213)//渲染进程给主进程广播数据ipcRenderer.se…

centos升级之gcc 升级 gcc-7.3.0安装

更新于&#xff1a;2018_7_28 安装时间非常非常久&#xff0c;我最快一次40分钟&#xff0c;最长一次两个小时 cd / wget ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz tar -zxvf gcc-7.3.0.tar.gz cd gcc-7.3.0 ./contrib/download_prerequisites mkdir build cd …

[数据结构]用插入排序和选择排序的思想实现优先级队列

一、问题概述 优先级队列的定义&#xff1a; 优先级队列不同于普通的队列&#xff0c;普通的队列具有先进先出的原则&#xff0c;而优先级队列是选择优先级最高的先出队。那么&#xff0c;如何模拟实现优先级队列呢&#xff1f;在这里&#xff0c;我们将较大的值作为优先级较高…

node.js https 模块设置请求头等信息

// https://www.iqiyi.com/v_19rs789v28.html var fs require(fs); var https require(https); var option{rejectUnauthorized: false,hostname:www.iqiyi.com,path:/,headers:{Accept:*/*,Accept-Encoding:utf-8, //这里设置返回的编码方式 设置其他的会是乱码Accept-Lang…

centos升级之vim vim8.0安装

YCM安装攻略&#xff1a;https://blog.csdn.net/csdn_kou/article/details/81213935 卸载旧的vim yum remove vim* -y 一、源码编译安装vim8.0 配置epel源 yum install epel-release 安装python3,以及vim8.0编译环境 yum install -y gcc python34 python34-devel ncurses…

[数据结构]求解迷宫最短路径问题

一、问题概述 之前&#xff0c;我们了解了如何实现迷宫问题&#xff08;对于迷宫只有一个出口可以通的情况&#xff09;&#xff0c;事实上我们的迷宫有多个出口&#xff0c;对于每条路径来说&#xff0c;有长有短&#xff0c;所以在这里&#xff0c;我们讨论一下迷宫的最短路…

centos升级之内核kernel

yum update kernel yum update && yum upgrade # rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum –disablerepo”*” –enablerepo”elrepo-kernel” list ava…

[STL]List的实现

STL&#xff08;Standard template Library&#xff09;:c的标准模板库 STL是算法和数据结构的软件框架&#xff0c;它包含了六大组件&#xff1a;算法、迭代器、容器、仿函数、配接器、空间配置器。 迭代器&#xff1a;我们可以把迭代器相当于智能指针&#xff0c;&#xff0…

python 获取windows上 网络连接信息 ip dhcp dns gateway

import socket import os import re def get_host_ip():"""查询本机ip地址:return:"""try:s socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect((8.8.8.8,80))# 能提取出本机ip 通过本机ip提取出其他设置ip s.getsockname()[0]# ip地…

vc++6.0的应用程序打不开肿么办

今天早起&#xff0c;有同学问到我关于vc6.0的安装过程中遇到的问题&#xff0c;我听了之后想想还是写篇博客给大家看一下吧。因为我之前也遇到过类似的问题。当时也是挺着急的。 大家遇到的问题估计就是这样吧~~&#xff08;下载后打不开&#xff09; 请看-->解决步骤&…

【数据结构】广义表

一、问题概述 广义表是非线性的数据结构&#xff0c;是由若干个元素组合而成的&#xff0c;广义表中可以有子表&#xff0c;类似这样的&#xff1a; 我们以C(a,b,(c,d))为例&#xff0c;将它定义为这样的数据结构&#xff1a; 我们会给定字符串的形式&#xff0c;如&#xff…

centos升级之共享文件夹

vmware-hgfsclient vmhgfs-fuse .host:/share /mnt/hgfs 如果不行的话 cd /mnt mkdir hgfs 把上面的在执行一次

批处理创建程序的快捷方式

"D:\AppServ\timer\win_cron_zq\定时.exe" 这是应用程序timer.lnk" 这是快捷方式的名称 echo ThePath "D:\AppServ\timer\win_cron_zq\定时.exe">aaa.vbs echo lnkname "timer.lnk">>aaa.vbs echo WS "Wscript.Shell&quo…

【数据结构】普通二叉树的实现

一、问题概述 树是n个有限个数据的集合&#xff0c;形如&#xff1a; 它像不像倒着的树呢&#xff1f;我们把它看成是一种数据结构----树。它的第一个节点称作树的根&#xff0c;最底下的那些节点称作树的叶子。 我们今天所要研究的是二叉树&#xff0c;即父节点最多只有两个孩…

windows 下 安装mysql 出现 “ ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password

这个问题是在Windows下安装MySQL服务时遇到的&#xff0c;使用MySQl绿色版进行安装的&#xff0c;安装完成后&#xff0c;连接到MySQL服务时输入命令 “ mysql -uroot -p ” &#xff0c;因为时第一次登录&#xff0c;未设置密码&#xff0c;直接回车&#xff0c;就遇到了这个问…

setitimer用法说明

函数原型&#xff1a; int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value) 函数作用&#xff1a; 可用来实现延时和定时的功能 头文件&#xff1a; #include <sys/time.h> 参数详解 用一把&#xff1a;一个例子 #include &…

哈希表(闭散列、拉链法--哈希桶)

哈希表&#xff0c;也称散列表&#xff0c;是一种通过key值来直接访问在内存中的存储的数据结构。它通过一个关键值的函数&#xff08;被称为散列函数&#xff09;将所需的数据映射到表中的位置来访问数据。 关于哈希表&#xff0c;主要为以下几个方面&#xff1a; 一、哈希表…