1.菜单

我们先进行菜单打印的实现,如下:

void menu()
{printf("**********************************************\n");printf("************       1.play         ************\n");printf("************       0.exit         ************\n");printf("**********************************************\n");
}

菜单要求我们进行输出1/0,但是我们要考虑玩家可能输错的情况所以我们用switch语句来对玩家的输入进行一个反馈,如下:

 int input = 0;do{menu();printf("请输入(1/0):");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);

上面这段代码是在主函数中实现的,当然你也可将其打包到一个函数中,这里就不做展示了。

当玩家输入1时,进入游戏,下面我们来实现game里的内容。

2.初始化棋盘与打印棋盘

玩家要想玩三子棋首先肯定要有一个棋盘,三子棋的棋盘一共有9个空位,玩家将在这些空位上下棋,在游戏的过程中,我们是需要对玩家和电脑的下棋情况进行收录的,所以我们先创建一个数组,在里面全部初始化为 空格 ,实现如下:

void InitBoard(char board[ROW][COL], int row, int col)//初始化棋盘
{int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
void game()
{int ret = 1;int n = 0;char board[ROW][COL] = { 0 };InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);
}

这里要说明一下,ROW代表的是行,COL代表的是列,这是提前用define设置好的,后面会提到,row和col也是一样的意思,传过来是为了方便。

之后是打印棋盘,思路其实还是蛮简单的,循环加判断,相信大家都是可以理解的,就不细说明了,实现如下:

void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘
{int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}       //“   |”这是一次循环}           //当打印最后一次时不打印“|”//打印出来是   |   |   printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");//“---|”是一次循环}               //打印最后一次时不打印“|”}                   //打印出来是---|---|---}printf("\n");//             上面的两行加一起是一次循环}                              //最后一次循环不打印---|
}//打印出来是这样的效果
//   |   |
//---|---|---
//   |   |
//---|---|---
//   |   |   

而设置ROW和COL的目的就是将棋盘的打印变得可控,可以操控棋盘的大小。

3.玩家下棋和电脑下棋

玩家下棋很简单,玩家输入坐标(1~3)(1~3)后判断此位置是否有棋子,如果有则让其在输入一次,如果没有则记录下来,放到之前创建的数组board里。

void PlayMove(char board[ROW][COL], int row, int col)//玩家下棋
{int x, y;printf("玩家输入\n");while (1){printf("请输入坐标:");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col&&board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else if (x <= 0 || x > row || y <= 0 || y > col){printf("坐标非法,请重新输入\n");}else if (board[x - 1][y - 1] != ' '){printf("该坐标已被占用,请选择其他坐标\n");}}
}

电脑下棋我们将简单模式设置为随机下棋,下面是实现:

void ComputerMove0(char board[ROW][COL], int row, int col)
{Sleep(200);printf("电脑下棋\n");int x, y;while (1){x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

随机数的概念在《猜数字游戏》这篇博客里有说,这里就不细说明了。

简单的人机肯定不是我们想要的,那么复杂的人机该怎么实现呢?

很简单,三子棋玩的好的小伙伴们都知道,如果双方都是高手在不出失误的情况下是只能平局的,实现起来也好办,把情况都列举出来就好了,但是这样不仅玩家没有良好的游戏体验,代码也繁重,所以我们仅让电脑判断:

(下面是按照优先序排列的)

1)如果己方(电脑)在横排、竖排、斜排已有两个棋子,如果剩下的位置没有棋子,则下在此处

2)如果对方(玩家)在横排、竖排、斜排已有两个棋子,如果剩下的位置没有棋子,则下在此处

3)如果以上情况都没有那么中间优先下,没有则下四角,如果都没有空位,那么随机下。

下面是实现:

int ComputerMove1(char board[ROW][COL], int row, int col)
{int i = 0, j = 0, m = 1,n = 1;printf("电脑输入\n");while(i < row)//判断电脑是否有两个{if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == ' '){board[i][2] = '#';return 1;}if (board[i][0] == '#' && board[i][2] == '#' && board[i][1] == ' '){board[i][1] = '#';return 1;}if (board[i][1] == '#' && board[i][2] == '#' && board[i][0] == ' '){board[i][0] = '#';return 1;}if (board[0][j] == '#' && board[1][j] == '#' && board[2][j] == ' '){board[2][j] = '#';return 1;}if (board[0][j] == '#' && board[2][j] == '#' && board[1][j] == ' '){board[1][j] = '#';return 1;}if (board[1][j] == '#' && board[2][j] == '#' && board[0][j] == ' '){board[0][j] = '#';return 1;}i++;j++;}i = 0;j = 0;while (i < col)//判断玩家是否有两个{if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == ' '){board[i][2] = '#';return 1;}if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' '){board[i][1] = '#';return 1;}if (board[i][1] == '*' && board[i][2] == '*' && board[i][0] == ' '){board[i][0] = '#';return 1;}if (board[0][j] == '*' && board[1][j] == '*' && board[2][j] == ' '){board[2][j] = '#';return 1;}if (board[0][j] == '*' && board[2][j] == '*' && board[1][j] == ' '){board[1][j] = '#';return 1;}if (board[1][j] == '*' && board[2][j] == '*' && board[0][j] == ' '){board[0][j] = '#';return 1;}i++;j++;}if (board[1][1] == ' ')//中间{board[1][1] = '#';return 1;}else if (board[1][1] != ' ')//四角{if (board[0][0] == ' '){board[0][0] = '#';return 1;}else if (board[0][2] == ' '){board[0][2] = '#';return 1;}else if (board[2][0] == ' '){board[2][0] = '#';return 1;}else if (board[2][2] == ' '){board[2][2] = '#';return 1;}}else//随机{int x, y;while (1){x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] == ' '){board[x][y] = '#';break;}}return 1;}
}

这样一个困难的电脑就产生了。

4.判断输赢

我们需要在每次下棋(玩家或电脑)后进行判断输赢,如果玩家有三颗棋子连在一起,则玩家赢,如果电脑有三颗连在一起则电脑赢,如果棋盘满了也没有输赢则平局。

如果赢了或者平局则返回0,在game里判断是否返回0,如果是则结束本场游戏

下面是实现:

InitBoard(board, ROW, COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
while (1)
{PlayMove(board, ROW, COL);//玩家下棋DisplayBoard(board, ROW, COL);//打印棋盘ret = who_win(board, ROW, COL);//判断输赢if (ret == 0)break;ComputerMove0(board, ROW, COL);//电脑下棋DisplayBoard(board, ROW, COL);//打印棋盘ret = who_win(board, ROW, COL);//判断输赢if (ret == 0)break;
}
int who_win(char board[ROW][COL],int row, int col)
{int i, j, count = 0;for (i = 0; i < row; i++){if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*'){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#'){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}}for (i = 0; i < col; i++){if (board[0][i] == '*' && board[1][i] == '*' && board[2][i] == '*'){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if (board[0][i] == '#' && board[1][i] == '#' && board[2][i] == '#'){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}}if ((board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*') || (board[0][2] == '*' && board[1][1] == '*' && board[2][0] == '*')){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if ((board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#') || (board[0][2] == '#' && board[1][1] == '#' && board[2][0] == '#')){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != ' '){count++;}}}if (count == row * col){printf("平局了\n");Sleep(2000);system("cls");return 0;}return 1;
}

还有难度的选择,判断即可,下面是源代码(我是分文件写的):

主文件:

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("**********************************************\n");printf("************       1.play         ************\n");printf("************       0.exit         ************\n");printf("**********************************************\n");
}void game()
{int ret = 1;int n = 0;char board[ROW][COL] = { 0 };printf("请选择难度(0.简单/1.困难):");scanf("%d", &n);if (n == 0){InitBoard(board, ROW, COL);//初始化棋盘DisplayBoard(board, ROW, COL);//打印棋盘while (1){PlayMove(board, ROW, COL);//玩家下棋DisplayBoard(board, ROW, COL);//棋盘ret = who_win(board, ROW, COL);//判断输赢if (ret == 0)break;ComputerMove0(board, ROW, COL);//电脑下棋DisplayBoard(board, ROW, COL);//棋盘ret = who_win(board, ROW, COL);//判断输赢if (ret == 0)break;}}else if (n == 1){InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);while (1){PlayMove(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = who_win(board, ROW, COL);if (ret == 0)break;ComputerMove1(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = who_win(board, ROW, COL);if (ret == 0)break;}}else{printf("输入错误,默认选简单\n");InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);while (1){PlayMove(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = who_win(board, ROW, COL);if (ret == 0)break;ComputerMove0(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = who_win(board, ROW, COL);if (ret == 0)break;}}
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入(1/0):");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

game.h头文件:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>#define ROW 3
#define COL 3void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayMove(char board[ROW][COL], int row, int col);
void ComputerMove0(char board[ROW][COL], int row, int col);
int ComputerMove1(char board[ROW][COL], int row, int col);
int who_win(char board[ROW][COL], int row, int col);

game.cpp存放函数实现的文件:

#include "game.h"void InitBoard(char board[ROW][COL], int row, int col)//初始化棋盘
{int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘
{int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}
}void PlayMove(char board[ROW][COL], int row, int col)//玩家下棋
{int x, y;printf("玩家输入\n");while (1){printf("请输入坐标:");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col&&board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else if (x <= 0 || x > row || y <= 0 || y > col){printf("坐标非法,请重新输入\n");}else if (board[x - 1][y - 1] != ' '){printf("该坐标已被占用,请选择其他坐标\n");}}
}void ComputerMove0(char board[ROW][COL], int row, int col)//简单电脑
{Sleep(200);printf("电脑下棋\n");int x, y;while (1){x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}int ComputerMove1(char board[ROW][COL], int row, int col)//困难电脑
{int i = 0, j = 0, m = 1,n = 1;printf("电脑输入\n");while(i < row){if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == ' '){board[i][2] = '#';return 1;}if (board[i][0] == '#' && board[i][2] == '#' && board[i][1] == ' '){board[i][1] = '#';return 1;}if (board[i][1] == '#' && board[i][2] == '#' && board[i][0] == ' '){board[i][0] = '#';return 1;}if (board[0][j] == '#' && board[1][j] == '#' && board[2][j] == ' '){board[2][j] = '#';return 1;}if (board[0][j] == '#' && board[2][j] == '#' && board[1][j] == ' '){board[1][j] = '#';return 1;}if (board[1][j] == '#' && board[2][j] == '#' && board[0][j] == ' '){board[0][j] = '#';return 1;}i++;j++;}i = 0;j = 0;while (i < col){if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == ' '){board[i][2] = '#';return 1;}if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' '){board[i][1] = '#';return 1;}if (board[i][1] == '*' && board[i][2] == '*' && board[i][0] == ' '){board[i][0] = '#';return 1;}if (board[0][j] == '*' && board[1][j] == '*' && board[2][j] == ' '){board[2][j] = '#';return 1;}if (board[0][j] == '*' && board[2][j] == '*' && board[1][j] == ' '){board[1][j] = '#';return 1;}if (board[1][j] == '*' && board[2][j] == '*' && board[0][j] == ' '){board[0][j] = '#';return 1;}i++;j++;}if (board[1][1] == ' '){board[1][1] = '#';return 1;}else if (board[1][1] != ' '){if (board[0][0] == ' '){board[0][0] = '#';return 1;}else if (board[0][2] == ' '){board[0][2] = '#';return 1;}else if (board[2][0] == ' '){board[2][0] = '#';return 1;}else if (board[2][2] == ' '){board[2][2] = '#';return 1;}}else{int x, y;while (1){x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] == ' '){board[x][y] = '#';break;}}return 1;}
}int who_win(char board[ROW][COL],int row, int col)//判断输赢
{int i, j, count = 0;for (i = 0; i < row; i++){if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*'){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#'){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}}for (i = 0; i < col; i++){if (board[0][i] == '*' && board[1][i] == '*' && board[2][i] == '*'){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if (board[0][i] == '#' && board[1][i] == '#' && board[2][i] == '#'){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}}if ((board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*') || (board[0][2] == '*' && board[1][1] == '*' && board[2][0] == '*')){printf("玩家赢\n");Sleep(2000);system("cls");return 0;}if ((board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#') || (board[0][2] == '#' && board[1][1] == '#' && board[2][0] == '#')){printf("电脑赢\n");Sleep(2000);system("cls");return 0;}for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != ' '){count++;}}}if (count == row * col){printf("平局了\n");Sleep(2000);system("cls");return 0;}return 1;
}

以上就是三子棋的全部内容了。

三子棋的实现,人工智能与人工智障相关推荐

  1. 赠书 | 人工智能变“人工智障”?关于因果关系的新科学

    文末有福利哦! 每当别人跟我提起"无人驾驶"汽车技术如何强大,又被大众赋予了怎样的期待,我都会想起HBO电视剧Silicon Valley<硅谷>中的一个情节: 硅谷大 ...

  2. 人工智能还是人工智障?我tm快崩溃了

    哈喽,中生代的浪花们中午好 随着科技的发展 现在大家或多或少 都会使用一些人工智能产品 大到扫地机器人,小到智能音箱.Siri 但人工智能并不能保证永远「智能」 它们也有「智障」的时候 更别说 Sir ...

  3. 人工智能还是人工智障

    序言 有的时候感觉有脑子,有的时候感觉没有,到底是有还是没有呢? 机器人,有的很智能,有的很智障,是智能的时候可爱?还是在智障的时候可爱?你是惧怕智障还是惧怕人工智能. 风言风语 作为一个吵架之王,每 ...

  4. AI被攻击者滥用后,是人工智能还是“人工智障”?

    科技云报道原创. 当我们在享受AI技术带来的便捷与高效的同时,是否考虑过技术漏洞带来的严重后果?试想如果有人恶意利用AI技术去干扰IT系统的正常工作,结果会有多可怕呢? ​ AI技术正在被积极应用到各 ...

  5. 忽略这一点,人工智能变人工智障!

    作者 | The Economist 译者 | 弯月,责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) [编者按]当今社会,人工智能已进入我们生活的方方面面,很多人会担心算法的控制权过多 ...

  6. 忽略这一点,人工智能变人工智障的!

    [CSDN 编者按]当今社会,人工智能已进入我们生活的方方面面,很多人会担心算法的控制权过多,也有人担心数据有偏差的话,输出也会有偏差.对此,<Hello World>的作者介绍该如何采用 ...

  7. 最近爆火chatGTP是人工智能还是人工智障?

    关于chatGTP和一些话题? OpenAI 发布了 ChatGPT,是一个可以对话的方式进行交互的模型,因为它的智能化,得到了很多用户的欢迎. ChatGPT是InstructGPT的兄弟模型,可以 ...

  8. 语音助手究竟是“人工智能”还是“人工智障?

    很快我们就能够跟微波炉说话了,而且它会听从你的指令--如果你坚持这样做的话. 最近亚马逊宣布推出了售价 60 美元的声控微波炉,以及使用 Alexa 语音助手的其他 10 款产品.当然你可以不屑一顾, ...

  9. C语言实现三子棋(不是人工智障哈哈哈)

    目前为止学了分支,循环,数组和函数,现在利用这些知识来写一个三子棋小游戏来巩固加深所学哈哈哈 目录 1.测试结果 2. 整体思路 3.代码模块解读 (1).打印菜单 (2).初始化棋盘 (3).打印棋 ...

最新文章

  1. 2022-2028年中国高强度钢行业投资分析及前景预测报告
  2. php关系运算符语句,PHP基础__运算符和逻辑语句(三)
  3. java新特性对数组的支持
  4. eclipse中java获取js的值_javascript – 如何在Eclipse中使用Selenium将外部.js导入我的Java测试?...
  5. html设置返回的样式,jQuery设置或返回元素样式属性。
  6. swiper移入暂停_react中swiper注意事项及鼠标划入停止轮播
  7. linux头文件 库,Linux操作系统的头文件和库文件搜索路径
  8. 用matlab抽样定理验证,MATLAB抽样定理验证.docx
  9. 【C语言】(数组方式)求n名同学的平均成绩
  10. 冲刺一团队五亲亲精英队
  11. [luogu3369]普通平衡树(替罪羊树模板)
  12. 推导抛物线插值的拉格朗日插值公式
  13. 华为“最青睐”的10所大学,有你的大学么?
  14. 《科学》:基因编辑婴儿入选年度“科学崩坏”事件
  15. 只要花3K 手把手教你制作炫酷的MR混合现实视频
  16. Util: Java生成文件的md5文件方法的代码
  17. Rikka with Travels
  18. 计算机应用基础统考2019年6月,2019年6月网络教育统考《计算机应用基础》模拟题...
  19. mongodb 查询数据排序
  20. 计算机配件及其对应作用,电脑配件与每个配件作用详细完整的解释

热门文章

  1. 银灰的拳击机器人_明日方舟:银灰画师对新泳装皮肤致歉 年一游果然名不虚传...
  2. 2021年广东省房地产发展概况分析:广州市商品住宅成交面积1222万㎡[图]
  3. SQL Server中Rowcount与@@Rowcount的用法
  4. 12天搞定Python,基础语法(上)
  5. supercard游戏系统开发
  6. 亚马逊新手入门:论什么是跟卖?
  7. 亚马逊跟卖的一点建议
  8. 在html中设置margin属性,css中margin的4个属性
  9. 对图片字符进行定位及分割(python+cv2)
  10. 【Linux】Ubuntu中文输入法的配置和系统时间的设置