首页 > 代码库 > 井字棋游戏
井字棋游戏
#include "Board.h"
Board::Board(){
size = 10;
s = new char[9];
set(); //对于棋盘的初始化
}
char Board::getS(int i){
return s[i];
}
int Board::getSize(){
return size;
}
Board::Board(Board &c){
size = c.size;
s = new char[c.size];
set(); //对于棋盘的初始化
}
void Board::set(){ //对于棋盘的初始化 ,将每个位置均编号,对于未落子的位置记为数字;
for(int i=0;i<size;i++){
s[i]= i +‘0‘;
}
count = 0;
}
int Board::show(int n){
if(n==0){
cout<<"使用的是下面的这一个棋盘,相应数字对应于相应位置, 输入相应数字即可在相应位置落子"<<endl;
}
char w; //把数字转化为字符,对于棋局布置规避了数字表示,而采用
w = n + ‘0‘; //数值得字符形式,避免数字使用时的不可知错误
if(n>9||n<0){ //在屏幕上九个位置对应于1-9;这里排除不合法输入
cout<<" 这个输入不合规则,请重新选定落子位置!"<<endl;
return -1; //位置非法,返回-1;对应输入重新输,传回twoplayer函数
}
if(s[n]==w||s[n]==‘0‘){
if(count%2==0) //应用奇数偶数之间交替实现落子交替
s[n]=‘x‘;
else
s[n]=‘o‘;
count++; //记录输入次数并记录交替
cout<<endl; //显示格子并显示输出,显示棋局过程
cout<<" "<<s[7]<<" || "<<s[8]<<" || "<<s[9]<<" "<<endl;
cout<<" ****************"<<endl;
cout<<" "<<s[4]<<" || "<<s[5]<<" || "<<s[6]<<" "<<endl;
cout<<" ****************"<<endl;
cout<<" "<<s[1]<<" || "<<s[2]<<" || "<<s[3]<<" "<<endl;
cout<<endl<<endl;
}
else {
// cout<<"这个位置已经被占据了,请重新落子!!"<<endl;
return -1; //位置被占据,不合法,返回-1,要求重新输入
}
}
int Board::reset(){ //用于未分胜负或者一局完成时继续比赛的重置
cout<<" 你想再来一局吗?"<<endl;
int replay;
cout<<"是(请输入 1 ) , 否 ( 请输入 0 )"<<endl;
cin>>replay; //对所以数据恢复初始状态
while(replay!=0&&replay!=1){
cout<<"选择输入不合理,确定是否再来一局,输入1(是) 0(否)";
cin>>replay;
}
return replay; //返回数值,确定需要重新开始
}
int Board::viewO(){
if(s[1]==‘o‘&&s[2]==‘o‘&&s[3]!=‘x‘) return 3;
else if(s[1]==‘o‘&&s[3]==‘o‘&&s[2]!=‘x‘) return 2;
else if(s[3]==‘o‘&&s[2]==‘o‘&&s[1]!=‘x‘) return 1;
else if(s[3]==‘o‘&&s[5]==‘o‘&&s[7]!=‘x‘) return 7;
else if(s[7]==‘o‘&&s[5]==‘o‘&&s[3]!=‘x‘) return 3;
else if(s[3]==‘o‘&&s[7]==‘o‘&&s[5]!=‘x‘) return 5;
else if(s[4]==‘o‘&&s[5]==‘o‘&&s[6]!=‘x‘) return 6;
else if(s[4]==‘o‘&&s[6]==‘o‘&&s[5]!=‘x‘) return 5;
else if(s[5]==‘o‘&&s[6]==‘o‘&&s[4]!=‘x‘) return 4;
else if(s[7]==‘o‘&&s[8]==‘o‘&&s[9]!=‘x‘) return 9;
else if(s[7]==‘o‘&&s[9]==‘o‘&&s[8]!=‘x‘) return 8;
else if(s[8]==‘o‘&&s[9]==‘o‘&&s[7]!=‘x‘) return 7;
else if(s[1]==‘o‘&&s[4]==‘o‘&&s[7]!=‘x‘) return 7;
else if(s[1]==‘o‘&&s[7]==‘o‘&&s[4]!=‘x‘) return 4;
else if(s[7]==‘o‘&&s[4]==‘o‘&&s[1]!=‘x‘) return 1;
else if(s[2]==‘o‘&&s[5]==‘o‘&&s[8]!=‘x‘) return 8;
else if(s[8]==‘o‘&&s[2]==‘o‘&&s[5]!=‘x‘) return 5;
else if(s[5]==‘o‘&&s[8]==‘o‘&&s[2]!=‘x‘) return 2;
else if(s[3]==‘o‘&&s[6]==‘o‘&&s[9]!=‘x‘) return 9;
else if(s[6]==‘o‘&&s[9]==‘o‘&&s[3]!=‘x‘) return 3;
else if(s[3]==‘o‘&&s[9]==‘o‘&&s[6]!=‘x‘) return 6;
else if(s[1]==‘o‘&&s[5]==‘o‘&&s[9]!=‘x‘) return 9;
else if(s[1]==‘o‘&&s[9]==‘o‘&&s[5]!=‘x‘) return 5;
else if(s[9]==‘o‘&&s[5]==‘o‘&&s[1]!=‘x‘) return 1;
else return 100;
}
int Board::viewX(){
if(s[1]==‘x‘&&s[5]==‘x‘&&s[9]!=‘o‘) return 9;
else if(s[1]==‘x‘&&s[9]==‘x‘&&s[5]!=‘o‘) return 5;
else if(s[9]==‘x‘&&s[5]==‘x‘&&s[1]!=‘o‘) return 1;
else if(s[3]==‘x‘&&s[6]==‘x‘&&s[9]!=‘o‘) return 9;
else if(s[3]==‘x‘&&s[9]==‘x‘&&s[6]!=‘o‘) return 6;
else if(s[6]==‘x‘&&s[9]==‘x‘&&s[3]!=‘o‘) return 3;
else if(s[3]==‘x‘&&s[5]==‘x‘&&s[7]!=‘o‘) return 7;
else if(s[7]==‘x‘&&s[5]==‘x‘&&s[3]!=‘o‘) return 3;
else if(s[3]==‘x‘&&s[7]==‘x‘&&s[5]!=‘o‘) return 5;
else if(s[1]==‘x‘&&s[2]==‘x‘&&s[3]!=‘o‘) return 3;
else if(s[1]==‘x‘&&s[3]==‘x‘&&s[2]!=‘o‘) return 2;
else if(s[3]==‘x‘&&s[2]==‘x‘&&s[1]!=‘o‘) return 1;
else if(s[4]==‘x‘&&s[5]==‘x‘&&s[6]!=‘o‘) return 6;
else if(s[4]==‘x‘&&s[6]==‘x‘&&s[5]!=‘o‘) return 5;
else if(s[5]==‘x‘&&s[6]==‘x‘&&s[4]!=‘o‘) return 4;
else if(s[7]==‘x‘&&s[8]==‘x‘&&s[9]!=‘o‘) return 9;
else if(s[7]==‘x‘&&s[9]==‘x‘&&s[8]!=‘o‘) return 8;
else if(s[8]==‘x‘&&s[9]==‘x‘&&s[7]!=‘o‘) return 7;
else if(s[2]==‘x‘&&s[5]==‘x‘&&s[8]!=‘o‘) return 8;
else if(s[8]==‘x‘&&s[2]==‘x‘&&s[5]!=‘o‘) return 5;
else if(s[5]==‘x‘&&s[8]==‘x‘&&s[2]!=‘o‘) return 2;
else if(s[1]==‘x‘&&s[4]==‘x‘&&s[7]!=‘o‘) return 7;
else if(s[1]==‘x‘&&s[7]==‘x‘&&s[4]!=‘o‘) return 4;
else if(s[4]==‘x‘&&s[7]==‘x‘&&s[1]!=‘o‘) return 1;
else return 100;
}
#include<iostream>
#include<string>
using namespace std;
#ifndef BOARD
#define BOARD
class Board{
private:
char *s;
int size;
int count;
public:
char getS(int i);
int getSize();
Board();
Board(Board&);
int show(int n);
void set();
int reset();
int viewO();
int viewX();
};
#endif
#include<iostream>
#include "GamePlay.h"
GamePlay::GamePlay(){
pvc = new Play_vs_Computer;
b = new Play_vs_Play;
modal();
};
GamePlay::~GamePlay(){
delete pvc;
delete b;
}
void GamePlay::modal(){
int n;
cout<<" ****欢迎参加本款五子棋的使用****"<<endl;
cout<<"****以下是棋盘的位置分布,每个数字对应于一个位置,输入相应数字即可在相应位置落子****"<<endl;
cout<<endl; //显示格子并显示输出,显示棋局过程
cout<<" "<<7<<" || "<<8<<" || "<<9<<" "<<endl;
cout<<" ****************"<<endl;
cout<<" "<<4<<" || "<<5<<" || "<<6<<" "<<endl;
cout<<" ****************"<<endl;
cout<<" "<<1<<" || "<<2<<" || "<<3<<" "<<endl;
cout<<endl<<endl;
cout<<" ----使用‘O’或 ‘X’连成一线即为赢家----"<<endl;
cout<<"人 人对战请输入--- 1 :"<<endl;
cout<<"人 机对战请输入--- 2 :"<<endl;
cin>>n;
if(n!=1&&n!=2){
int t;
cout<<"选择不合理,请再输入一遍: ";
cin>>t;
n=t;
}
if(n==1){
b->Play();
}
if(n==2){
pvc->Play();
}
}
#include<iostream>
#include<string>
#include "Judge.h"
#include "Board.h"
#include "Play_vs_Play.h"
#include "Play_vs_Computer.h"
using namespace std;
#ifndef GAMEPLAY
#define GAMEPLAY
class GamePlay{
private:
Play_vs_Play *b;
Play_vs_Computer *pvc;
public:
GamePlay();
~GamePlay();
void modal();
};
#endif
#include "Judge.h"
Judge::Judge(){
score = 0;
}
Judge::Judge(Judge &a){
score = a.score;
}
int Judge::getScore(){
return score;
}
void Judge::addScore(){
score += 2;
}
int Judge::judge(Board &board){
if(board.getS(1)==‘o‘&&board.getS(2)==‘o‘&&board.getS(3)==‘o‘){
addScore(); return -1;
}
if(board.getS(4)==‘o‘&&board.getS(5)==‘o‘&&board.getS(6)==‘o‘){
addScore(); return -1;
}
if(board.getS(7)==‘o‘&&board.getS(8)==‘o‘&&board.getS(9)==‘o‘){
addScore(); return -1;
}
if(board.getS(1)==‘o‘&&board.getS(5)==‘o‘&&board.getS(9)==‘o‘){
addScore(); return -1;
}
if(board.getS(2)==‘o‘&&board.getS(5)==‘o‘&&board.getS(8)==‘o‘){
addScore(); return -1;
}
if(board.getS(3)==‘o‘&&board.getS(5)==‘o‘&&board.getS(7)==‘o‘){
addScore(); return -1;
}
if(board.getS(1)==‘o‘&&board.getS(4)==‘o‘&&board.getS(7)==‘o‘){
addScore(); return -1;
}
if(board.getS(2)==‘o‘&&board.getS(5)==‘o‘&&board.getS(8)==‘o‘){
addScore(); return -1;
}
if(board.getS(3)==‘o‘&&board.getS(6)==‘o‘&&board.getS(9)==‘o‘){
addScore(); return -1;
}
if(board.getS(1)==‘x‘&&board.getS(2)==‘x‘&&board.getS(3)==‘x‘){
addScore(); return -2;
}
if(board.getS(4)==‘x‘&&board.getS(5)==‘x‘&&board.getS(6)==‘x‘){
addScore(); return -2;
}
if(board.getS(7)==‘x‘&&board.getS(8)==‘x‘&&board.getS(9)==‘x‘){
addScore(); return -2;
}
if(board.getS(1)==‘x‘&&board.getS(5)==‘x‘&&board.getS(9)==‘x‘){
addScore(); return -2;
}
if(board.getS(2)==‘x‘&&board.getS(5)==‘x‘&&board.getS(8)==‘x‘){
addScore(); return -2;
}
if(board.getS(3)==‘x‘&&board.getS(5)==‘x‘&&board.getS(7)==‘x‘){
addScore(); return -2;
}
if(board.getS(1)==‘x‘&&board.getS(4)==‘x‘&&board.getS(7)==‘x‘){
addScore(); return -2;
}
if(board.getS(2)==‘x‘&&board.getS(5)==‘x‘&&board.getS(8)==‘x‘){
addScore(); return -2;
}
if(board.getS(3)==‘x‘&&board.getS(6)==‘x‘&&board.getS(9)==‘x‘){
addScore(); return -2;
}
}
void Judge::setScore(int n){
score = score + n;
}
#include<iostream>
#include "Board.h"
using namespace std;
#ifndef JUDGE
#define JUDGE
class Judge{
private:
int score;
public:
Judge();
Judge(Judge&);
void addScore();
void setScore(int n);
int getScore();
int judge(Board &board);
};
#endif
#include<iostream>
#include<string>
#include <cstdlib>
#include<ctime>
#include "Play_vs_Computer.h"
#include "Board.h"
Play_vs_Computer::Play_vs_Computer(){
name = "Unitil" ;
Computername = "Computer_player";
judger = new Judge;
board = new Board;
}
void Play_vs_Computer::setname(string a){
name = a;
}
string Play_vs_Computer::getName(){
return name;
}
void Play_vs_Computer::BuildPlayer(){
string s1,s2;
cout<<"请输入player号的名字: ";
cin>>s1;
setname(s1);
}
void Play_vs_Computer::Play(){
srand(time(0));
BuildPlayer();
int flag = 1;
while(flag==1){
board->set();
board->show(0);
cout<<"请玩家确认是否先手: 是(输入1) ————否(输入 0)"<<endl;
int first;
cin>>first;
if(first!=1&&first!=0){
cout<<"选择不合理,请重新输入: ";
cin>>first;
}
if(first==1){
cout<<"现在是["<<name<<"]先手: 使用的是( O )"<<endl;
}
if(first==0){
cout<<"现在是["<<Computername<<"]先手:使用的是( O )"<<endl;
}
if(first==1){
for(int ii=0;ii<9;ii++){ //九次落子交替
int ts;
if(ii%2==0){
cout<<"请["<<name<<"]落子: ";
cin>>ts;
while(board->show(ts)==-1){ //判断落子位置是否被占据,占据则重输
cout<<"这个位置已经被占据了!!"<<endl;
int t;
cout<<"请["<<getName()<<"]重新落子: ";
cin>>t;
ts = t;
}
}
else {
cout<<"[Computer_player]落子: ";
if(ii==1&&ts==5){
int b;
b=rand()%9+1;
while(b%2!=1||b==5){
b=rand()%9+1;
}
board->show(b);
}
if(ii==1&&(ts==1||ts==3||ts==9||ts==7)) board->show(5);
if(ii==1&&(ts==2||ts==4||ts==6||ts==8)) board->show(5);
if(ii>=3&&ii%2==1){
if(board->viewX()!=100){
ts = board->viewX();
board -> show(ts);
}
else if(board->viewO()!=100){
ts = board->viewO();
board -> show(ts);
}
else {
int b;
b=rand()%9+1;
while(board->show(b)==-1){
b=rand()%9+1;
}
cout<<b;
}
}
}
if(judger->judge(*board)==-1||judger->judge(*board)==-2){
if(judger->judge(*board)==-1) {
cout<<name<<"胜利!!"<<endl;
}
if(judger->judge(*board)==-2) {
cout<<Computername<<"胜利!!"<<endl;
}
flag = board->reset();
break;
}
if(ii==8){
cout<<"两位都非常厉害,然而并没有什么用,未分伯仲"<<endl;
board->set();
flag = board->reset();
}
}
}
if(first==0){
for(int ii=0;ii<9;ii++){ //九次落子交替
int ts;
if(ii%2!=0){
cout<<"请["<<name<<"]落子: ";
cin>>ts;
while(board->show(ts)==-1){ //判断落子位置是否被占据,占据则重输
cout<<"这个位置已经被占据了!!"<<endl;
int t;
cout<<"请["<<getName()<<"]重新落子: ";
cin>>t;
ts = t;
}
}
else {
cout<<"[Computer_player]落子: ";
board->show(5);
if(ii==2&&(ts==1||ts==3||ts==7||ts==9)){
board->show(2);
}
if(ii==2&&(ts==2||ts==4)){
board->show(9);
}
if(ii==2&&(ts==6||ts==8)){
board->show(1);
}
if(ii>2&&ii%2==0){
if(board->viewO()!=100){
ts = board->viewO();
board -> show(ts);
}
if(board->viewX()!=100){
ts = board->viewX();
board -> show(ts);
}
else {
int b;
b=rand()%9+1;
while(board->show(b)==-1){
b=rand()%9+1;
}
cout<<b;
}
}
}
if(judger->judge(*board)==-1||judger->judge(*board)==-2){
if(judger->judge(*board)==-2) {
cout<<name<<"胜利!!"<<endl;
}
if(judger->judge(*board)==-1){
cout<<Computername<<"胜利!!"<<endl;
}
flag = board->reset();
break;
}
if(ii==8){
cout<<"两位都非常厉害,然而并没有什么用,未分伯仲"<<endl;
board->set();
flag = board->reset();
}
}
}
}
cout<<"Game Over!!"<<endl;
}
#include<iostream>
#include<string>
#include "Judge.h"
#include "Board.h"
#include "Play_vs_Play.h"
using namespace std;
#ifndef PLAY_VS_COMPUTER
#define PLAY_VS_COMPUTER
class Play_vs_Computer : public Play_vs_Play {
private:
string name;
string Computername;
Board *board;
Judge *judger;
public:
Play_vs_Computer();
void Play();
void BuildPlayer();
void setname(string a);
string getName();
};
#endif
#include<iostream>
#include<string>
#include "Play_vs_Play.h"
#include "Board.h"
Play_vs_Play::Play_vs_Play(){
name1 = "Untitle";
name2 = "Untitle";
judger = new Judge;
board = new Board;
}
void Play_vs_Play::setname1(string a){
name1 = a;
}
void Play_vs_Play::setname2(string a){
name2 = a;
}
void Play_vs_Play::BuildPlayer(){
string s1,s2;
cout<<"请输入player1号的名字: ";
cin>>s1;
cout<<"请输入player2号的名字: ";
cin>>s2;
setname1(s1);
setname2(s2);
}
void Play_vs_Play::Play(){
BuildPlayer();
int flag = 1;
while(flag==1){
board->set();
board->show(0);
cout<<"请第一位玩家确认是否先手: 是(输入1) ————否(输入 0)"<<endl;
int first;
cin>>first;
if(first!=1&&first!=0){
cout<<"选择不合理,请重新输入: ";
cin>>first;
}
if(first==1){
cout<<"现在是["<<name1<<"]先手: 使用的是( O )"<<endl;
}
if(first==0){
cout<<"现在是["<<name2<<"]先手:使用的是( X )"<<endl;
}
for(int ii=0;ii<9;ii++){ //九次落子交替
int ts;
if(first == 1 ){
if(ii%2==0){
cout<<"请["<<name1<<"]落子:";
}
else cout<<"请["<<name2<<"]落子:";
}
if(first == 0){
if(ii%2!=0){
cout<<"请["<<name1<<"]落子:";
}
else cout<<"请["<<name2<<"]落子:";
}
cin>>ts;
while(board->show(ts)==-1){ //判断落子位置是否被占据,占据则重输
cout<<"这个位置已经被占据了,请重新落子!!"<<endl;
int t;
if(ii%2==0){
cout<<"请["<<name1<<"重新落子:";
}
else cout<<"请["<<name2<<"]重新落子:";
cin>>t;
ts = t;
}
if(judger->judge(*board)==-1||judger->judge(*board)==-2){
if(judger->judge(*board)==-1){
cout<<name1<<"胜利!!"<<endl;
}
if(judger->judge(*board)==-2){
cout<<name2<<"胜利!!"<<endl;
}
flag = board->reset();
break;
}
if(ii==8){
cout<<"两位都非常厉害,然而并没有什么用,未分伯仲"<<endl;
board->set();
flag = board->reset();
}
}
}
cout<<"Game Over!!"<<endl;
}
#include<iostream>
#include<string>
#include "Judge.h"
#include "Board.h"
using namespace std;
#ifndef Play_vs_play
#define Play_vs_play
class Play_vs_Play{
private:
string name1;
string name2;
Board *board;
Judge *judger;
public:
Play_vs_Play();
void Play();
void BuildPlayer();
void setname1(string a);
void setname2(string a);
};
#endif
#include <iostream>
#include "Board.h"
#include "Play_vs_Play.h"
#include "Judge.h"
#include "GamePlay.h"
using namespace std;
int main(){
GamePlay a;
return 0;
}
井字棋游戏