到底如何学好vc++ 本人已经有c c++编过贪吃蛇(调用windowsAPI)接下来是不死要看MFC源码呢 到底该怎么

到底如何学好vc++ 本人已经有c c++编过贪吃蛇(调用windowsAPI)接下来是不死要看MFC源码呢 到底该怎么,第1张

基础不好从VC开始 会非常困难 一定要能坚持 否则不会有任何收获哦 ^-^

你的认知还停留在几年前 MFC时代早已经过去 MS也不再更新它了 取代它的是net

你的情况没必要费时费力学MFC了 直接net开始吧

个人感觉 相对SDK的直接编程 net构架执行力真的太。。 不过依然是趋势

借鉴代码必须先看懂作者的用意 觉得不足可以加上自己的一些想法 一定不要简单的拿来就用

想学好编程 是需要几本好书来开始的 但多数不再国内哦

打好基础吧 少看书 多写 多想 多调试 一定程度后会发现基础和前期工作一样都非常重要 会决定之后的工作是简单还是变得更复杂

/

C/C++贪吃蛇游戏,zjlj,2015316

/

#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1

#include<iostream>

#include<windowsh>

#include<timeh>

#include<conioh>

using namespace std;

void readini(FILE fphead, int score, char argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录

{

char filename[200],pfilename;

int flag=-1,i;

strcpy(filename,argv[0]);

for(i=0;filename[i]!='\0';i++)

{

if (''==filename[i])flag=1;

}

if(1==flag)

{

filename[i-1]='i';

filename[i-2]='n';

filename[i-3]='i';

}

else

{

filename[i]='';

filename[i+1]='i';

filename[i+2]='n';

filename[i+3]='i';

filename[i+4]='\0';

}

for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];

if ( (fphead=fopen(pfilename, "rb+"))==NULL)

{

if ( (fphead=fopen(pfilename, "wb+"))==NULL)

{

printf("无法创建或打开\"%s\"文件\n",pfilename);

system("pause");

exit(0);

}

}

else

{

fread(score,sizeof(int),1,fphead);

}

}

void writeini(FILE fphead, int score, char argv[]) //打开一个和运行文件对应的ini文件,写入最高纪录

{

char filename[200],pfilename;

int flag=-1,i;

strcpy(filename,argv[0]);

for(i=0;filename[i]!='\0';i++)

{

if (''==filename[i])flag=1;

}

if(1==flag)

{

filename[i-1]='i';

filename[i-2]='n';

filename[i-3]='i';

}

else

{

filename[i]='';

filename[i+1]='i';

filename[i+2]='n';

filename[i+3]='i';

filename[i+4]='\0';

}

for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];

if ( (fphead=fopen(pfilename, "wb+"))==NULL)

{

printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename);

system("pause");

exit(0);

}

else

{

rewind(fphead);

fwrite(score,sizeof(int),1,fphead);

fclose(fphead);

}

}

void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸

{

COORD pos;

posX=2y;

posY=x;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

void color(int a)//颜色函数

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);

}

void Refresh(int q[][22], int grade, int gamespeed, int length,int score) // 输出贪吃蛇棋盘

{

int i,j;

for(i=0;i<22;i++)

{

for(j=0;j<22;j++)

{

if(q[i][j]==0)//输出棋盘空白

{

gotoxy(i,j);

color(11);

cout<<"■";

}

if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁

{

gotoxy(i,j);

color(11);

cout<<"□";

}

if(q[i][j]==3)//输出蛇头

{

gotoxy(i,j);

color(14);

cout<<"★";

}

if(q[i][j]==4)//输出蛇身

{

gotoxy(i,j);

color(12);

cout<<"◆";

}

if(q[i][j]==5)//输出果子

{

gotoxy(i,j);

color(12);

cout<<"●";

}

}

if(i==0) cout << "\t";

if(i==1) cout << "\t等级为:" << grade;//显示等级

if(i==3) cout << "\t自动前进时间";

if(i==4) cout << "\t间隔为:" << gamespeed << "ms";//显示时间

if(i==6) cout << "\t历史最高分为:" << score << "分";

if(i==7) cout << "\t你现在得分为:" << (length+(grade-1)8)10 << "分";

if(i==8) cout << "\t";

if(i==9) cout << "\t游戏说明:";

if(i==10) cout << "\t(1)用小键盘方向键控制";

if(i==11) cout << "\t蛇头运动方向;";

if(i==12) cout << "\t(2)蛇每吃一个果子蛇身";

if(i==13) cout << "\t增加一节;";

if(i==14) cout << "\t(3)蛇咬到自己或碰到墙";

if(i==15) cout << "\t壁游戏结束。";

if(i==18) cout << "\t";

if(i==19) cout << "\tC/C++语言作业:";

if(i==20) cout << "\tzjlj,20150316 ";

}

}

int main(int argc, char argv[]){

int tcsQipan[22][22]; // 贪吃蛇棋盘是一个二维数组(如2222,包括墙壁)

int i,j,score,directiontemp;

FILE fpini;//fpini 信息文件

readini(&fpini, &score, argv);//读取ini文件的最高纪录

if (score<0)//最高成绩小于零设置为零,初建文件会是负数

score=0;

while(1)

{

for(i=1;i<=20;i++)

for(j=1;j<=20;j++)

tcsQipan[i][j]=0; //贪吃蛇棋盘相应坐标标上中间空白部分的标志0

for(i=0;i<=21;i++)

tcsQipan[0][i] = tcsQipan[21][i] = 1; //贪吃蛇棋盘相应坐标标上上下墙壁的标志1

for(i=1;i<=20;i++)

tcsQipan[i][0] = tcsQipan[i][21] = 2; //贪吃蛇棋盘相应坐标标上左右墙壁的标志2

int tcsZuobiao[2][500]; //蛇的坐标数组

for(i=0; i<4; i++)

{

tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标

tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标

}

int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量

for(i=1;i<=3;i++)

tcsQipan[1][i]=4; //蛇身

tcsQipan[1][4]=3; //蛇头

int x1, y1; // 随机出果子

srand(time(0));//设置随机种子

do

{

x1=rand()%20+1;

y1=rand()%20+1;

}

while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子

tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5

color(12);

cout<<"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始

long start,starttemp;

int grade = 1, length = 4; //设置初始等级和蛇的初始长度

int gamespeed = 500; //设置初始前进时间间隔

for(i=3;i>=0;i--)

{

start=clock();

while(clock()-start<=1000);

system("cls");

if(i>0)

cout << "\n\n\t\t\t\t进入倒计时:" << i << endl; //倒计时显示

else

Refresh(tcsQipan,grade,gamespeed,length,score); //初始棋盘显示

}

int timeover=1,otherkey=1;//初始化超时时间和按键判断参数

char direction = 77; // 设置初始情况下,向右运动

int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量

while(1)//运行一局游戏

{

start = clock();

while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环

if(direction==72||direction==80||direction==75 ||direction==77)

directiontemp=direction;//保留上一次方向按键

//starttemp=gamespeed+start-starttemp;//保留停留时间

if(timeover)

{

#if (DEBUG==1)

direction = getch();//调试代码

#else

if((direction =getch())==-32)

direction = getch();

#endif

}

#if (DEBUG==1)//调试代码

start=clock();

while(clock()-start<=2000);

gotoxy(24,4);

cout << "\t按键ASCII代码"<<(int)direction<<" "<<endl;

#endif

if(!(direction==72||direction==80||direction==75 ||direction==77))

{

otherkey=0;// 按键非方向键,otherkey设置为0

}

else

{

otherkey=1;// 按键为方向键,otherkey设置为1

}

if(direction==72 && directiontemp==80)//忽略反方向按键

{

direction=32;

otherkey=0;

//start = clock();

//while(clock()-start<=starttemp);

}

else if(direction==80 && directiontemp==72)

{

direction=32;//设置按键为非方向键

otherkey=0;// 按键为非方向键,otherkey设置为0

// start = clock();

//while(clock()-start<=starttemp);//补偿等待时间

}

else if(direction==75 && directiontemp==77)

{

direction=32;

otherkey=0;

//start = clock();

//while(clock()-start<=starttemp);

}

else if(direction==77 && directiontemp==75)

{

direction=32;

otherkey=0;

//start = clock();

//while(clock()-start<=starttemp);

}

switch(direction)//判断方向键

{

case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break; // 向上

case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break; // 向下

case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break; // 向左

case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break; // 向右

default: break;

}

if(x==0 || x==21 ||y==0 || y==21) // 蛇头碰到墙壁,结束本局游戏

{

gotoxy(22,12);

cout << "\t游戏已结束!" << endl;

if(score>=(length+(grade-1)8)10)//判断是否破记录

{

gotoxy(10,7);

color(12);

cout << "闯关失败 加油耶!" << endl;

fclose(fpini);//关闭ini文件

}

else

{

gotoxy(10,7);

color(12);

cout << "恭喜您打破记录" << endl;

score=(length+(grade-1)8)10;

writeini(&fpini, &score, argv);//写入ini文件的最高纪录

}

gotoxy(23,12);

cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示

break;//退出该局游戏

}

if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) // 蛇头碰到蛇身,结束本局游戏

{

gotoxy(22,12);

cout << "\t游戏已结束!" << endl;

if(score>=(length+(grade-1)8)10)//判断是否破记录

{

gotoxy(10,7);

color(12);

cout << "闯关失败 加油耶!" << endl;

fclose(fpini);//关闭ini文件

}

else

{

gotoxy(10,7);

color(12);

cout << "恭喜您打破记录" << endl;

score=(length+(grade-1)8)10;

writeini(&fpini, &score, argv);//写入ini文件的最高纪录

}

gotoxy(23,12);

cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示

break;//退出该局游戏

}

/

游戏运行时的核心算法开始

/

if(x==x1 && y==y1) // 吃果子,长度加1

{

length ++;

if(length>=8)//长度大于等于8重新计算长度,等级加1

{

length -= 8;//重新计算长度

grade ++;//等级加1

if(gamespeed>50)//控制最快速度为50

gamespeed = 550 - grade 50; // 改变自动前进时间间隔

}

tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3

tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4

head = (head+1)%400;//防止数组越界

tcsZuobiao[0][head] = x;//蛇头的x坐标

tcsZuobiao[1][head] = y;//蛇头的y坐标

do//随机出果子

{

x1=rand()%20+1;

y1=rand()%20+1;

}

while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子

tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5

gotoxy(22,12);

cout << "\t游戏进行中!" << endl;

Refresh(tcsQipan,grade,gamespeed,length,score);

}

else // 不吃果子

{

if(otherkey)

{

tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;

tail=(tail+1)%400;//防止数组越界

tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;

head=(head+1)%400;//防止数组越界

tcsZuobiao[0][head]=x;//蛇头的x坐标

tcsZuobiao[1][head]=y;//蛇头的y坐标

tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;

gotoxy(22,12);

cout << "\t游戏进行中!" << endl;

Refresh(tcsQipan,grade,gamespeed,length,score);

}

else

{

gotoxy(22,12);

cout << "\t游戏暂停中!" << endl;

}

}

/

游戏运行时的核心算法结束

/

}

while(1)

{

while(!kbhit());

if((direction =getch())==13)//按回车键开始下一局

break;

if(direction ==27)//按ESC退出游戏

exit(0);

}

system("cls");//清除屏幕重新开始

}

return 0;

}

昨天跟你说的用CString 类型来写sql语句,假设的你在MFC下写的程序。

我看了下你的代码,貌似不是用的MFC。

你这个程序问题出在

#include "iostream"

#include "afxh"

这2个里好像有重复定义的东西。

那么改一下吧。

第1:

包含头文件里

#include "afxh" 去掉。

第2:

CString sql;

sqlFormat("SELECT FROM userinform where username='%s' and password='%s'",username,password);

m_pRecordset->Open((_bstr_t)sql,m_pConnectionGetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

改为

string sql;

_bstr_t bstSql;

sql="SELECT FROM userinform where username='"+username+"' and password='"+password+"'";

bstSql=sqlc_str();

m_pRecordset->Open(bstSql,m_pConnectionGetInterfacePtr(),

adOpenDynamic,adLockOptimistic,adCmdText);

你试下看看

回答:Mremily

大师

6月3日 16:45 #define N 200

#include<graphicsh>

#include<stdlibh>

#include<dosh>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define Esc 0x011b

int i,key;

int score=0;

int gamespeed=50000;

struct Food

{int x;

int y;

int yes;

}food;

struct Snake

{int x[N];

int y[N];

int node;

int direction;

int life;

}snake;

void Init();

void Close();

void DrawK();

void GamePlay();

void GameOver();

void PrScore();

void main()

{ Init();

DrawK();

GamePlay();

Close();

}

void Init()

{int gd=DETECT,gm;

initgraph(&gd,&gm,"F:\\tuoboc2");/此处为turboc的路径,读者可以根据自己的电脑而改/

cleardevice();

}

void DrawK()

{setbkcolor(LIGHTGREEN);

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);

for(i=50;i<=600;i+=10)

{rectangle(i,40,i+10,49);

rectangle(i,451,i+10,460);

}

for(i=40;i<=450;i+=10)

{rectangle(50,i,59,i+10);

rectangle(601,i,610,i+10);

}

}

void GamePlay()

{randomize();

foodyes=1;

snakelife=0;

snakedirection=1;

snakex[0]=100;snakey[0]=100;

snakex[1]=110;snakey[1]=100 ;

snakenode=2;

PrScore();

while(1)

{while(!kbhit())

{ if(foodyes==1)

{foodx=rand()%400+60;

foody=rand()%350+60;

while(foodx%10!=0)

foodx++;

while(foody%10!=0)

foody++;

foodyes=0;

}

if(foodyes==0)

{setcolor(GREEN);

rectangle(foodx,foody,foodx+10,foody-10);

}

for(i=snakenode-1;i>0;i--)

{snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

switch(snakedirection)

{case 1:

snakex[0]+=10;break;

case 2:

snakex[0]-=10;break;

case 3:

snakey[0]-=10;break;

case 4:

snakey[0]+=10;break;

}

for(i=3;i<snakenode;i++)

{

if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])

{ GameOver();

snakelife=1;

break;

}

}

if(snakex[0]<55||snakex[0]>595||snakey[0]<55||snakey[0]>455)

{GameOver();

snakelife=1;

}

if(snakelife==1)

break;

if(snakex[0]==foodx&&snakey[0]==foody)

{setcolor(0);

rectangle(foodx,foody,foodx+10,foody-10);

snakex[snakenode]=-20;

snakey[snakenode]=-20;

snakenode++;

foodyes=1;

score+=10;

PrScore();

}

setcolor(4);

for(i=0;i<snakenode;i++)

rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]-10);

delay(gamespeed);

setcolor(0);

rectangle(snakex[snakenode-1],snakey[snakenode-1],snakex[snakenode-1]+10,snakey[snakenode-1]-10);

}

if(snakelife==1)

break;

key=bioskey(0);

if(key==Esc)

break;

else if(key==UP&&snakedirection!=4)

snakedirection=3;

else if(key==RIGHT&&snakedirection!=2)

snakedirection=1;

else if(key==LEFT&&snakedirection!=1)

snakedirection=2;

else if(key==DOWN&&snakedirection!=3)

snakedirection=4;

}

}

void GameOver()

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(3,0,4);

outtextxy(100,100,"Mengmeng,i love you!");

getch();

}

void PrScore()

{char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);

}

void Close()

{ getch();

closegraph();

}

Mremily

# include<stdioh>

# include<stringh>

# include<stdlibh>

# define SPA 0

# define MAN 1

# define COM 2 / 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 /

int qipan[15][15]; / 1515的棋盘 /

int a,b,c,d,x; / a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置/

void start(); / 程序的主要控制函数 /

void draw(); / 画棋盘 /

int win(int p,int q); / 判断胜利 p q为判断点坐标 /

void AI(int p,int q); / 电脑下子 p q返回下子坐标 /

int value(int p,int q); / 计算空点p q的价值 /

int qixing(int n,int p,int q); / 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 /

void yiwei(int n,int i,int j); / 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 /

void main()

{

char k;

do{

x=225;

start();

printf("还要再来一把吗输入y或n:"); getchar(); scanf("%c",&k);

while(k!='y'&&k!='n'){

printf("输入错误,请重新输入\n"); scanf("%c",&k); }

system("cls"); }while(k=='y'); printf("谢谢使用!\n");

}

void start()

{

int i,j,a1,b1,c1,d1,choice; / a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 /

char ch;

printf("\t╔══════════════════════════════╗\n"); printf("\t║ ║\n"); printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n"); printf("\t║ ║\n"); printf("\t║ _______________________ ║\n"); printf("\t║ | _____________________ | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I 五 子 棋 I | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I made by 晓之蓬 I | ║\n"); printf("\t║ | I___________________I | ║\n"); printf("\t║ !_______________________! ║\n"); printf("\t║ _[__________]_ ║\n"); printf("\t║ ___|_______________|___ ║\n"); printf("\t║ |::: ____ | ║\n"); printf("\t║ | ~~~~ [CD-ROM] | ║\n"); printf("\t║ !_____________________! ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n"); printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n"); printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n"); printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n"); printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 1人机对战 2人人对战 ║\n"); printf("\t║ ║\n"); printf("\t╚═══════════════════════════ ══╝\n"); printf("\t\t\t请输入1或2:");

scanf("%d",&choice); / 选择模式:人机或人人 /

while(choice!=1&&choice!=2) {

printf("输入错误,请重新输入:"); scanf("%d",&choice); }

if(choice==1){ / 人机模式 /

system("cls");

printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n");

for(j=0;j<15;j++)

for(i=0;i<15;i++)

qipan[j][i]=SPA; / 置棋盘全为空 /

draw();

printf("先下请按1,后下请按2:"); scanf("%d",&i);

while(i!=1&&i!=2) { printf("输入错误,请重新输入:"); scanf("%d",&i); }

if(i==1) { / 如果玩家先手下子 /

printf("请下子:"); scanf("%d%d",&a,&b);

while((a<0||a>14)||(b<0||b>14)) {

printf("坐标错误!请重新输入:"); scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

}

while(x!=0){

if(x==225) {

c=7; d=7; qipan[d][c]=COM; x--; system("cls"); draw(); } / 电脑先下就下在7 7 /

else { AI(&c,&d); qipan[d][c]=COM; x--; system("cls"); draw(); } / 电脑下子 /

c1=c; d1=d; / 储存电脑上手棋型 /

if(win(c,d)){ / 电脑赢 /

printf("要悔棋吗?请输入y或n:"); getchar(); scanf("%c",&ch);

while(ch!='y'&&ch!='n') { printf("输入错误,请重新输入:");

scanf("%c",&ch); }

if(ch=='n') {

printf("下不过电脑很正常,请不要灰心!!!\n"); return; }

else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;

system("cls"); draw(); } / 悔棋 /

}

printf("电脑下在%d %d\n请输入:",c,d);

scanf("%d%d",&a,&b); / 玩家下子 /

if(a==15&&b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls"); draw();

printf("请输入:"); scanf("%d%d",&a,&b); } / 悔棋 /

while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

if(win(a,b)){ printf("电脑神马的都是浮云!!!\n");

return; } / 玩家赢 /

}

printf("和局\n");

}

if(choice==2){

system("cls");

printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n");

for(j=0;j<15;j++)

for(i=0;i<15;i++)

qipan[j][i]=SPA; / 置棋盘全为空 /

draw();

while(x!=0){

printf("1P请输入:"); scanf("%d%d",&a,&b);

if(a==15&&b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls");

draw(); printf("1P请输入:"); scanf("%d%d",&a,&b); }

while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

printf("1P下在%d %d。\n",a,b);

if(win(a,b)){ printf("你真棒!!!\n"); return; } / 玩家1赢 /

printf("2P请输入:"); scanf("%d%d",&c,&d);

if(c==15&&d==15) {

x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system("cls"); draw();

printf("2P请输入:"); scanf("%d%d",&c,&d); }

while((c<0||c>14)||(d<0||d>14)||qipan[d][c]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:"); scanf("%d%d",&c,&d);

}

c1=c; d1=d; x--; qipan[d][c]=COM; system("cls"); draw();

printf("2P下在%d %d。\n",c,d);

if(win(c,d)){ printf("你真棒!!!\n"); return; } / 玩家2赢 /

}

printf("和局\n");

}

}

void draw() / 画棋盘 /

{

int i,j;

char p[15][15][4];

for(j=0;j<15;j++)

for(i=0;i<15;i++){

if(qipan[j][i]==SPA) strcpy(p[j][i]," \0");

if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0");

if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0"); }

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n");

for(i=0,j=0;i<14;i++,j++){

printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);

printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n"); }

printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);

printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n");

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

}

int win(int p,int q) / 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 /

{

int k,n=1,m,P,Q; / k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 /

P=p; Q=q; k=qipan[q][p];

while(n!=5){

m=0;

while(k==qipan[q][p]){

m++; if(m==5) return 1;

yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) break;

}

n+=4; m-=1; p=P; q=Q; / 转向判断 /

while(k==qipan[q][p]){

m++;

if(m==5) return 1;

yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) break;

}

n-=3; p=P; q=Q; / 不成功则判断下一组方向 /

}

return 0;

}

void AI(int p,int q) / 电脑下子 p q返回下子坐标 /

{

int i,j,k,max=0,I,J; / I J为下点坐标 /

for(j=0;j<15;j++)

for(i=0;i<15;i++)

if(qipan[j][i]==SPA){ / 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 /

k=value(i,j); if(k>=max) { I=i; J=j; max=k; }

}

p=I; q=J;

}

int value(int p,int q) / 计算空点p q的价值 以k返回 /

{

int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp;

int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0}; / 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) /

while(n!=5){

k1=qixing(n,p,q); n+=4; / k1,k2为2个反方向的棋型编号 /

k2=qixing(n,p,q); n-=3;

if(k1>k2) { temp=k1; k1=k2; k2=temp; } / 使编号小的为k1,大的为k2 /

K1=k1; K2=k2; / K1 K2储存k1 k2的编号 /

Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10;

X1=k1%10; X2=k2%10; / X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) /

if(K1==-1) {

if(K2<0) { k+=0; continue; } else k+=a[X2][Y2][Z2]+5; continue; }; / 空棋型and其他 /

if(K1==-2) { if(K2<0) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/2; continue; }; / 边界冲棋型and其他 /

if(K1==-3) { if(K2<0) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/3; continue; }; / 边界空冲棋型and其他 /

if(((K1>-1&&K1<4)&&((K2>-1&&K2<4)||(K2>9&&K2<14)))||((K1>99&&K1<104)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){

/ 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值/

if(Z1+Z2>=2) { k+=a[X2][Y2][3]; continue; }

else { k+=a[X2][Y2][Z1+Z2+1]; continue; }

}

if(((K1>9&&K1<14)&&(K2>9&&K2<14))||((K1>109&&K1<114)&&(K2>109&&K2<114))){

/ 己冲己冲 对冲对冲 的棋型赋值/

if(Z1+Z2>=2) { k+=10000; continue; }

else { k+=0; continue; }

}

if(((K1>-1&&K1<4)&&((K2>99&&K2<104)||(K2>109&&K2<114)))||((K1>9&&K1<14)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){

/ 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值/

if(Z1==3||Z2==3) { k+=10000; continue; }

else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; continue; }

}

else

{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; continue; } / 其他棋型的赋值 /

}

return k;

}

int qixing(int n,int p,int q) / 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 /

{

int k,m=0; / 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3/

yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) k=-2; / 边界冲棋型 /

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+9; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) { k=m+9; return k; }

}

if(qipan[q][p]==SPA) k=m-1; / 己方活棋型 /

else k=m+9; / 己方冲棋型 /

}break;

case MAN:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+109; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) { k=m+109; return k; }

}

if(qipan[q][p]==SPA) k=m+99; / 对方活棋型 /

else k=m+109; / 对方冲棋型 /

}break;

case SPA:{

yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=-3; return k; } / 边界空冲棋型 /

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+29; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+29; return k; }

}

if(qipan[q][p]==SPA) k=m+19; / 己方空活棋型 /

else k=m+29; / 己方空冲棋型 /

}break;

case MAN:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+129; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+129; return k; }

}

if(qipan[q][p]==SPA) k=m+119; / 对方空活棋型 /

else k=m+129; / 对方空冲棋型 /

}break;

case SPA: k=-1; break; / 空棋型 /

}

}break;

}

return k;

}

void yiwei(int n,int i,int j) / 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 /

{

switch(n){

case 1: i+=1; break;

case 2: i+=1; j+=1; break;

case 3: j+=1; break;

case 4: i-=1; j+=1; break;

case 5: i-=1; break;

case 6: i-=1; j-=1; break;

case 7: j-=1; break;

case 8: i+=1; j-=1; break;

}

}

以上就是关于到底如何学好vc++ 本人已经有c c++编过贪吃蛇(调用windowsAPI)接下来是不死要看MFC源码呢 到底该怎么全部的内容,包括:到底如何学好vc++ 本人已经有c c++编过贪吃蛇(调用windowsAPI)接下来是不死要看MFC源码呢 到底该怎么、谁有用c语言制作贪吃蛇的代码,及使用方法,用VC打、有关MFC 能在VC++ 6.0运行的小程序 高手帮忙进来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9514579.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存