
基础不好从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运行的小程序 高手帮忙进来等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)