本文目录一览:
- 1、自己如何制作小游戏?
- 2、跪求任何可在VC/C++环境下运行的小游戏完整源代码文件...
- 3、制作游戏代码
- 4、C语言写的小游戏
- 5、求一C++小游戏源代码 简单点的?!!谢谢
- 6、跪求C或C++的小游戏五子棋的代码,!
自己如何制作小游戏?
制作小游戏需要学相关的编程知识。不同的游戏需要不同的编程代码。
编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
执行原理:
计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。
这种将高级程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。
解释方式下,计算机对高级语言书写的源程序一边解释一边执行,不能形成目标文件和执行文件。
编译方式下,首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。
然后通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。
跪求任何可在VC/C++环境下运行的小游戏完整源代码文件...
已经发到了。忘记改邮件主题了,它默认了第一个文件名:6款小游戏。
挺多的,主要有以下小游戏的源代码
rpg游戏圣剑2(这个游戏做的很强大,不过要用到DirectX的Lib和include,我也给你发过去了,放到C++安装目录相应的文件夹下面就可以了。)
冒险rpg 魔塔
六款经典小游戏:推箱子 贪吃蛇 俄罗斯方块 扫雷 拼图 连连看
全部是完整源代码,希望对你有所帮助。
snowtea的qq邮箱就是我。
制作游戏代码
Dim game(3,2),i,j,result,num '定义二维数组 二维长度3, 一维长度2
Dim fso ,ws,f ,logFileWrite,logFileRead, fileStr,flag,flagFailNum, flagIndex ' 定义日志文件
set ws = CreateObject("wscript.shell")
Set fso = CreateObject("scripting.filesystemobject")
If fso.fileexists("C:\Users\18190\Desktop\vbs\测试\game_log.txt") Then
Else
Set f = fso.createtextfile("C:\Users\18190\Desktop\vbs\测试\game_log.txt",true)
'If fso.fileexists("C:\Users\18190\Desktop\vbs\测试\game_log.txt") Then
' Set logFileWrite = fso.OpenTextFile("C:\Users\18190\Desktop\vbs\测试\game_log.txt",8,true)
' logFileWrite.writeLine "数字猜猜猜小游戏-游戏日志"
' end if
End If
For i=0 To 2 ' 关卡赋值
For j=4 To 5
game(i,j-4)= i*3+j
Next
Next
'For i=0 To 2
' For j=0 To 1
'MsgBox "game("i","j"): " game(i,j)
'Next
'Next
' 选择操作
Dim cnum, failNum, sucFlag,t
failNum =0
sucFlag =0
Do While 1=1
If sucFlag=1 Then
Exit Do
End if
If failNum =3 Then
MsgBox "您有连续三次操作失误,系统将直接退出..."
Exit do
end if
cnum = InputBox( "欢迎来到 数字猜猜猜小游戏 请选择操作:"chr(10)" 1.注册 2.登录 3.退出","数字猜猜猜小游戏")
If cnum ="" Then
cnum = "-1"
End if
Select Case cnum
Case 1
' 账户注册
Dim juname, upwd,regStr
regStr = ""
do while regStr = ""
uname = InputBox("请输入注册账号: ","数字猜猜猜小游戏-注册")
upwd = InputBox("请输入注册密码: ","数字猜猜猜小游戏-注册")
If uname "" Then
If upwd "" Then
regStr = uname"#"upwd
Else
regStr =""
MsgBox "您输入的注册账号密码有误,请重新输入"
End If
Else
regStr =""
MsgBox "您输入的注册账号密码有误,请重新输入"
End If
If regStr "" Then
If fso.fileexists("C:\Users\18190\Desktop\vbs\测试\game_user.txt") Then
Set logFileWrite = fso.OpenTextFile("C:\Users\18190\Desktop\vbs\测试\game_user.txt",8,true)
t= Year(now)"-"month(now)"-"day(now)" " Hour(now)":"minute(now)":"second(now)
'logFileWrite.WriteBlankLines 1
logFileWrite.writeLine regStr " "t
logFileWrite.close
MsgBox "注册成功!"
exit do
else
Set f = fso.createtextfile("C:\Users\18190\Desktop\vbs\测试\game_user.txt",true)
If fso.fileexists("C:\Users\18190\Desktop\vbs\测试\game_user.txt") Then
Set logFileWrite = fso.OpenTextFile("C:\Users\18190\Desktop\vbs\测试\game_user.txt",8,true)
logFileWrite.writeLine "数字猜猜猜小游戏-用户数据"
logFileWrite.writeLine regStr
logFileWrite.close
MsgBox "注册成功!"
exit do
end if
End If
end if
loop
'wscript.sleep 1000
case 2
C语言写的小游戏
这就是经典游戏-扫雷 的代码#include graphics.h
#include stdlib.h
#include dos.h
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
{
int num;
int roundnum;
int flag;
}Mine[10][10];
int gameAGAIN=0;
int gamePLAY=0;
int mineNUM;
char randmineNUM[3];
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void Init(void);
void MouseOn(void);
void MouseOff(void);
void MouseSetXY(int,int);
int LeftPress(void);
int RightPress(void);
void MouseGetXY(void);
void Control(void);
void GameBegain(void);
void DrawSmile(void);
void DrawRedflag(int,int);
void DrawEmpty(int,int,int,int);
void GameOver(void);
void GameWin(void);
int MineStatistics(int,int);
int ShowWhite(int,int);
void GamePlay(void);
void Close(void);
void main(void)
{
Init();
Control();
Close();
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,"D:\\tc20\\BGI");
}
void Close(void)
{
closegraph();
}
void MouseOn(void)
{
_AX=0x01;
geninterrupt(0x33);
}
void MouseOff(void)
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress(void)
{
_AX=0x03;
geninterrupt(0x33);
return(_BX1);
}
int RightPress(void)
{
_AX=0x03;
geninterrupt(0x33);
return(_BX2);
}
void MouseGetXY(void)
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
void Control(void)
{
int gameFLAG=1;
while(1)
{
if(gameFLAG)
{
GameBegain();
GamePlay();
if(gameAGAIN==1)
{
gameAGAIN=0;
continue;
}
}
MouseOn();
gameFLAG=0;
if(LeftPress())
{
MouseGetXY();
if(MouseX280MouseX300MouseY65MouseY85)
{
gameFLAG=1;
continue;
}
}
if(kbhit())
break;
}
MouseOff();
}
void DrawSmile(void)
{
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);
bar(287,80,293,81);
}
void DrawRedflag(int i,int j)
{
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
}
void DrawEmpty(int i,int j,int mode,int color)
{
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
}
void GameBegain(void)
{
int i,j;
cleardevice();
if(gamePLAY!=1)
{
MouseSetXY(290,70);
MouseX=290;
MouseY=70;
}
gamePLAY=1;
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i10;i++)
for(j=0;j10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();
randomize();//__page_break__
for(i=0;i10;i++)
for(j=0;j10;j++)
{
Mine[i][j].num=random(8);
if(Mine[i][j].num==1)
mineNUM++;
else
Mine[i][j].num=2;
Mine[i][j].flag=0;
}
sprintf(randmineNUM,"%d",mineNUM);
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;
MouseOn();
}
void GameOver(void)
{
int i,j;
setcolor(0);
for(i=0;i10;i++)
for(j=0;j10;j++)
if(Mine[i][j].num==1)
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
}
}
void GameWin(void)
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
}
int MineStatistics(int i,int j)
{
int nNUM=0;
if(i==0j==0)
{
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
}
else
if(i==0j==9)
{
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
}
else
if(i==9j==0)
{
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
}
else
if(i==9j==9)
{
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
}
else if(j==0)
{
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(j==9)
{
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
}
else if(i==0)
{
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(i==9)
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
}
else
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
}//__page_break__
return (nNUM);
}
int ShowWhite(int i,int j)
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)
return;
mineNUM--;
if(Mine[i][j].roundnum==0Mine[i][j].num!=1)
{
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
}
else
if(Mine[i][j].roundnum!=0)
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;
return ;
}
if(i!=0Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0j!=9Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9i!=9Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9j!=0Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0j!=0Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);
}
void GamePlay(void)
{
int i,j,Num;
for(i=0;i10;i++)
for(j=0;j10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);
while(!kbhit())
{
if(LeftPress())
{
MouseGetXY();
if(MouseX280MouseX300MouseY65MouseY85)
{
MouseOff();
gameAGAIN=1;
break;
}
if(MouseX190MouseX390MouseY90MouseY290)
{
j=(MouseX-190)/20;
i=(MouseY-90)/20;
if(Mine[i][j].flag==1)
continue;
if(Mine[i][j].num!=0)
{
if(Mine[i][j].num==1)
{
MouseOff();
GameOver();
break;
}
else
{
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)
ShowWhite(i,j);
else
{
sprintf(randmineNUM,"%d",Num);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
}
MouseOn();
Mine[i][j].num=0;
if(mineNUM1)
{
GameWin();
break;
}
}
}
}
}
if(RightPress())
{
MouseGetXY();
if(MouseX190MouseX390MouseY90MouseY290)
{
j=(MouseX-190)/20;
i=(MouseY-90)/20;
MouseOff();
if(Mine[i][j].flag==0Mine[i][j].num!=0)
{
DrawRedflag(i,j);
Mine[i][j].flag=1;
}
else
if(Mine[i][j].flag==1)
{
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
}
}
MouseOn();
sleep(1);
}
}
}
求一C++小游戏源代码 简单点的?!!谢谢
#includegraphics.h
#includestdlib.h
#includedos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;
int gamespeed=32000;
struct Food /*食物的结构体*/
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int yes; /*食物是否出现的变量*/
}food;
struct Snack /*蛇的结构体*/
{
int x[N];
int y[N];
int node; /*蛇的节数*/
int direction; /*蛇的方向*/
int life; /*蛇的生命,0活着,1死亡*/
}snake;
void Init(void); /*图形驱动*/
void Close(void); /*关闭游戏函数*/
void DrawK(void); /*画图函数*/
void GameOver(void);/*输出失败函数*/
void GamePlay(); /*游戏控制函数 主要程序*/
void PrScore(void); /*分数输出函数*/
DELAY(char ch)/*调节游戏速度*/
{
if(ch=='3')
{
delay(gamespeed); /*delay是延迟函数*/
delay(gamespeed);
}
else if(ch=='2')
{
delay(gamespeed);
}
}
Menu()/*游戏开始菜单*/
{
char ch;
printf("Please choose the gamespeed:\n");
printf("1-Fast 2-Normal 3-Slow\n");
printf("\nPlease Press The numbers..\n");
do
{ch=getch();}
while(ch!='1'ch!='2'ch!='3');
clrscr();
return(ch);
}
/*主函数*/
void main(void)
{
int ch;
ch=Menu();
Init();
DrawK();
GamePlay(ch);
Close();
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,"c:\\tc");
cleardevice();
}
void DrawK(void)
{
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(char ch)
{
randomize(); /*随机数发生器*/
food.yes=1; /*1代表要出现食物,0表示以存在食物*/
snake.life=0;
snake.direction=1;
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100;
snake.node=2;
PrScore();
while(1) /*可以重复游戏*/
{
while(!kbhit()) /*在没有按键的情况下蛇自己移动*/
{
if(food.yes==1) /*需要食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60; /*使用rand函数随机产生食物坐标*/
while(food.x%10!=0)
food.x++;
while(food.y%10!=0)
food.y++; /*判断食物是否出现在整格里*/
food.yes=0; /*现在有食物了*/
}
if(food.yes==0) /*有食物了就要显示出来*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i0;i--) /*贪吃蛇的移动算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*贪吃蛇的身体移动算法*/
}
switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/
{
case 1:snake.x[0]+=10;break;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0]+=10;break;
}
for(i=3;isnake.node;i++) /*判断是否头部与身体相撞*/
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{
GameOver();
snake.life=1;
break;
}
}
/*下面是判断是否撞到墙壁*/
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)
{
GameOver();
snake.life=1;
}
if(snake.life==1) /*如果死亡就退出循环*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y) /*判断蛇是否吃到食物*/
{
setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10); /*吃的食物后用黑色将食物擦去*/
snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*现把增加的一节放到看不到的地方去*/
snake.node++;
food.yes=1;
score+=10;
PrScore();
}
setcolor(4); /*每次移动后将后面的身体擦去*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
delay(gamespeed);
DELAY(ch);
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}
if(snake.life==1)
break;
key=bioskey(0); /*接受按键*/
if(key==ESC)
break;
else
if(key==UPsnake.direction!=4)/*判断是否改变方向*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}
}
void GameOver(void)
{
cleardevice();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"scord:%d",score);
outtextxy(55,20,str);
}
void Close(void)
{
getch();
closegraph();
}
贪吃蛇
跪求C或C++的小游戏五子棋的代码,!
#include "stdafx.h"
#include "3_1.h"
#include "3_1Doc.h"
#include "3_1View.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View
IMPLEMENT_DYNCREATE(CMy3_1View, CView)
BEGIN_MESSAGE_MAP(CMy3_1View, CView)
//{{AFX_MSG_MAP(CMy3_1View)
ON_WM_LBUTTONUP()
ON_WM_SETCURSOR()
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_PLAYER, OnPlayer)
ON_COMMAND(ID_CPMPUTER, OnCpmputer)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View construction/destruction
CMy3_1View::CMy3_1View()
{
// TODO: add construction code here
hcursorblack=AfxGetApp()-LoadCursor(IDC_CURSOR1);
hcursorwhite=AfxGetApp()-LoadCursor(IDC_CURSOR2);
m_bmwhite.LoadBitmap(IDB_WHITE);
m_bmblack.LoadBitmap(IDB_BLACK);
for(int i=0;i19;i++)
for(int j=0;j19;j++)
wzq[i][j]=0;
colorwhite=true;
//默认为人对机
vscomputer=1;
}
CMy3_1View::~CMy3_1View()
{
}
BOOL CMy3_1View::PreCreateWindow(CREATESTRUCT cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View drawing
void CMy3_1View::OnDraw(CDC* pDC)
{
CMy3_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//画背景
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRect myrect1(0,0,1200,800);
pDC-FillRect(myrect1,mybrush1);
CBrush mybrush;
mybrush.CreateSolidBrush(RGB(0,0,0));
for(int a=0;a3;a++)
for(int b=0;b3;b++)
{
CRect myrect(97+a*120,97+b*120,103+a*120,103+b*120);
pDC-FillRect(myrect,mybrush);
}
//画黑框线
CPen mypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC-SelectObject(mypen);
for(int i=0;i19;i++)
{
pDC-MoveTo(40,40+i*20);
pDC-LineTo(400,40+i*20);
pDC-MoveTo(40+i*20,40);
pDC-LineTo(40+i*20,400);
}
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
for(int n=0;n19;n++)
for(int m=0;m19;m++)
if(wzq[n][m]==1)
{
Dc.SelectObject(m_bmwhite);
pDC-BitBlt(n*20+32,m*20+32,160,160,Dc,0,0,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
Dc.SelectObject(m_bmblack);
pDC-BitBlt(n*20+32,m*20+32,160,160,Dc,0,0,SRCCOPY);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View printing
BOOL CMy3_1View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMy3_1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMy3_1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View diagnostics
#ifdef _DEBUG
void CMy3_1View::AssertValid() const
{
CView::AssertValid();
}
void CMy3_1View::Dump(CDumpContext dc) const
{
CView::Dump(dc);
}
CMy3_1Doc* CMy3_1View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMy3_1Doc)));
return (CMy3_1Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMy3_1View message handlers
void CMy3_1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//显示棋子
/////////////////////人对机
if(vscomputer==1)
{
if(point.x30point.x410point.y30point.y410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
if(colorwhitewzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC-BitBlt(px*20+32,py*20+32,160,160,Dc,0,0,SRCCOPY);
wzq[px][py]=1;
over(point);
colorwhite=false;
//保存白棋位置
vspoint=point;
//计算机下棋
computerdown();
}
}
}
//人对人
if(vscomputer==2)
{
if(point.x30point.x410point.y30point.y410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
if(colorwhitewzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC-BitBlt(px*20+32,py*20+32,160,160,Dc,0,0,SRCCOPY);
wzq[px][py]=1;
over(point);
colorwhite=false;
}
else if(wzq[px][py]==0)
{
Dc.SelectObject(m_bmblack);
pDC-BitBlt(px*20+32,py*20+32,160,160,Dc,0,0,SRCCOPY);
wzq[px][py]=-1;
over(point);
colorwhite=true;
}
}
}
CView::OnLButtonUp(nFlags, point);
}
BOOL CMy3_1View::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(nHitTest==HTCLIENT)
{
if(colorwhite)
{
CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd;
CStatusBar*pStatus=pFrm-m_wndStatusBar;
if(pStatus)
{
pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(IDI_WHITE));
pStatus-SetPaneText(0,"白棋下");
}
SetCursor(hcursorwhite);
}
else
{
CMainFrame*pFrm=(CMainFrame*)AfxGetApp()-m_pMainWnd;
CStatusBar*pStatus=pFrm-m_wndStatusBar;
if(pStatus)
{
//显示图像
pStatus-GetStatusBarCtrl().SetIcon(0,AfxGetApp()-LoadIcon(IDI_BLACK));
//显示文字
pStatus-SetPaneText(0,"黑棋下");
}
SetCursor(hcursorblack);
}
return 1;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
void CMy3_1View::over(CPoint point)
{
//获取鼠标指向数组位置
int x=(point.x-30)/20;
int y=(point.y-30)/20;
//开始判断的坐标
int xx,yy;
if(x4)
xx=0;
else
xx=x-4;
if(y4)
yy=0;
else
yy=y-4;
int i,j,a;
//横向判断
for(i=xx;i15;i++)
{
a=0;
for(j=i;ji+5;j++)
{
a=a+wzq[j][y];
if(a==5)
{
AfxMessageBox("白棋胜!");OnStart();return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");OnStart();return;
}
}
}
//竖向判断
for(i=yy;i15;i++)
{
a=0;
for(j=i;ji+5;j++)
{
a=a+wzq[x][j];
if(a==5)
{
AfxMessageBox("白棋胜!");OnStart();return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");OnStart();return;
}
}
}
//向右下角
//判断起点位置
if(xy)
{
if(xx==0)
yy=y-x;
}
else
{
if(yy==0)
xx=x-y;
}
//参数1时退出循环
int over=0;
do
{
a=0;
for(i=0;i5;i++)
{
if((xx+i)19||(yy+i)19)
{
a=a+wzq[xx+i][yy+i];
if(a==5)
{
AfxMessageBox("白棋胜!");OnStart();return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");OnStart();return;
}
}
//到了边界
else
over=1;
}
xx+=1;
yy+=1;
}while(over==0);
//向左下角
if(y(18-x))
{
if(x13)
{
yy=y-(18-x);
xx=18;
}
else
{
yy=y-4;
xx=x+4;
}
}
else
{
if(y5)
{
xx=x+y;
yy=0;
}
else
{
yy=y-4;
xx=x+4;
}
}
over=0;
do
{
a=0;
for(i=0;i5;i++)
{
if((xx-i)=0||(yy+i)19)
{
a=a+wzq[xx-i][yy+i];
if(a==5)
{
AfxMessageBox("白棋胜!");OnStart();return;
}
if(a==-5)
{
AfxMessageBox("黑棋胜!");OnStart();return;
}
}
//到了边界
else
over=1;
}
xx-=1;
yy+=1;
}while(over==0);
}
void CMy3_1View::OnStart()
{
// TODO: Add your command handler code here
for(int i=0;i19;i++)
for(int j=0;j19;j++)
wzq[i][j]=0;
colorwhite=true;
Invalidate();
}
//黑棋下
void CMy3_1View::putdown(CPoint point)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
Dc.SelectObject(m_bmblack);
pDC-BitBlt(point.x*20+32,point.y*20+32,160,160,Dc,0,0,SRCCOPY);
wzq[point.x][point.y]=-1;
//变数组坐标为棋盘坐标
CPoint overpoint;
overpoint.x=point.x*20+30;
overpoint.y=point.y*20+30;
over(overpoint);
colorwhite=true;
}
//轮到计算机下棋
void CMy3_1View::computerdown()
{
//把各种情形赋值为如下
bpointcan4=(-1,-1);
wpointcan4=(-1,-1);
bpointcan3=(-1,-1);
wpointcan3=(-1,-1);
bpointcan2=(-1,-1);
wpointcan2=(-1,-1);
bpointcan1=(-1,-1);
//搜索最好的落棋点
for(int i=0;i19;i++)
for(int j=0;j19;j++)
bestputdown(i,j);
//判断放在哪里
//棋多的位置优先
//黑白一样多时黑先
if(bpointcan4.x!=-1)
{
putdown(bpointcan4);
return;
}
else if(wpointcan4.x!=-1)
{
putdown(wpointcan4);
return;
}
else if(bpointcan3.x!=-1)
{
putdown(bpointcan3);
return;
}
else if(wpointcan3.x!=-1)
{
putdown(wpointcan3);
return;
}
else if(bpointcan2.x!=-1)
{
putdown(bpointcan2);
return;
}
else if(wpointcan2.x!=-1)
{
putdown(wpointcan2);
return;
}
else
{
putdown(bpointcan1);
return;
}
}
//检查四个方向,各算出五个棋子的和并赋值
void CMy3_1View::bestputdown(int i,int j)
{
int num[4];
CPoint numbig;
int a,k;
/////////////////////////////// num[0] --
a=0;
if(i15)
for(k=0;k5;k++)
a=a+wzq[i+k][j];
num[0]=abs(a);
////////////////////////////// num[1] "|"
a=0;
if(j15)
for(k=0;k5;k++)
a=a+wzq[i][j+k];
num[1]=abs(a);
/////////////////////////////// num[2] "\"
a=0;
if(i15j15)
for(k=0;k5;k++)
a=a+wzq[i+k][j+k];
num[2]=abs(a);
////////////////////////////// num[3] "/"
a=0;
if((i4)(j15))
for(k=0;k5;k++)
a=a+wzq[i-k][j+k];
num[3]=abs(a);
//比较哪个方向同色棋最多
numbig=maxnum(num[0],num[1],num[2],num[3]);
//在得到最大值和方向上寻找落棋点
switch(numbig.y)
{
case 4:
searchcandown4(i,j,numbig.x);break;
case 3:
searchcandown3(i,j,numbig.x);break;
case 2:
searchcandown2(i,j,numbig.x);break;
default:
searchcandown1(i,j,numbig.x);
}
}
CPoint CMy3_1View::maxnum(int a, int b, int c, int d)
{
//point.x为方向值
//point.y为最大值
CPoint point;
if(a=b)
{
point.x=0;
point.y=a;
}
else
{
point.x=1;
point.y=b;
}
if(cpoint.y)
{
point.x=2;
point.y=c;
}
if(dpoint.y)
{
point.x=3;
point.y=d;
}
return point;
}
//有四个同色棋
void CMy3_1View::searchcandown4(int i, int j, int n)
{
// CPoint point;
int k;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k5;k++)
//如果第一个是空
if(wzq[i][j]==0)
{
//如果下面有白棋
if(wzq[i+1][j]==1)
{
//下面位置可以下棋,已经有四个白棋
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
//下面位置可以下棋,已经有四个黑棋
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
}
//如果找到下棋位置,一定能找到!
else if(wzq[i+k][j]==0)
{
//如果第一个是白棋
if(wzq[j][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j;
break;
}
//否则第一个是黑棋
else
{
bpointcan4.x=i+k;
bpointcan4.y=j;
break;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k5;k++)
{
if(wzq[i][j]==0)
if(wzq[i][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j+k;
break;
}
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k5;k++)
{
if(wzq[i][j]==0)
if(wzq[i+1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i+k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i+k;
bpointcan4.y=j+k;
break;
}
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k5;k++)
{
if(wzq[i][j]==0)
if(wzq[i-1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i-k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i-k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i-k;
bpointcan4.y=j+k;
break;
}
}
}
}
//最多有三个同色
void CMy3_1View::searchcandown3(int i, int j, int n)
{
int k=0;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k5;k++)
//找到位置
if(wzq[i+k][j]==0)
{
//下一个是白棋
if(wzq[i+k+1][j]==1)
{
//下面位置可以下棋,已经有三个白棋
wpointcan3.x=i+k;
wpointcan3.y=j;
}
//下一个是黑棋
else if(wzq[i+k+1][j]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k5;k++)
if(wzq[i][j+k]==0)
{
if(wzq[i][j+k-1]==1)
{
wpointcan3.x=i;
wpointcan3.y=j+k;
}
else if(wzq[i][j+k+1]==-1)
{
bpointcan3.x=i;
bpointcan3.y=j+k;
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k5;k++)
if(wzq[i+k][j+k]==0)
{
if(wzq[i+k+1][j+k+1]==1)
{
wpointcan3.x=i+k;
wpointcan3.y=j+k;
}
else if(wzq[i+k+1][j+k+1]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j+k;
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k5;k++)
if(wzq[i-k][j+k]==0)
{
if(wzq[i-k-1][j+k+1]==1)
{
wpointcan3.x=i-k;
wpointcan3.y=j+k;
}
else if(wzq[i-k-1][j+k+1]==-1)
{
bpointcan3.x=i-k;
bpointcan3.y=j+k;
}
}
}
//最多有两个同色
void CMy3_1View::searchcandown2(int i, int j, int n)
{
int k=0,m=0,a=0,b=0;
///////////////////////////// num[0] "--"
if(n==0)
{
//判断有多少个空位置
for(k=0;k5;k++)
if(wzq[i+k][j]==0)
m+=1;
//如果只有一个空位置
if(m==1)
for(a=0;a5;a++)
//找到空位置
if(wzq[i+a][j]==0)
{
//下面两个棋子值的和
b=wzq[i+a+1][j]+wzq[i+a+2][j];
//都是黑棋
if(b==-2)
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+a;
bpointcan2.y=j;
}
//都是白棋
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j;
}
}
//如果有三个空位置,说明另外两个同色
if(m==3)
{
for(a=0;a5;a++)
//如果两个是黑棋
if(wzq[i+a][j]==-1)
{
for(b=0;b5;b++)
//如果找到空位置
if(wzq[i+b][j]==0)
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+b;
bpointcan2.y=j; break;
}
}
else
//如果两个是白棋
if(wzq[i+a][j]==1)
{
for(b=0;b5;b++)
if(wzq[i+b][j]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j; break;
}
}
}
}
//////////////////////////// num[1] "|"
m=0;
if(n==1)
{
for(k=0;k5;k++)
if(wzq[i][j+k]==0)
m++;
if(m==1)
for(a=0;a5;a++)
if(wzq[i][j+a]==0)
{
b=wzq[i][j+a+1]+wzq[i][j+a+2];
if(b==-2)
{
bpointcan2.x=i;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a5;a++)
if(wzq[i][j+a]==-1)
{
for(b=0;b5;b++)
if(wzq[i][j+b]==0)
{
bpointcan2.x=i;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i][j+a]==1)
{
for(b=0;b5;b++)
if(wzq[i][j+b]==0)
{
wpointcan2.x=i;
wpointcan2.y=j+b; break;
}
}
}
}
/////////////////////////////// num[2] "\"
m=0;
if(n==2)
{
for(k=0;k5;k++)
if(wzq[i+k][j+k]==0)
m++;
if(m==1)
for(a=0;a5;a++)
if(wzq[i+a][j+a]==0)
{
b=wzq[i+a+1][j+a+1]+wzq[i+a+2][j+a+2];
if(b==-2)
{
bpointcan2.x=i+a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a5;a++)
if(wzq[i+a][j+a]==-1)
{
for(b=0;b5;b++)
if(wzq[i+b][j+b]==0)
{
bpointcan2.x=i+b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i+a][j+a]==1)
{
for(b=0;b5;b++)
if(wzq[i+b][j+b]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j+b; break;
}
}
}
}
////////////////////////////// num[3] "/"
m=0;
if(n==3)
{
for(k=0;k5;k++)
if(wzq[i-k][j+k]==0)
m++;
if(m==1)
for(a=0;a5;a++)
if(wzq[i-a][j+a]==0)
{
b=wzq[i-a-1][j+a+1]+wzq[i-a-2][j+a+2];
if(b==-2)
{
bpointcan2.x=i-a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i-a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a5;a++)
if(wzq[i-a][j+a]==-1)
{
for(b=0;b5;b++)
if(wzq[i-b][j+b]==0)
{
bpointcan2.x=i-b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i-a][j+a]==1)
{
for(b=0;b5;b++)
if(wzq[i-b][j+b]==0)
{
wpointcan2.x=i-b;
wpointcan2.y=j+b; break;
}
}
}
}
}
//如果五个位置的和是一
void CMy3_1View::searchcandown1(int i, int j, int n)
{
//计算刚才白棋落棋点
int ii=(vspoint.x-30)/20;
int jj=(vspoint.y-30)/20;
int a;
for(a=0;a5;a++)
//如果不到边界
if(ii+a19)
{
//向右,如果有空位置
if(wzq[ii+a][jj]==0)
{
//在这个位置下黑棋
bpointcan1.x=ii+a;
bpointcan1.y=jj;
return;
}
}
//到了边界
else
//向左,如果有空位置
if(wzq[ii-1][jj]==0)
{
bpointcan1.x=ii-a;
bpointcan1.y=jj;
return;
}
}
//vscomputer:2表示人对人,1表示人对机
void CMy3_1View::OnPlayer()
{
// TODO: Add your command handler code here
vscomputer=2;
OnStart();
}
void CMy3_1View::OnCpmputer()
{
// TODO: Add your command handler code here
vscomputer=1;
OnStart();
}