vc里没有graphic.h,如何找到替代的来初始化图形界面

我用vc++6.0软件,是用c语言编写一个扫雷程序,在console里运行。如何用vc里的函数库初始化图形界面。这是我的作业,我只能在vc里写,还有我只会c语言,只能用它... 我用vc++6.0 软件,是用c语言编写一个扫雷程序,在console里运行。如何用vc里的函数库初始化图形界面。这是我的作业,我只能在vc里写,还有我只会c语言,只能用它。高手,帮帮忙!多谢 展开
 我来答
Silin_Silin
2014-05-17 · TA获得超过470个赞
知道小有建树答主
回答量:303
采纳率:50%
帮助的人:384万
展开全部

windows.h

下面是以前写的五子棋,请参考

#include <Windows.h>
#include <string>
#include <list>

using namespace std;

//函数声明
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
void InitChess(); //初始化棋盘
void ComputerMove(); //电脑落子
bool CheckChess(); //检查棋盘是否有空余位置
bool WinCheck(); //胜利检查
int P(int); //返回某点棋子
int P(int, int); //返回某点棋子
int P2I(int,int); //转换二维索引为一维索引
int GetN(int i,int d); //获取一个棋子的某一个方向上的棋子坐标。
char ge(int a,int p); //判断是己方棋子(1)还是障碍(2,对方棋子或棋盘外围)还是空位(0),a为待判断棋子,p为己方棋子。
int CountV(int i, int d, int pl); //计数一个落子处某个方向上的权重值。
int GetBest(); //获取最佳落子点

//定义变量
char szClassName[] = "CFive"; //Class Name
int chess[225]; //1为玩家棋子,-1为电脑棋子,0为空。
list<int> fallen; //已落棋子,用于后期添加悔棋功能。
list<int> r; //列表用于保存所有拥有相同最大权值的点用于随机抽取
list<int>::iterator it; //迭代器
int state = 1; //表示当前状态,1:玩家下棋,2:电脑下棋,3:胜利,4:失败
//画刷
HBRUSH hbr = CreateSolidBrush(0x0000ff); //红色画刷(标记上次落子)
HBRUSH hbw = CreateSolidBrush(0xffffff); //白色画刷(画白棋)
HBRUSH hbb = CreateSolidBrush(0x000000); //黑色画刷(画黑棋)
HPEN hp = CreatePen(PS_SOLID, 1, 0x000000); //1宽度黑色画笔(画棋盘,棋子边框)
HPEN hp2 = CreatePen(PS_SOLID, 2, 0x000000); //2宽度黑色画笔(画棋盘边框)

//核心数据,影响整个AI判断
//棋型列表
string cl[] = {"11111", "011110", "11110", "11101", "11011", "011100", "011010", "11100", "10110", "11010", "10101", "001100", "011000", "010100", "01100", "010010", "11000", "10100"};
//电脑对应棋型的权重
int cv[] = {1000000, 100000, 2500, 2800, 2600, 3100, 3000, 550, 800, 550, 570, 650, 600, 450, 300, 200, 120, 120};
//玩家对应棋型的权重
int pv[] = {900000, 90000, 2500, 2450, 2600, 2850, 2800, 450, 700, 460, 490, 600, 500, 350, 200, 40, 40, 40};

int WINAPI WinMain(HINSTANCE hThisInstance,
   HINSTANCE hPrevInstance,
   LPSTR lpszArgument,
   int nFunsterStil)
{
HWND hwnd; //窗口句柄
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground =  (HBRUSH)COLOR_BACKGROUND; //窗体背景色

InitChess(); //初始化棋盘

if(!RegisterClassEx(&wincl))
return -1; //注册失败

hwnd = CreateWindowEx(
0,
szClassName, //窗体类名
"五子棋", //窗体标题
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, //窗体样式
CW_USEDEFAULT, //左坐标
CW_USEDEFAULT, //顶坐标
340, //宽
360, //高
HWND_DESKTOP, //父窗体
NULL, //菜单
hThisInstance, //实例句柄
NULL
);

ShowWindow(hwnd, nFunsterStil);
//消息循环
while(GetMessage(&messages,NULL,0,0)){
TranslateMessage(&messages);
DispatchMessage(&messages);
}

return messages.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //设备上下文句柄
PAINTSTRUCT ps;
char str[3]; //坐标轴上的文字
//x,y分别为相对棋盘的坐标
int x = (LOWORD(lParam)-15)/20;
int y = (HIWORD(lParam)-15)/20;

switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hp2);
MoveToEx(hdc,21,21,NULL);
LineTo(hdc,21,308);
LineTo(hdc,308,308);
LineTo(hdc,308,21);
LineTo(hdc,21,21); //棋盘边框
SelectObject(hdc,hp);
SelectObject(hdc,hbb);
Ellipse(hdc,82,82,87,87);
Ellipse(hdc,242,82,247,87);
Ellipse(hdc,242,242,247,247);
Ellipse(hdc,82,242,87,247);
Ellipse(hdc,162,162,167,167);
for(int i=0;i<15;i++){
str[0]=i+65;
TextOut(hdc,i*20+20,5,str,1); //画出字母序号
_ltoa_s(i+1,str,10);
TextOut(hdc,i>=9?1:10,i*20+20,str,(i+1)/10+1); //画出数字序号
MoveToEx(hdc,24,i*20+24,NULL);
LineTo(hdc,304,i*20+24);
MoveToEx(hdc,i*20+24,24,NULL);
LineTo(hdc,i*20+24,304); //画出棋盘
}
for(int i=0;i<15;i++) //遍历棋盘,画出棋子
for(int j=0;j<15;j++){
switch(P(i,j)){
case 1: //黑棋
SelectObject(hdc,hbb);
Ellipse(hdc,i*20+15,j*20+15,i*20+18+15,j*20+18+15);
break;
case -1: //白棋
SelectObject(hdc,hbw);
Ellipse(hdc,i*20+15,j*20+15,i*20+18+15,j*20+18+15);
break;
}
if(!fallen.empty()&&fallen.back()==P2I(i,j)){
SelectObject(hdc,hbr);
Ellipse(hdc,i*20+19,j*20+19,i*20+10+19,j*20+10+19);
}
}
SelectObject(hdc,CreateFont(30,0,0,0,FW_BLACK,false,false,false,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,"宋体"));
if(state>2)TextOut(hdc,100,30,state==3?"玩家获胜!":"电脑获胜!",10);
SelectObject(hdc,CreateFont(20,0,0,0,FW_BLACK,false,false,false,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,"宋体"));
if(state>2)TextOut(hdc,105,60,"单击以继续...",13);
EndPaint(hwnd,&ps); //结束绘制
if(state==2){ //轮到电脑落子
ComputerMove();
state=WinCheck()?4:1; //更新状态
InvalidateRect(hwnd,NULL,true); //重绘窗体
}
break;
case WM_LBUTTONUP:
switch(state){
case 3:
case 4:
state=1; //单击以继续
InitChess(); //初始化
InvalidateRect(hwnd,NULL,true); //重绘
break;
case 1:
if(x>=0&&x<15&&y>=0&&y<15&&P(x,y)==0){
chess[x*15+y]=1; //更改棋盘
fallen.push_back(x*15+y); //加入已落棋子列表
state=WinCheck()?3:2;
InvalidateRect(hwnd,NULL,true);
}
}
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam); //默认消息处理
}
return 0;
}

//初始化棋盘
void InitChess()
{
for(int i=0;i<225;i++)chess[i]=0; //全部棋子置空
fallen.clear(); //清空已落棋子列表
}

//电脑走棋
void ComputerMove()
{
int r=GetBest();
chess[r]=-1;
fallen.push_back(r);
}

//检查棋盘是否有空位
bool CheckChess()
{
for(int i=0;i<15*15;i++)if(!chess[i])return true;
return false;
}

//转换二维索引为一维索引
int P2I(int x,int y)
{
if(x<0||y<0||x>14||y>14)return 255;
return x*15+y;
}

//获取整数的符号
int sign(int n)
{
return n>0?1:n<0?-1:0;
}

//获取一个棋子的某一个方向上的棋子坐标。方向:1-右;2-右下;3-下;4-左下。其它方向负数。
int GetN(int i,int d) //比如(3,4)的右边为(4,4),不过本函数以一维坐标表示
{
    int x = i / 15;
    int y = i % 15;
    switch(abs(d)){
case 1:
return P2I(x + sign(d), y);
case 2:
        return P2I(x + sign(d), y + sign(d));
case 3:
        return P2I(x, y + sign(d));
case 4:
        return P2I(x - sign(d), y + sign(d));
default:
        return P2I(x, y);
}
}

//返回某点棋子
int P(int x, int y)
{
if(x<0||y<0||x>14||y>14)
return 3;
else if(x==-1||x==15||y==-1||y==15)
return 2;
else
return chess[x*15+y];
}

//返回某点棋子
int P(int n)
{
return P(n / 15, n % 15);
}

//判断是己方棋子(1)还是障碍(2,对方棋子或棋盘外围)还是空位(0),a为待判断棋子,p为己方棋子。
char ge(int a,int p)
{
if(a==p)
return '1';
else if(a==-p)
return '2';
else
return (char)(a+48);
}

//计数一个落子处某个方向上的权重值。
int CountV(int i, int d, int pl)
{
string str=""; //用于保存棋型
int tmp = i;
for(int j=1;j<5;j++){ //前4格
tmp=GetN(tmp,-d);
str=ge(P(tmp),pl)+str;
if(P(tmp)==2)break; //遇到阻挡的就退出循环
}
str += '1'; //自身
for(int j=1;j<5;j++){ //后4格
i=GetN(i,d);
str += ge(P(i),pl);
if(P(tmp)==2)break;
}
for(int j=0;j<18;j++) //挨个比较棋型,藉此获得权重值
if(str.find(cl[j])!=str.npos||str.find(string(cl[j].rbegin(),cl[j].rend()))!=str.npos)
return pl==1?pv[j]:cv[j];
return 0;
}

//计算一个落子处的价值
int GetValue(int i)
{
int n=0;
for(int j=1;j<5;j++){
n+=CountV(i,j,1); //对玩家的价值
n+=CountV(i,j,-1); //对电脑的价值
}
return n;
}

//获取最优落子点
int GetBest()
{
int n=0,tmp; //n保存最大值,tmp临时变量
r.clear();
for(int i=0;i<225;i++){
if(P(i)==0){
tmp=GetValue(i);
if(tmp>n){ //如果比已存的数大,就清空列表,并替换值
r.clear();
r.push_back(i);
n=tmp;
}else if(tmp==n) //如果相等,就添加
r.push_back(i);
if(r.front()>=1000000) return r.front(); //如果遇到连成5子的就直接选它了
}
}
it=r.begin();
tmp=rand()%r.size();
for(int i=1;i<tmp;i++)it++;
return *it; //随机从列表中返回一个位置
}

//计数一个棋子某个方向上的连子数。i,棋子坐标。d,方向。1-右;2-右下;3-下;4-左下。其它方向负数。
int Count(int i,int d)
{
int n=i;
int c=0;
while(P(n)==P(i)){
n=GetN(n,d);
c++;
}
return c-1;
}

//检查是否连成五子
bool WinCheck()
{
int i=fallen.back(); //检查最后一个落子的周围即可
for(int j=1;j<=4;j++) //依次判断4个方向
if(Count(i,j)+Count(i,-j)>=4)
return true;
return false;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式