目录
我上次发了一篇X子棋的旧版代码详解,也尽量详细地阐述了一些新旧版本的优缺点。
所以今天就应我上次的话,编写一个全新(鼠标点击版)的X子棋代码。
这次的X子棋代码也几乎改进了旧版的任何缺点(不简便和界面不美观),也的确达到了上篇博客所说的优点(简便和界面美观)。
我在Dev-c++调试运行了五六次,都没有出现上篇博客所述的鼠标点击不灵敏的缺点。所以X子棋的新版几乎是没有问题的。
规则没有任何变化,思路可以参照旧版博客的说法。只不过这次使用的变量名有改动而已:
rc改成n,n改成sm,bw改成cur,drx[]和dry[]改成dx[]和dy[]。
代码
头文件、宏定义和变量
上述5个变量(数组)的改变参见如下代码块:
#include<bits/stdc++.h>
#include<windows.h>
#define L ((GetAsyncKeyState(VK_LBUTTON)&0x8000)?true:false)//左键
#define SCM GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),&mode);mode&=~ENABLE_QUICK_EDIT_MODE;SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),mode);
using namespace std;
DWORD mode;
POINT p;
CONSOLE_FONT_INFO font;
int a[21][21],g[21][3],n,sm,cur,x,y,w,t;
int dx[]={0,-1,-1,-1,0,0,1,1,1},dy[]={0,-1,0,1,-1,1,-1,0,1};//八方向数组
bool chk;
main()
其实我在主函数做了一个"X-in-a-row"的特效,只是放在init()函数体中了:
int main(){
init();
do{
put(0);
SCM
do{
while(!L);
GetCursorPos(&p);
ScreenToClient(GetForegroundWindow(),&p);
GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),FALSE,&font);
x=(p.y/=font.dwFontSize.Y)+1;//获取鼠标点击行
y=(p.x/=font.dwFontSize.X)+1;//获取鼠标点击列
Sleep(50);
}while(x>n || y>n*2 || a[x][y=(y%2?(y+1)/2:y/2)]);//不合法
a[x][y]=cur;
cur=