wsy日志---三子棋
实现三子棋
①:
test.c---测试游戏的逻辑game.c---游戏代码的实现game.h---游戏代码的声明PS:在编写代码时,尽量写一点测一点,方便找错误
②:
首先开始游戏,要进入游戏菜单界面,同时玩过一把后还要不要玩,这个选择权应该交给玩家
void menu()
{printf("*********************\n");printf("*** 1.play 0.exit ***\n");printf("*********************\n");
}
int main()
{int input = 0;do{menu();//菜单函数printf("请选择:>");scanf("%d",&input);switch (input)//选择开始游戏或退出{case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入\n");break;}}wuhile(input)
}
③:初始化数组
下面开始创建一个字符数组(不同棋子可以用不同字符代替,用整数代替棋子就创建整形数组)来存放三子棋,刚开始棋盘上没有棋子,所以可以用空格填满数组,具体方法就是利用for循环把数组中的元素初始化为空格。
void initBoard(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 0;x < row;x++){for (y = 0; y < col; y++){Board[x][y] = ' ';}}
}
这里要注意的是 ROW 和 COL 是通过#define定义的枚举常量,这样使用方便还能将三子棋改成其他类型的比如
说五子棋,十子棋...
④:打印棋盘
数组初始化完成了,但这个时候我们看不到,也无法判断是否出错,所以可以将棋盘整体打印出来
void printBoard(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 0;x < row;x++){//打印水平分割行for (y = 0; y < col; y++){printf(" %c ", Board[x][y]);if (y < col-1)//打印三子棋盘只需要两个分割线,所以可以借用if来限制打印多出的分割线{printf("|");} }printf("\n");//打印垂直分割行if (x < row-1){int i = 0;for (i = 0; i < row; i++){printf("---");if (i < row - 1){printf("|");}}}printf("\n");}
}
当棋盘出现之后,一切准备就绪,玩家就可以准备下棋了,这个时候要想清楚,玩家和棋盘轮流下棋,如果没有出现输赢或者平局就要继续。。。所以可以利用一个循环来循环玩家和电脑下棋。
while(1)
{//玩家下棋//打印棋盘//判断输赢,平局或继续,赢了或平局,break跳出循环//电脑下棋//打印棋盘//判断输赢,平局或继续,赢了或平局,break跳出循环
}
如果没有应或者平局就继续循环,直到跳出循环
④:玩家下棋
用户下棋需要首先判断用户输入的坐标是否溢出棋盘,再然后需要判断用户输入的坐标上面是否已经存在棋子(此时需要注意玩家输入的坐标是从1开始的,但数组的下标是从0开始的,所以需要将玩家输入的坐标减一)
void playermove(char Board[ROW][COL], int row, int col )
{int x = 0;int y = 0;printf("玩家下棋>:");//首先接受用户输入的坐标while(1){scanf("%d %d", &x, &y);//然后开始判断这两个坐标是否溢出,如果溢出,则需要重新输入if(x>0 && x<=row && y>0 && y>col){//如果没有溢出,再判断坐标上是否已经有棋子if(Board[x][y] == ' '){Board[x][y] == '*';break;//判断该坐标没有棋子,将 * 放上坐标,然后break跳出循环,如果该位置}else {printf("该位置已有棋子,请重新输入\n");printf("重新输入:>");}}else {printf("坐标非法,请重新输入\n");printf("重新输入:>");}}
}
⑤:判断输赢
玩家下棋后,紧接着的就是判断输赢,具体就是用循环判断三行每行是否相同,判断三列是否相同
判断对角线是否相同,因为判断输赢有四种结果,所以需要返回值,代码如下。
char iswin(char Board[ROW][COL],int row, int col)
{//首先判断三行每行是否相同int i = 0;int j = 0;for(i = 0; i < row; i++){for(j = 0; j < row-1; j++){if(Board[i][j] == Board[i][j+1] && if(Board[i][j] != ' ')//判断{if(j == row-2) {return Board[i][j];}}if(Board[i][j] == Board[i][j+1])break;}}
}
相同代码可以判断三列是否相同,接着就是要判断对角线是否相同
假设是x子棋,那么其中一条对角线的坐标必定是
0.0,1.1,2.2,3.3,,,x-1.x-1,按照这个规律可以写出判断这条对角线的代码如下
int k = 0;
for(k = 0; k < row, k++)
{if(Board[k][k] == Board[k+1][k+1] && != ' '){if(k == row -2){return Board[k][k];}}if(Board[k][k] != Board[k+1][k+1])break;
}
然后另一条对角线必定是
0 x-1,1 x-2,2 x-3,,,x-1 0
所以可以写出代码
int l = 0;
for(l = 0; l < row, l++)
{if(Board[l][row-1-l] == Board[l+1][row-2-l] && != ' '){if(l == row -2){return Board[k][k];}}
}
⑥:电脑下棋
电脑下棋需要调用srand函数来设置一个随机的起始点,然后再用rand函数生成一个随机数
两者的头文件都是 <stdlib.h> ,随机数生成后,需要去限制随机数的范围,防止它溢出棋盘,还要判断生成的这个随机坐标上是否已经存在棋子。
int x = 0;int y = 0;x = rand()%row;y = rand()%col;int i = 0;while(1){if(Board[x][y] == ' ')//判断随机坐标是否有棋子,等于空格则无棋子{Board[x][y] == '#';//将 # 存放到数组中break;}}
以上就是三子棋中大概的函数需求,整体代码放在下面
game.h
#pragma once#define ROW 3
#define COL 3
#include <stdlib.h>
#include <time.h>void initBoard(char Board[ROW][COL], int row, int col);void printBoard(char Board[ROW][COL], int row, int col);void playerMove(char Board[ROW][COL],int row,int col);void computerMove(char Board[ROW][COL], int row,int col);char ISWIN(char Board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS #include "game1.h"
#include <stdio.h>void initBoard(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 0;x < row;x++){for (y = 0; y < col; y++){Board[x][y] = ' ';}}
}void printBoard(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 0;x < row;x++){for (y = 0; y < col; y++){printf(" %c ", Board[x][y]);if (y < col-1){printf("|");} }printf("\n");//打印分割行if (x < row-1){int i = 0;for (i = 0; i < row; i++){printf("---");if (i < row - 1){printf("|");}}}printf("\n");}
}void playerMove(char Board[ROW][COL], int row, int col)
{int input1 = 0;int input2 = 0;printf("玩家下棋:>");while (1){scanf("%d %d", &input1, &input2);if (input1 <= row && input1 >= 1 && input2<=col && input2 >= 1){if (Board[input1 - 1][input2 - 1] == ' '){Board[input1 - 1][input2 - 1] = '*';break;}elseprintf("该位置已有棋子,请重新选择!\n请输入:>");}else{printf("输入错误,超出棋盘规格请重试!\n请输入:>");}}
}char ISWIN(char Board[ROW][COL], int row, int col)
{//判断三列plusint i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < row - 1; j++){if (Board[i][j] == Board[i][j + 1] && Board[i][j] != ' ')//判断{if (j == row - 2){return Board[i][j];}}if (Board[i][j] != Board[i][j + 1])break;}} //判断三行plusint a = 0;int b = 0;for (a = 0; a < row; a++){for (b = 0; b < row - 1; b++){if (Board[b][a] == Board[b+1][a] && Board[b][a] != ' ')//判断{if (b == row - 2){return Board[b][a];}}if (Board[b][a] != Board[b + 1][a])break;}}//判断两个对角线int k = 0;for (k = 0; k < row; k++){if (Board[k][k] == Board[k + 1][k + 1] && Board[k][k] != ' '){if (k == row - 2){return Board[k][k];}}if (Board[k][k] != Board[k + 1][k + 1])break;}int l = 0;for (l = 0; l < row; l++){if (Board[l][row - 1 - l] == Board[l + 1][row - 2 - l] && Board[l][row - 1 - l] != ' '){if (l == row - 2){return Board[k][k];}}}//判断棋盘是否满了,平局int x = 0;int y = 0;for (x = 0; x < row; x++){for (y = 0; y < col; y++){if (Board[x][y] == ' ')return 'c';}}return 'b';
}int isfull(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 0; x < row; x++){for (y = 0; y < col; y++){if (Board[x][y] == ' ')return 0; }}return 1;
}void computerMove(char Board[ROW][COL], int row, int col)
{int x = 0;int y = 0;int ret = 0;printf("电脑下棋:>\n");while (1){x = rand()% row;y = rand()% col;if (Board[x][y] == ' '){Board[x][y] = '#';break;}ret = isfull(Board, ROW, COL);if (ret)break;}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game1.h"void menu()
{printf("*********************\n");printf("*** 1.play 0.exit ***\n");printf("*********************\n");
}
void game()
{char Board[ROW][COL] = {0}; char ret = '0';initBoard(Board, ROW, COL); //初始化棋盘printBoard(Board, ROW, COL); //打印棋盘while (1){playerMove(Board, ROW, COL); //玩家下棋printBoard(Board, ROW, COL);ret = ISWIN(Board, ROW, COL); //判断输赢if (ret != 'c')break;printf("继续\n");computerMove(Board, ROW, COL); //电脑下棋printBoard(Board, ROW, COL);ret = ISWIN(Board, ROW, COL); //判断输赢if (ret != 'c')break;}if (ret == 'b')printf("平局\n");else if (ret == '*')printf("玩家赢\n");else if (ret == '#')printf("电脑赢\n");}int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请做出选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}
谢谢观看新手日志
wsy日志---三子棋相关推荐
- C语言小游戏快速入门--三子棋
目录 一.前言 二.游戏界面 三.游戏逻辑 1.game.h 2.game.c 3.test.c 四.总结 一.前言 这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来.在这里博主实现的 ...
- 用C语言实现三子棋游戏(附上思路+项目展示+源代码)
文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...
- C语言小游戏——三子棋
C语言 -- 三子棋 本篇主要是用二维数组和多个函数来实现三子棋游戏. 让我们先来看看这个编写这个游戏的思路:首先要打印三子棋的棋盘,然后是玩家下棋,电脑下棋,最后判断谁赢了,或者看看是否平局. 我们 ...
- 【c语言】棋盘游戏--三子棋
一.问题概述 大家都玩过棋盘游戏吧,像五子棋一样,玩家或者是电脑一人下一次,当玩家或者是电脑的某一方先将各自的五个棋子下成一条线时,谁就赢,棋盘游戏就会结束. 当然,我今天要介绍的是三子棋,和五子棋的 ...
- c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏
本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...
- 三子棋の胜负判断(洛谷P1838题题解,Java语言描述)
题目要求 P1838题目链接 分析 我在想是不是要把这个题再写成扫雷那样的矩阵判断,想换个feel,那就用Set来处理. 众所周知Set有好处,查找快,虽说这只是九宫格三子棋,但contains()就 ...
- 【C语言】三子棋游戏
目录标题 一.新建项 二.主函数 do while 三.打印菜单 四.三子棋的过程 1.棋盘数组 2.初始化棋盘 3.打印棋盘 4.下棋 4.1.玩家下棋 4.2.电脑下棋 4.3.判断游戏输赢 五. ...
- c语言程序下三子棋,C语言实现三子棋游戏(初级版)
本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...
- 洛谷——P1917 三子棋II
P1917 三子棋II 题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 虽然小a很努力地记录棋谱,可还是下不过uim. 由于小 ...
最新文章
- Linux 下Shell脚本删除过期文件
- Delphi动态数组详解
- java redis 多节点,Redis单机多节点集群部署,超简单
- 响应式编程 函数式编程_函数式编程的基本原理简介
- N35-第十四周作业
- vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类
- Linux上screen命令如何安装,Linux screen命令,Linux screen用法,Linux screen简单用法,Linux screen安装...
- PHP有哪些基本数据类,PHP的基本数据类型
- 【计算机网络】路由器与交换机
- python提示jsondecodeerror是什么意思_Python爬虫解析json遇到一类JSONDecodeError的解决方案...
- [洛谷]P1978 集合 (#数学 -1.3)(#STL -1.1)
- 20个最受欢迎商务旅游城市:纽约连续四年拿第一,上海第四
- Word邮件合并功能详解:合并后生成多个word文档,删除空白页
- recyclerview的条目添加点击事件
- 【企业】如何将零和博弈转换为正和博弈
- http,https
- 二叉树遍历之前序遍历,中序遍历,后序遍历
- go 及GoLand 环境安装
- 前端-element-ui
- 软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据
热门文章
- 华为手环8添加门禁卡操作指导
- MySQL FEDERATED
- MySQL5.7 Waiting FOR TABLE FLUSH
- 临时工与劳务工有哪些区别呢
- TYPE-C转DC转接头方案,取电芯片ECP5701支持5V、9V、12V、15V、20V电压输出
- 室内导航--机器视觉、ROS、Goseek(五)Goseek 虚拟室内环境准备
- 数字(1,2,3....)转为汉字(一,二,三....)
- Unity音乐播放器,安卓,Windows通用播放器Unity版本2019.4.13f1c1,附加安卓文件路径详解
- vue 鼠标点击特效动画(css3动画),水波纹动画效果
- 英语 单词 短语 笔记