IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 五子棋 面向对象实现 -> 正文阅读

[C++知识库]C++ 五子棋 面向对象实现

(上大学后重学C++系列)
虽然标题是面向对象,但是写出来感觉和面向过程也差不多。

写了两个多小时,但是只实现了基本的双人对弈功能…

棋盘的样式参考了这一篇

|---|---|
| X | O |
|---|---|

wsad控制光标移动,回车下子。控制光标的方法参考了这篇blog
然后不回显的输入字符用的getch(),注意windows下getch读回车是读的’\r\n’,也就是只保留了 ‘\r’。
判断是否连成五子的方式是每下一步就检测其四条线上是否有连续相邻的5个子。

Code:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<conio.h>
#include<windows.h>
struct Position{
	int x,y;
};
class ChessBoard{
	private:
		int sta[25][25];
		HANDLE Cursor;
	public:
		int winner,N;//N: 棋盘大小
		ChessBoard(){
			N=17,memset(sta,0,sizeof sta),winner=0;
			Cursor = GetStdHandle(STD_OUTPUT_HANDLE);
		}
		void show(){
			system("cls");
			char ch[3]={' ','O','X'};
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++) printf("|---");
				printf("|\n");
				for(int j=1;j<=N;j++) printf("| %c ",ch[sta[i][j]]);
				printf("|\n");
			}
			for(int j=1;j<=N;j++) printf("|---");
			printf("|\n");
		}
		void movecursor(Position p){
			SetConsoleCursorPosition(Cursor,{p.y*4-2,p.x*2-1});
		}
		bool checkwin(int x,int y){
			int dir[4][2][2]={{{-1,0},{1,0}},{{0,-1},{0,1}},{{-1,-1},{1,1}},{{-1,1},{1,-1}}};
			int t=sta[x][y];
			for(int k=0;k<4;k++){
				int L=1,R=1;
				while(sta[x+L*dir[k][0][0]][y+L*dir[k][0][1]]==t) L++;
				while(sta[x+R*dir[k][1][0]][y+R*dir[k][1][1]]==t) R++;
				if(L+R>5) return 1;
			}
			return 0;
		}
		Position Setchess(int type, Position p){
			movecursor(p);
			char ch;
			while((ch=getch())!='\r'||sta[p.x][p.y]!=0){
				if(ch=='w'&&p.x>1) p.x--;
				if(ch=='s'&&p.x<N) p.x++;
				if(ch=='a'&&p.y>1) p.y--;
				if(ch=='d'&&p.y<N) p.y++;
				movecursor(p);
			}
			sta[p.x][p.y] = type;
			winner = checkwin(p.x,p.y) ? type : 0;
			return p;
		}
};
class Player{
	public:
		char name[25];
		int chesstype;
		Position p;
		void init(int id,int N){
			chesstype = id;
			p.x = p.y = (N+1)/2;
			printf("Please enter player %d 's name: (without space)\n",id);
			scanf("%s",name);
		}
};
class Game{
	public:
		void Prepare(){
			printf("------ Gobang Instructions ------\n");
			printf("Use 'w', 's', 'a', 'd' to move the cursor.\n");
			printf("Push 'Enter' to set the chess.\n\n");
			printf("Now Push 'Enter' to start the game.\n");
			while(getch()!='\r');
		}
		void start(){
			Prepare();
			ChessBoard Board;
			Player A,B;
			A.init(1,Board.N),B.init(2,Board.N);
			Board.show();
			int win = 0;
			for(int t=0;Board.winner==0;t=!t){
				if(t==0){
					printf("It's %s's turn.\n",A.name);
					A.p = Board.Setchess(A.chesstype,B.p);
				}
				else{
					printf("It's %s's turn.\n",B.name);
					B.p = Board.Setchess(B.chesstype,A.p);
				}
				Board.show();
			}
			printf("Player %s wins!\n",Board.winner==A.chesstype?A.name:B.name);
		}
};
int main()
{
	Game G;
	G.start();
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:50:34  更:2022-03-03 15:57:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:29:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码