| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3777 人关注过本帖
标题:井字游戏(C++版)终级版隆重推出!
只看楼主 加入收藏
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
收藏
 问题点数:0 回复次数:20 
井字游戏(C++版)终级版隆重推出!

前两个版本都多多少少有些缺陷,经过本人仔细研究,终于克服重重困难,编写出了井字游戏终结版,经过大量实验,应该没什么问题了,大家试试吧!!!!!不知道这个游戏能不能评为精品呀???同时还推出了C语言版
#include <iostream>
#include <string>
using namespace std;
typedef char chess[10]; //字符数组
typedef int temparr[10]; //整型数组
chess arr; //定义字符数组变量
temparr brr; //定义整型数组变量
int number,suc,n3,c3,n2,c2,n1,c1;
void inarrdata(chess a) //初始化棋盘编号
{
a[1]='1';a[2]='2';a[3]='3';
a[4]='4';a[5]='5';a[6]='6';
a[7]='7';a[8]='8';a[9]='9';
}
void display(chess a) //输出棋盘状态
{
cout<<endl;cout<<endl;
cout<<" "<<a[1]<<" "<<'|'<<" "<<a[2]<<" "<<'|'<<" "<<a[3]<<endl;
cout<<" -----------"<<endl;
cout<<" "<<a[4]<<" "<<'|'<<" "<<a[5]<<" "<<'|'<<" "<<a[6]<<endl;
cout<<" -----------"<<endl;
cout<<" "<<a[7]<<" "<<'|'<<" "<<a[8]<<" "<<'|'<<" "<<a[9]<<endl;
cout<<endl;cout<<endl;
}
int arrfull() //判断还有没有下棋的位置
{
int i;
int arrf=0;
for(i=1;i<=9;i++)
if(i==arr[i]-48) //如果字符arr[i]-48等于i
arrf=1; //那么arrf=1,也就是可以走棋
return arrf;
}
void cn(int line) //判断状态
{
switch(line)
{
case 0:c3=c3+1;break;
case 1:n2=n2+1;break;
case 2:c2=c2+1;break;
case 3:n1=n1+1;break;
case 4:c1=c1+1;break;
case 5:n3=n3+1;break;
}
}
int linenum(char a,char b,char c) //判断状态
{
int ln=6;
if((a=='X')&&(b=='X')&&(c=='X'))
ln=0;
if(((a=='O')&&(b=='O')&&(c!='O'))||((a=='O')&&(b!='O')&&(c=='O'))||((a!='O')&&(b=='O')&&(c=='O')))
ln=1;
if(((a=='X')&&(b=='X')&&(c!='X'))||((a=='X')&&(b!='X')&&(c=='X'))||((a!='X')&&(b=='X')&&(c=='X')))
ln=2;
if(((a=='O')&&(b!='O')&&(c!='O'))||((a!='O')&&(b=='O')&&(c!='O'))||((a!='O')&&(b!='O')&&(c=='O')))
ln=3;
if(((a=='X')&&(b!='X')&&(c!='x'))||((a!='X')&&(b=='X')&&(c!='X'))||((a!='X')&&(b!='X')&&(c=='X')))
ln=4;
if((a=='O')&&(b=='O')&&(c=='O'))
ln=5;
return ln;
}
int maxbrr(int *br) //判断最大权值
{
int temp,i,mb;
temp=-888;
for(i=1;i<=9;i++)
{
if(temp<=br[i])
{
temp=br[i];
mb=i;
}
}
return mb;
}
void manstep() //人走棋处理模块
{
int j;
display(arr);
if(arrfull()) //如果棋盘上还有下棋的位置,人走一步棋
{
cout<<"您要走哪一步?请输入数字(1--9):";
cin>>j;
while((j<1)||(j>9)||(j!=arr[j]-48))
{
cout<<"对不起,您输入的数字不对,请重新输入(1--9):";
cin>>j;
}
arr[j]='O';
n3=0;c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(n3!=0) //您赢了
{
display(arr);
cout<<endl;
cout<<"恭喜您赢了!!!"<<endl;
suc=0;
}
}
}
void computerstep() //计算机走棋处理模块
{
int i;
if(arrfull()) //如果棋盘上还有可下棋的位置,则计算机走棋
{
for(i=1;i<=9;i++) //对每一步可走的棋进行计算
{
if(i==arr[i]-48)
{
c3=0;n2=0;c2=0;n1=0;c1=0;
arr[i]='X';
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
brr[i]=(128*c3-63*n2+31*c2-15*n1+7*c1); //计算此步权值
arr[i]=i+48;
}
else
brr[i]=-999;
}
arr[maxbrr(brr)]='X'; //确定计算机走哪一步,权值最大的一步
c3=0;n2=0;c2=0;n1=0;c1=0;
number=linenum(arr[1],arr[2],arr[3]);cn(number);
number=linenum(arr[4],arr[5],arr[6]);cn(number);
number=linenum(arr[7],arr[8],arr[9]);cn(number);
number=linenum(arr[1],arr[4],arr[7]);cn(number);
number=linenum(arr[2],arr[5],arr[8]);cn(number);
number=linenum(arr[3],arr[6],arr[9]);cn(number);
number=linenum(arr[1],arr[5],arr[9]);cn(number);
number=linenum(arr[3],arr[5],arr[7]);cn(number);
if(c3!=0) //计算机已赢
{
display(arr);
cout<<endl;
cout<<"计算机赢了!!!"<<endl;
suc=0;
}
}
else
suc=0;
}
int main()
{
cout<<"游戏规则:"<<endl<<"棋盘格式如图,人和计算机在棋盘上交替走棋"<<endl;
cout<<"约定计算机使用符号X,人使用符号O"<<endl;
cout<<"谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了!"<<endl;
string s="y";
string ch;
while(s=="y"||s=="Y")
{
inarrdata(arr); //棋盘坐标编号
display(arr); //显示初始棋盘
suc=1;
cout<<"请选择您是否先走?(y/n)";
cin>>ch;
while(ch!="y"&&ch!="Y"&&ch!="n"&&ch!="N")
{
cout<<"错误!请输入y或n:";
cin>>ch;
}
if((ch=="y")||(ch=="Y")) //输入Y,表示人先走棋
{
while(suc)
{
manstep();
computerstep();
}
}
else //计算机先走棋
{
while(suc)
{
computerstep();
if(suc)
manstep();
}
}
if(n3==0&&c3==0)
cout<<endl<<"和棋!"<<endl<<endl;
cout<<"再来一盘(y/n)?";
cin>>s;
while(s!="y"&&s!="Y"&&s!="n"&&s!="N")
{
cout<<"错误!请输入y或n:";
cin>>s;
}
}
return 0;
}

搜索更多相关主题的帖子: 游戏 
2006-12-31 21:58
owen118
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-1-1
收藏
得分:0 


好!好!!!!
2007-01-12 01:00
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
typedef char chess[10]; //字符数组
typedef int temparr[10]; //整型数组

是不是应该写成
==================================================
typedef char[10] chess; //字符数组
typedef int[10] temparr; //整型数组
==================================================
啊?


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-01-12 12:37
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
收藏
得分:0 
当然不是了,你好好看看基础知识吧

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-03-25 19:51
是而非
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-3-11
收藏
得分:0 
不错!
经过测试发现:若我先走,顺序为5、1、7、3时,我就可以赢!
若计算机先走时,第一步你不下在1、3、7、9中任一位置时就会输,否则总是和棋(除非你不小心走错了)!

[此贴子已经被作者于2007-3-26 18:20:54编辑过]


2007-03-26 18:14
八神吹雪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-3-3
收藏
得分:0 
根据我所研究的....
1.权值公式(128*c3-63*n2+31*c2-15*n1+7*c1)跟判断状态的结合来说,有且仅当计算机先走状态下才能保证计算机胜利或和棋!!!

2.当人先走"5"的话,如无以外....肯定和棋!!权值公式还是适用的...因为权值公式对于一直线上出现两个"0"的肯定会封住第三个位来增大自身权值的.....从判断状态函数的可知!!!

3.BUG来了...也就是突破权值公式的算法.....首先我走位置"1",根据权值最大来说,计算机第一步死守中间"5"...
好了....然后我走"9"...根据权值取最大并尽量往后取(这里就涉及为什么我第一步走"5"的时候,计算机会走"9"了,因为1,2,3,4,6,7,8,9的权值一样,作怪在if(temp<=br[i]),所以尽量往后取),这个时候"3"和"7"权值一样都是最大的,所以计算机走"7"了...所以我走"3".....计算机应该输了吧.....
其实(2,4,6,8)的权值比(3,7)少....这个时候有且只有取权值少的...才能继续拼和棋!!

[此贴子已经被作者于2007-3-27 19:19:38编辑过]

2007-03-27 18:25
八神吹雪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-3-3
收藏
得分:0 
当屏除人为失误来说......
#字游戏重点在于:先走者,走中间者,必和!!!!
后走者,不走中间者,必输!!!!

[此贴子已经被作者于2007-3-27 19:26:45编辑过]

2007-03-27 19:25
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 
谁输谁赢不是最重要的
重要的是你能够从中获得快乐,
所以正在游戏中

当你开始怀疑自己时,说明你已经失去了判断力
2007-03-27 20:53
边城路人
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:591
专家分:0
注 册:2007-3-8
收藏
得分:0 
很有创意
不过总是黑屏看着有点不舒服
如果楼主能做成MFC应用程序,我想会更好点。

当你开始怀疑自己时,说明你已经失去了判断力
2007-03-27 21:03
八神吹雪
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-3-3
收藏
得分:0 
以下是引用边城路人在2007-3-27 20:53:28的发言:
谁输谁赢不是最重要的
重要的是你能够从中获得快乐,
所以正在游戏中

如果你明明赢了...可是却显示你输的话...
这该怎么办?!

2007-03-28 15:50
快速回复:井字游戏(C++版)终级版隆重推出!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030740 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved