新手井字棋程序,求帮忙。。。

逆袭LWJ 2013-12-26 12:16:36

#include "stdafx.h"
#include<iostream>
using namespace std;

#define SPACE ' '

class JingZiQi
{
char juzhen[3][3];
public:
JingZiQi()
{
juzhen[3][3]={ SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, };
}
void player_move();
void computer_move();
void qipan();
char check();
};




void main()
{
char done;
done=SPACE;

JingZiQi jzq();

cout<<"这是一个井字棋游戏!"<<endl;
cout<<"你即将和电脑对抗!"<<endl;

do
{
jzq.qipan();
jzq.player_move();
done=jzq.check(); /*判断输赢*/
if (done!=SPACE) break;
jzq.computer_move();
done=jzq.check(); /*判断输赢*/

}while(done==SPACE);

if(done=="X")
cout<<"恭喜你击败了计算机!"<<endl;
else
cout<<"很遗憾,计算机赢了!"<<endl;

jzq.qipan(); /*最后棋盘的情况*/
}

void JingZiQi::player_move() /*玩家下棋的函数*/
{
int x,y;
cout<<"请输入下棋的位置:(如:2 2):";
cin>>x>>y;
x--;y--;
if (juzhen[x][y]!=SPACE) /*输入无效的下棋位置时,通过递归来再一次下棋*/
{
cout<<"无效的下棋位置,请重试"<<endl;
player_move();
}
else juzhen[x][y]='X';
}

void JingZiQi::computer_move() /*计算机下棋的函数*/
{
int t;
char *p;
p=(char*)juzhen;
for (t=0; *p!=SPACE && t<9; ++t) p++;
if (t==9)
{
cout<<"平局"<<endl;
exit(0); /*平局,游戏结束*/
}
else *p='O';
}

void JingZiQi::qipan() /*用于输出棋盘的边界*/
{
int t,i;
for (t=0; t<3; t++)
{
cout<<juzhen[t][0]<<"|"<<juzhen[t][1]<<"|"<<juzhen[t][2]<<endl;
if (t!=2)
cout<<"***|***|***"<<endl;
}
cout<<endl;
}

char JingZiQi::check() /*判断输赢的函数*/
{
int t;
char *p;
for (t=0; t<3; t++)
{
p=&juzhen[t][0];
if (*p==*(p+1) && *(p+1)==*(p+2)) return *p; /*行方向3个棋子成一条直线*/
}
for (t=0; t<3; t++)
{
p=&juzhen[0][t];
if (*p==*(p+3) && *(p+3)==*(p+6)) return *p; /*列方向3个棋子成一条直线*/
}
if (juzhen[0][0]==juzhen[1][1] && juzhen[1][1]==juzhen[2][2]) /*右斜方向3个棋子成一条直线*/
return juzhen[0][0];

if (juzhen[0][2]==juzhen[1][1] && juzhen[1][1]==juzhen[2][0]) /*左斜方向3个棋子成一条直线*/
return juzhen[0][2];

return SPACE;
}



------------------------------------------------------------------------------------

错误 1 error C2059: 语法错误 : “{”
错误 2 error C2143: 语法错误 : 缺少“;”(在“{”的前面)
错误 3 error C2059: 语法错误 : “}”
错误 4 error C2228: “.qipan”的左边必须有类/结构/联合
错误 5 error C2228: “.player_move”的左边必须有类/结构/联合
错误 6 error C2228: “.check”的左边必须有类/结构/联合
错误 7 error C2228: “.computer_move”的左边必须有类/结构/联合
错误 8 error C2228: “.check”的左边必须有类/结构/联合
错误 9 error C2446: “==”: 没有从“const char *”到“int”的转换
错误 10 error C2040: “==”: “int”与“const char [2]”的间接寻址级别不同
错误 11 error C2228: “.qipan”的左边必须有类/结构/联合


很着急啊,身边又没人帮忙。。。。。。。
...全文
377 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangcai1 2016-06-25
  • 打赏
  • 举报
回复
你的这个代码使用的是博弈树吗
逆袭LWJ 2013-12-27
  • 打赏
  • 举报
回复
引用 2 楼 a510579741 的回复:
错误 1 error C2059: 语法错误 : “{” 数组除了初始化可以那么复制之外 剩下的是不可以的 此时juzhen[3][3]访问还越界了..... 建议你循环一下赋值 或者 用strcpy 错误 2 是因为定义一个对象是 直接 JingZiQi jzq; 就好了 错误 3 希望你弄明白"x"和'x'的区别 一个是字符串 一个是字符 然后就运行就没有错误了 至于算法的东西你自己考虑吧 附加 改动代码
#include<iostream>
using namespace std;

#define SPACE ' '

class JingZiQi
{
	char juzhen[3][3];
public:
	JingZiQi()
	{
		//juzhen[3][3] = {	 SPACE, SPACE, SPACE,	 SPACE, SPACE, SPACE,	 SPACE, SPACE, SPACE,	 }; 错误1
		for (int i = 0;i<3 ; i++)
		{
			for (int j = 0;j<3 ; j++)
			{
				juzhen[i][j] = SPACE;
			}
		}
	}
	void player_move();
	void computer_move();
	void qipan();
	char check();
};




void main()
{
	char done;
	done=SPACE;

	JingZiQi jzq;
	 
	cout<<"这是一个井字棋游戏!"<<endl;
	cout<<"你即将和电脑对抗!"<<endl;

	do
	{
		jzq.qipan();
		jzq.player_move();
		done=jzq.check();               /*判断输赢*/
		if (done!=SPACE) break;
		jzq.computer_move();
		done=jzq.check();               /*判断输赢*/

	}while(done==SPACE);

	if(done=='X')
		cout<<"恭喜你击败了计算机!"<<endl;
	else
		cout<<"很遗憾,计算机赢了!"<<endl;       

	jzq.qipan();                        /*最后棋盘的情况*/
}

void JingZiQi::player_move()                              /*玩家下棋的函数*/
{
	int x,y;
	cout<<"请输入下棋的位置:(如:2 2):";
	cin>>x>>y;
	x--;y--;
	if (juzhen[x][y]!=SPACE)               /*输入无效的下棋位置时,通过递归来再一次下棋*/
	{
		cout<<"无效的下棋位置,请重试"<<endl;
		player_move();
	}
	else juzhen[x][y]='X';
}

void JingZiQi::computer_move()                            /*计算机下棋的函数*/
{
	int t;
	char *p;
	p=(char*)juzhen;
	for (t=0; *p!=SPACE && t<9; ++t) p++;
	if (t==9)
	{
		cout<<"平局"<<endl;
		exit(0);                            /*平局,游戏结束*/
	}
	else *p='O';
}

void JingZiQi::qipan()                             /*用于输出棋盘的边界*/
{
	int t,i;
	for (t=0; t<3; t++)
	{
		cout<<juzhen[t][0]<<"|"<<juzhen[t][1]<<"|"<<juzhen[t][2]<<endl;
		if (t!=2) 
			cout<<"***|***|***"<<endl;
	}
	cout<<endl;
}

char JingZiQi::check()                             /*判断输赢的函数*/
{
	int t;
	char *p;
	for (t=0; t<3; t++)
	{
		p=&juzhen[t][0];
		if (*p==*(p+1) && *(p+1)==*(p+2)) return *p;         /*行方向3个棋子成一条直线*/
	}
	for (t=0; t<3; t++)
	{
		p=&juzhen[0][t];
		if (*p==*(p+3) && *(p+3)==*(p+6)) return *p;         /*列方向3个棋子成一条直线*/
	}
	if (juzhen[0][0]==juzhen[1][1] && juzhen[1][1]==juzhen[2][2])  /*右斜方向3个棋子成一条直线*/
		return juzhen[0][0];

	if (juzhen[0][2]==juzhen[1][1] && juzhen[1][1]==juzhen[2][0])  /*左斜方向3个棋子成一条直线*/
		return juzhen[0][2];

	return SPACE;
}
谢谢
半行注释 2013-12-26
  • 打赏
  • 举报
回复
错误 1 error C2059: 语法错误 : “{” 数组除了初始化可以那么复制之外 剩下的是不可以的 此时juzhen[3][3]访问还越界了..... 建议你循环一下赋值 或者 用strcpy 错误 2 是因为定义一个对象是 直接 JingZiQi jzq; 就好了 错误 3 希望你弄明白"x"和'x'的区别 一个是字符串 一个是字符 然后就运行就没有错误了 至于算法的东西你自己考虑吧 附加 改动代码
#include<iostream>
using namespace std;

#define SPACE ' '

class JingZiQi
{
	char juzhen[3][3];
public:
	JingZiQi()
	{
		//juzhen[3][3] = {	 SPACE, SPACE, SPACE,	 SPACE, SPACE, SPACE,	 SPACE, SPACE, SPACE,	 }; 错误1
		for (int i = 0;i<3 ; i++)
		{
			for (int j = 0;j<3 ; j++)
			{
				juzhen[i][j] = SPACE;
			}
		}
	}
	void player_move();
	void computer_move();
	void qipan();
	char check();
};




void main()
{
	char done;
	done=SPACE;

	JingZiQi jzq;
	 
	cout<<"这是一个井字棋游戏!"<<endl;
	cout<<"你即将和电脑对抗!"<<endl;

	do
	{
		jzq.qipan();
		jzq.player_move();
		done=jzq.check();               /*判断输赢*/
		if (done!=SPACE) break;
		jzq.computer_move();
		done=jzq.check();               /*判断输赢*/

	}while(done==SPACE);

	if(done=='X')
		cout<<"恭喜你击败了计算机!"<<endl;
	else
		cout<<"很遗憾,计算机赢了!"<<endl;       

	jzq.qipan();                        /*最后棋盘的情况*/
}

void JingZiQi::player_move()                              /*玩家下棋的函数*/
{
	int x,y;
	cout<<"请输入下棋的位置:(如:2 2):";
	cin>>x>>y;
	x--;y--;
	if (juzhen[x][y]!=SPACE)               /*输入无效的下棋位置时,通过递归来再一次下棋*/
	{
		cout<<"无效的下棋位置,请重试"<<endl;
		player_move();
	}
	else juzhen[x][y]='X';
}

void JingZiQi::computer_move()                            /*计算机下棋的函数*/
{
	int t;
	char *p;
	p=(char*)juzhen;
	for (t=0; *p!=SPACE && t<9; ++t) p++;
	if (t==9)
	{
		cout<<"平局"<<endl;
		exit(0);                            /*平局,游戏结束*/
	}
	else *p='O';
}

void JingZiQi::qipan()                             /*用于输出棋盘的边界*/
{
	int t,i;
	for (t=0; t<3; t++)
	{
		cout<<juzhen[t][0]<<"|"<<juzhen[t][1]<<"|"<<juzhen[t][2]<<endl;
		if (t!=2) 
			cout<<"***|***|***"<<endl;
	}
	cout<<endl;
}

char JingZiQi::check()                             /*判断输赢的函数*/
{
	int t;
	char *p;
	for (t=0; t<3; t++)
	{
		p=&juzhen[t][0];
		if (*p==*(p+1) && *(p+1)==*(p+2)) return *p;         /*行方向3个棋子成一条直线*/
	}
	for (t=0; t<3; t++)
	{
		p=&juzhen[0][t];
		if (*p==*(p+3) && *(p+3)==*(p+6)) return *p;         /*列方向3个棋子成一条直线*/
	}
	if (juzhen[0][0]==juzhen[1][1] && juzhen[1][1]==juzhen[2][2])  /*右斜方向3个棋子成一条直线*/
		return juzhen[0][0];

	if (juzhen[0][2]==juzhen[1][1] && juzhen[1][1]==juzhen[2][0])  /*左斜方向3个棋子成一条直线*/
		return juzhen[0][2];

	return SPACE;
}
  • 打赏
  • 举报
回复
调试的时候双击出现的错误就能定位到具体的代码行。然后 度娘、google 啥的搞起来,书、笔记翻起来问题就解决了,何必在这里苦等,而且你这都是些基本的只是问题,翻书都能解决的问题。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧