小游戏——三子棋(智能)

2024-01-18 18:40
文章标签 智能 三子 小游戏

本文主要是介绍小游戏——三子棋(智能),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三子棋就是人们俗称的井字棋,只要三个棋子连成一条直线,就赢了。但如果两个人都掌握了技巧,一般来说都是平局。所以就需要把电脑写的智能一些,这样才好玩。


先来屡一下思路:
1.打印棋盘
先来看图,我们预期想要打印出来的棋盘是以下的样式,但要如何才能打印出呢?
假设打印3*3的棋盘,我们来观察一下规律:(□表示空格)
第一行是:□%c□|□%c□|□%c□
第二行是:---|---|---
第三行是:□%c□|□%c□|□%c□
第四行是:---|---|---
第五行是:□%c□|□%c□|□%c□
在打印棋盘的时候可以将上面的分解为□%c□|---|,通过行、列(row、col)来控制打印。(若需要扩展棋盘,只需修改row、col的值即可)

这里写图片描述

2.电脑走
无论玩家先走还是电脑先走,要是最中间空着,电脑的一步一定是走最中间,接着走四角中的一个,然后电脑就可以判断那条线上若有两个相同的棋子,就走这条线上第三个位子,当有自己的棋子和对手的棋子都为两个的时候,先走自己的位子。(我是通过列出所有可能出现的情况来实现智能的)

3.玩家走
玩家走是玩家输入,没什么好说的,但要有一点要注意,玩家数的坐标值比数组的坐标值大1,可以在玩家输入后通过自减的方式,完美的解决这个问题。

4.判断输赢
有三个棋子连成一条线就胜利,或者棋盘满了都没有胜者,这样就为平局。


这里同扫雷一样,这里也是在工程里创建三个文件:测试文件、游戏文件和头文件,来分装代码(如下图)


这里写图片描述


三子棋相对扫雷来说比较简单,这里就直接给出我的三子棋的源代码:
game.h

#ifndef _GAME_H__
#define _GAME_H__#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>#define ROW 3
#define COL 3void Init(char board[ROW][COL],int row, int col);//初始化棋盘
void Print(char board[ROW][COL],int row, int col);//打印棋盘
void Computer_go(char board[ROW][COL],int row,int col);//电脑走
void Player_go(char board[ROW][COL],int row,int col);//玩家走
char Iswin(char board[ROW][COL],int row,int col);//判断是否有玩家胜出#endif //_GAME_H__

test.c

#include "game.h"void menu()
{printf("***********************************\n");printf("*     welcome~ o(* ̄︶ ̄*)o~      *\n");printf("*             1.play              *\n");printf("*             0.exit              *\n");printf("***********************************\n");
}void game()
{int input = 0;int ret = 0;char chess_board[ROW][COL] = {0};Init(chess_board,ROW,COL);//初始化棋盘Print(chess_board,ROW,COL);//打印棋盘do{printf("请选择下棋顺序:1.电脑先走  2.玩家先走\n");scanf("%d",&input);switch(input){case 1:break;case 2:Player_go(chess_board,ROW,COL);//玩家走break;default:printf("请重新输入:");break;}}while((input!=1)&&(input!=2));while(1){Computer_go(chess_board,ROW,COL);Print(chess_board,ROW,COL);ret = Iswin(chess_board,ROW,COL);判断是否有玩家胜出if(ret != ' '){break;}Player_go(chess_board,ROW,COL);Print(chess_board,ROW,COL);ret = Iswin(chess_board,ROW,COL);//判断是否有玩家胜出if(ret != ' '){break;}}//电脑赢        x//玩家赢        o//平局          =//游戏继续     空格if(ret == 'x'){printf("电脑赢\n");}if(ret == 'o'){printf("玩家赢\n");}if(ret == '='){printf("平局\n");}Print(chess_board,ROW,COL);}
void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();//打印菜单printf("请选择:");scanf("%d",&input);switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("请重新输入:\n");break;}}while(input);
}
int main()
{test();return 0;
}

game.c

#include "game.h"
void Init(char board[ROW][COL],int row, int col)//初始化棋盘
{//int i = 0;//int j = 0;//for(i=0; i<row; i++)//{//  for(j=0; j<col; j++)//  {//      chess_board[i][j]=' ';//  }//}memset(board,' ',sizeof(board[0][0])*row*col );
}void Print(char board[ROW][COL],int row, int col)//打印棋盘
{int i = 0;int j = 0;for(i=0; i<row; i++){for(j=0; j<col; j++){if(i<row){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");}
}
static void concern(char board[ROW][COL])//四个角选一个下棋
{int c = rand()%4+1;//1-4switch(c){case 1:board[0][0] = 'x';break;case 2:board[0][2] = 'x';break;case 3:board[2][0] = 'x';break;case 4:board[2][2] = 'x';break;}
}
void Computer_go(char board[ROW][COL],int row,int col)//电脑走
{int i = 0;int j = 0;int flag = 0;if(board[1][1]==' '){board[1][1] = 'x';flag = 1;//电脑走中间return ;}if(flag==1)//中间有棋{concern(board);//走四个角的一个flag = 0;return ;}for(i=0; i<3; i++)//{if(board[i][1]==board[i][0] && board[i][2]==' ' && board[i][1]=='x'){board[i][2] = 'x';return ;}else if(board[i][1]==board[i][0] && board[i][2]==' ' && board[i][1]=='o'){board[i][2] = 'x';return ;}else if(board[i][1]==board[i][2] && board[i][0]==' ' && board[i][1]=='x'){board[i][0] = 'x';return ;}else if(board[i][1]==board[i][2] && board[i][0]==' ' && board[i][1]=='o'){board[i][0] = 'x';return ;}else if(board[i][0]==board[i][2] && board[i][1]==' ' && board[i][0]=='x'){board[i][1] = 'x';return ;}else if(board[i][0]==board[i][2] && board[i][1]==' ' && board[i][0]=='o'){board[i][1] = 'x';return ;}}for(j=0; j<col; j++){if(board[1][j]==board[0][j] && board[2][j]==' ' && board[1][j]=='x'){board[2][j] = 'x';return ;}else if(board[1][j]==board[0][j] && board[2][j]==' ' && board[1][j]=='o'){board[2][j] = 'x';return ;}else if(board[1][j]==board[2][j] && board[0][j]==' ' && board[1][j]!='x'){board[0][j] = 'x';return ;}else if(board[1][j]==board[2][j] && board[0][j]==' ' && board[1][j]!='o'){board[0][j] = 'x';return ;}else if(board[0][j]==board[2][j] && board[1][j]==' ' && board[0][j]=='x'){board[1][j] = 'x';return ;}else if(board[0][j]==board[2][j] && board[1][j]==' ' && board[0][j]=='o'){board[1][j] = 'x';return ;}}if(board[1][1]==board[0][2] && board[2][0]==' ' && board[1][1]=='x'){board[2][0] = 'x';return ;}else if(board[1][1]==board[0][2] && board[2][0]==' ' && board[1][1]=='o'){board[2][0] = 'x';return ;}else if(board[1][1]==board[2][0] && board[0][2]==' ' && board[1][1]=='x'){board[0][2] = 'x';return ;}else if(board[1][1]==board[2][0] && board[0][2]==' ' && board[1][1]=='o'){board[0][2] = 'x';return ;}else if(board[1][1]==board[0][0] && board[2][2]==' ' && board[1][1]=='x'){board[2][2] = 'x';return ;}else if(board[1][1]==board[0][0] && board[2][2]==' ' && board[1][1]=='o'){board[2][2] = 'x';return ;}else if(board[1][1]==board[2][2] && board[0][0]==' ' && board[1][1]=='x'){board[0][0] = 'x';return ;}else if(board[1][1]==board[2][2] && board[0][0]==' ' && board[1][1]=='o'){board[0][0] = 'x';return ;}while(1){i = rand()%row;j = rand()%col;if(board[i][j]==' '){board[i][j]='x';break;}}
}
void Player_go(char board[ROW][COL],int row,int col)//玩家走
{int x = 0;int y = 0;while(1){printf("玩家走,请输入坐标:");scanf("%d%d",&x,&y);x--;//玩家输入的坐标比数组的坐标大1y--;if(((x>=0)&&(x<row))&&((y>=0)&&(y<col)))//坐标合法{if(board[x][y]==' '){board[x][y]='o';break;}else{printf("该坐标已被占用,请重新输入:\n");}}else{printf("该坐标超出棋盘范围,请重新输入:\n");}}
}static int Full_board(char board[ROW][COL],int row,int col)//判断棋盘是否满了
{int i = 0;int j = 0;for(i=0; i<row; i++){for(j=0; j<col; j++){if(board[i][j]==' ')return 0;}}return 1;
}char Iswin(char board[ROW][COL],int row,int col)//判断是否有玩家胜出
{int i = 0;int j = 0;int count = 0;for(i=0; i<row; i++)//行{for(j=1; j<col-1; j++){if((board[i][j-1]==board[i][j])&&(board[i][j]== board[i][j+1])&&(board[i][j]!=' ')){return board[i][j];}}}for(i=1; i<row-1; i++)//列{for(j=0; j<col; j++){if((board[i-1][j]==board[i][j])&&(board[i][j]==board[i+1][j])&&(board[i][j]!=' ')){return board[i][j];}}}for(i=1; i<row-1; i++)//斜{for(j=1; j<col-1; j++){if((board[i-1][j-1]==board[i][j])&&(board[i][j]==board[i+1][j+1])&&(board[i][j]!=' ')){return board[i][j];}}}for(i=0; i<row; i++)//斜{for(j=1; j<col-1; j++){if((board[i-1][j+1]==board[i][j])&&(board[i][j]==board[i+1][j-1])&&(board[i][j]!=' ')){return board[i][j];}}}if(Full_board(board,ROW,COL))//棋盘满,平局{return '=';}return ' ';
}

运行结果如下:


这里写图片描述


这里写图片描述


这里写图片描述


END

这篇关于小游戏——三子棋(智能)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619903

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的

自动化表格处理的革命:智能文档系统技术解析

在当今数据驱动的商业环境中,表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能,通过精准识别和处理各种通用表格,显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在表格识别方面的关键技术和应用优势,以及如何通过行业定制化服务满足不同行业的需求。 1. 通用表格识别 智能文档系统通过先进的OCR技术和表格结构识别算法,能够精准