网络五子棋游戏QT类的设计与实现 (3)
第二版的五子棋游戏确实比第一版玩起来好多了。可是,我怎么越看越觉得不怎么像样,特别是棋子!‘W‘ 表示白棋,‘B’表示黑棋,学过英文的很容易就能分辨出来,可是像我这样连ABC都不会的人怎么办啊?一定要想个办法让棋子变得更漂亮一些。
我想到了图形字符,见下图,看到'T'和'Y'上面的圆圆的字符了吧?用来做五子棋非常合适。
关键是怎么把这个图形字符找到并显示出来,直接输进去吧,在ubuntu下是支持UTF-8编码的,而在windows下的UltraEdit /NotePad虽然可以输入'●' ,但是另存为 UTF-8的时候,得到的内码却是
"FF FE CF 25" ,跟另存为
Unicode 得到的编码是一样的,这说明在我现在的window下并没有实现UTF-8的编码。
找个转换工具来用,找了半天却无功而返,那就先把UFT-8编码搞懂,自己手动来转换吧!
UTF-8 是Unicode 的实现方式之一,它规定了字符如何在计算机中存储和传输,它是一种变长的编码方式。
UTF-8 规则一:对于单字节的,字节第一位设为0,后7位为unicode码,所以英语字母中,UTF-8码和ASCII码是相同的。
UTF-8 规则二:对于n字节(n>1),第一字节前n位都设为1,第n+1 位设为0,后面的字节一律设为10开头,剩下的位属于Unicode码。
对于'●的Unicode 码
"FF FE CF 25",
"FF FE ”
是表示
大小
端模式的,这里表示小端,所有实际编码是0x25CF。转化为二进制是:
0010 0101 11 001111
按照UTF-8的规则转化出来是1110 0010 10 010111 10 001111,
即十六进制的0xE2978F,类似地,‘○’ 的UTF-8 编码是
0xE2978B。
在显示函数中加入棋子的UTF-8编码吧:
void ChessBoard::dispChessBoard()
{
const char white[]={0xe2,0x97,0x8b,0};//○ 用于显示白棋的UTF-8码
const char black[]={0xe2,0x97,0x8f,0};//● 用于 显示黑棋的UTF-8码
cout<<" ";
{
const char white[]={0xe2,0x97,0x8b,0};//○ 用于显示白棋的UTF-8码
const char black[]={0xe2,0x97,0x8f,0};//● 用于 显示黑棋的UTF-8码
cout<<" ";
for(int j=0; j<19;j++)
{
printf(" %02d",j);
}
cout<<endl<<endl;
for(int i=0; i<19;i++)
{
printf("%02d",i);
for(int j=0; j<19;j++)
{
if(j==0)
{
if(board[i][j]=='W')
printf(" %2s ",white);
else if(board[i][j]=='B')
printf(" %2s ",black);
else
printf(" %2c",board[i][j]);
}
// printf(" %2c",board[i][j]);
else{
if(board[i][j]=='W')
printf("-%2s ",white);
else if(board[i][j]=='B')
printf("-%2s ",black);
else
printf("-%2c",board[i][j]);
}
// printf("-%2c",board[i][j]);
}
printf(" %02d",i);
cout<<endl;
cout<<" ";
for(int j=0; j<19;j++)
{
if(i!=18)
printf(" |");
}
cout<<endl;
}
cout<<" ";
for(int j=0; j<19;j++)
{
printf(" %02d",j);
}
cout<<endl<<endl;
}
再来看我的经过UTF-8改良的第三版五子棋游戏: