实现三子棋

①:

  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日志---三子棋相关推荐

  1. C语言小游戏快速入门--三子棋

    目录 一.前言 二.游戏界面 三.游戏逻辑 1.game.h 2.game.c 3.test.c 四.总结 一.前言 这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来.在这里博主实现的 ...

  2. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...

  3. C语言小游戏——三子棋

    C语言 -- 三子棋 本篇主要是用二维数组和多个函数来实现三子棋游戏. 让我们先来看看这个编写这个游戏的思路:首先要打印三子棋的棋盘,然后是玩家下棋,电脑下棋,最后判断谁赢了,或者看看是否平局. 我们 ...

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

    一.问题概述 大家都玩过棋盘游戏吧,像五子棋一样,玩家或者是电脑一人下一次,当玩家或者是电脑的某一方先将各自的五个棋子下成一条线时,谁就赢,棋盘游戏就会结束. 当然,我今天要介绍的是三子棋,和五子棋的 ...

  5. c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

    本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与 ...

  6. 三子棋の胜负判断(洛谷P1838题题解,Java语言描述)

    题目要求 P1838题目链接 分析 我在想是不是要把这个题再写成扫雷那样的矩阵判断,想换个feel,那就用Set来处理. 众所周知Set有好处,查找快,虽说这只是九宫格三子棋,但contains()就 ...

  7. 【C语言】三子棋游戏

    目录标题 一.新建项 二.主函数 do while 三.打印菜单 四.三子棋的过程 1.棋盘数组 2.初始化棋盘 3.打印棋盘 4.下棋 4.1.玩家下棋 4.2.电脑下棋 4.3.判断游戏输赢 五. ...

  8. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  9. 洛谷——P1917 三子棋II

    P1917 三子棋II 题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 虽然小a很努力地记录棋谱,可还是下不过uim. 由于小 ...

最新文章

  1. Linux 下Shell脚本删除过期文件
  2. Delphi动态数组详解
  3. java redis 多节点,Redis单机多节点集群部署,超简单
  4. 响应式编程 函数式编程_函数式编程的基本原理简介
  5. N35-第十四周作业
  6. vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类
  7. Linux上screen命令如何安装,Linux screen命令,Linux screen用法,Linux screen简单用法,Linux screen安装...
  8. PHP有哪些基本数据类,PHP的基本数据类型
  9. 【计算机网络】路由器与交换机
  10. python提示jsondecodeerror是什么意思_Python爬虫解析json遇到一类JSONDecodeError的解决方案...
  11. [洛谷]P1978 集合 (#数学 -1.3)(#STL -1.1)
  12. 20个最受欢迎商务旅游城市:纽约连续四年拿第一,上海第四
  13. Word邮件合并功能详解:合并后生成多个word文档,删除空白页
  14. recyclerview的条目添加点击事件
  15. 【企业】如何将零和博弈转换为正和博弈
  16. http,https
  17. 二叉树遍历之前序遍历,中序遍历,后序遍历
  18. go 及GoLand 环境安装
  19. 前端-element-ui
  20. 软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据

热门文章

  1. 华为手环8添加门禁卡操作指导
  2. MySQL FEDERATED
  3. MySQL5.7 Waiting FOR TABLE FLUSH
  4. 临时工与劳务工有哪些区别呢
  5. TYPE-C转DC转接头方案,取电芯片ECP5701支持5V、9V、12V、15V、20V电压输出
  6. 室内导航--机器视觉、ROS、Goseek(五)Goseek 虚拟室内环境准备
  7. 数字(1,2,3....)转为汉字(一,二,三....)
  8. Unity音乐播放器,安卓,Windows通用播放器Unity版本2019.4.13f1c1,附加安卓文件路径详解
  9. vue 鼠标点击特效动画(css3动画),水波纹动画效果
  10. 英语 单词 短语 笔记