五子棋的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
usingnamespacestd
constintN=15 //15*15的棋盘
constcharChessBoardflag='' //棋盘标志
constcharflag1='o' //玩家1或电脑的棋子标志
constcharflag2='X' //玩家2的棋子标志
typedefstructCoordinate 知蔽 //坐标类
{
intx 搭旅州 //代表行
inty //代表列
}Coordinate
classGoBang //五子棋类
{
public:
GoBang() //初始化
{
InitChessBoard()
}
voidPlay() //下棋
{
CoordinatePos1 //玩家1或电脑
CoordinatePos2 //玩家2
intn=0
while(1)
{
intmode=ChoiceMode()
while(1)
{
if(mode==1) //电脑vs玩家
{
ComputerChess(Pos1,flag1) //电脑下棋
if(GetVictory(Pos1,0,flag1)==1) //0表示电脑,真表示镇罩获胜
break
PlayChess(Pos2,2,flag2) //玩家2下棋
if(GetVictory(Pos2,2,flag2)) //2表示玩家2
break
}
else //玩家1vs玩家2
{
PlayChess(Pos1,1,flag1) //玩家1下棋
if(GetVictory(Pos1,1,flag1)) //1表示玩家1
break
PlayChess(Pos2,2,flag2) //玩家2下棋
if(GetVictory(Pos2,2,flag2)) //2表示玩家2
break
}
}
cout<<"***再来一局***"<<endl
cout<<"yorn:"
charc='y'
cin>>c
if(c=='n')
break
}
}
protected:
intChoiceMode() //选择模式
{
inti=0
system("cls") //系统调用,清屏
InitChessBoard() //重新初始化棋盘
cout<<"***0、退出 1、电脑vs玩家 2、玩家vs玩家***"<<endl
while(1)
{
cout<<"请选择:"
cin>>i
if(i==0) //选择0退出
exit(1)
if(i==1||i==2)
returni
cout<<"输入不合法"<<endl
}
}
voidInitChessBoard() //初始化棋盘
{
for(inti=0i<N+1++i)
{
for(intj=0j<N+1++j)
{
_ChessBoard[i][j]=ChessBoardflag
}
}
}
voidPrintChessBoard() //打印棋盘,这个函数可以自己调整
{
system("cls") //系统调用,清空屏幕
for(inti=0i<N+1++i)
{
for(intj=0j<N+1++j)
{
if(i==0) //打印列数字
{
if(j!=0)
printf("%d ",j)
else
printf(" ")
}
elseif(j==0) //打印行数字
printf("%2d",i)
else
{
if(i<N+1)
{
printf("%c|",_ChessBoard[i][j])
}
}
}
cout<<endl
cout<<" "
for(intm=0m<Nm++)
{
printf("--|")
}
cout<<endl
}
}
voidPlayChess(Coordinate&pos,intplayer,intflag) //玩家下棋
{
PrintChessBoard() //打印棋盘
while(1)
{
printf("玩家%d输入坐标:",player)
cin>>pos.x>>pos.y
if(JudgeValue(pos)==1) //坐标合法
break
cout<<"坐标不合法,重新输入"<<endl
}
_ChessBoard[pos.x][pos.y]=flag
}
voidComputerChess(Coordinate&pos,charflag) //电脑下棋
{
PrintChessBoard() //打印棋盘
intx=0
inty=0
while(1)
{
x=(rand()%N)+1 //产生1~N的随机数
srand((unsignedint)time(NULL))
y=(rand()%N)+1 //产生1~N的随机数
srand((unsignedint)time(NULL))
if(_ChessBoard[x][y]==ChessBoardflag) //如果这个位置是空的,也就是没有棋子
break
}
pos.x=x
pos.y=y
_ChessBoard[pos.x][pos.y]=flag
}
intJudgeValue(constCoordinate&pos) //判断输入坐标是不是合法
{
if(pos.x>0&&pos.x<=N&&pos.y>0&&pos.y<=N)
{
if(_ChessBoard[pos.x][pos.y]==ChessBoardflag)
{
return1 //合法
}
}
return0 //非法
}
intJudgeVictory(Coordinatepos,charflag) //判断有没有人胜负(底层判断)
{
intbegin=0
intend=0
intbegin1=0
intend1=0
//判断行是否满足条件
(pos.y-4)>0?begin=(pos.y-4):begin=1
(pos.y+4)>N?end=N:end=(pos.y+4)
for(inti=pos.x,j=beginj+4<=endj++)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i][j+1]==flag&&
_ChessBoard[i][j+2]==flag&&_ChessBoard[i][j+3]==flag&&
_ChessBoard[i][j+4]==flag)
return1
}
//判断列是否满足条件
(pos.x-4)>0?begin=(pos.x-4):begin=1
(pos.x+4)>N?end=N:end=(pos.x+4)
for(intj=pos.y,i=begini+4<=endi++)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j]==flag&&
_ChessBoard[i+2][j]==flag&&_ChessBoard[i+3][j]==flag&&
_ChessBoard[i+4][j]==flag)
return1
}
intlen=0
//判断主对角线是否满足条件
pos.x>pos.y?len=pos.y-1:len=pos.x-1
if(len>4)
len=4
begin=pos.x-len //横坐标的起始位置
begin1=pos.y-len //纵坐标的起始位置
pos.x>pos.y?len=(N-pos.x):len=(N-pos.y)
if(len>4)
len=4
end=pos.x+len //横坐标的结束位置
end1=pos.y+len //纵坐标的结束位置
for(inti=begin,j=begin1(i+4<=end)&&(j+4<=end1)++i,++j)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j+1]==flag&&
_ChessBoard[i+2][j+2]==flag&&_ChessBoard[i+3][j+3]==flag&&
_ChessBoard[i+4][j+4]==flag)
return1
}
//判断副对角线是否满足条件
(pos.x-1)>(N-pos.y)?len=(N-pos.y):len=pos.x-1
if(len>4)
len=4
begin=pos.x-len //横坐标的起始位置
begin1=pos.y+len //纵坐标的起始位置
(N-pos.x)>(pos.y-1)?len=(pos.y-1):len=(N-pos.x)
if(len>4)
len=4
end=pos.x+len //横坐标的结束位置
end1=pos.y-len //纵坐标的结束位置
for(inti=begin,j=begin1(i+4<=end)&&(j-4>=end1)++i,--j)
{
if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j-1]==flag&&
_ChessBoard[i+2][j-2]==flag&&_ChessBoard[i+3][j-3]==flag&&
_ChessBoard[i+4][j-4]==flag)
return1
}
for(inti=1i<N+1++i) //棋盘有没有下满
{
for(intj=1j<N+1++j)
{
if(_ChessBoard[i][j]==ChessBoardflag)
return0 //0表示棋盘没满
}
}
return-1 //和棋
}
boolGetVictory(Coordinate&pos,intplayer,intflag) //对JudgeVictory的一层封装,得到具体那个玩家获胜
{
intn=JudgeVictory(pos,flag) //判断有没有人获胜
if(n!=0) //有人获胜,0表示没有人获胜
{
PrintChessBoard()
if(n==1) //有玩家赢棋
{
if(player==0) //0表示电脑获胜,1表示玩家1,2表示玩家2
printf("***电脑获胜***\n")
else
printf("***恭喜玩家%d获胜***\n",player)
}
else
printf("***双方和棋***\n")
returntrue //已经有人获胜
}
returnfalse //没有人获胜
}
private:
char_ChessBoard[N+1][N+1]
}
扩展资料:设计思路
1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。
2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。
3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。
"扫雷"小游戏C代码
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w
int i,j /*循环变量*/
int x,y,z[999] /*雷的位置*/
int t,s /*标记*/
int m,n,lei /*计数*/
int u,v /*输入*/
int hang,lie,ge,mo /*自定义变量*/
srand((int)time(NULL)) /*启动随机数发生器*/
leb1: /*选择模式*/
printf("\n 请选择模式:\n 1.标准 2.自定义\n")
scanf("%d",&mo)
if(mo==2) /*若选择自定义模式,要输入三个参数*/
{do
{t=0printf("请输入\n行数 列数 雷的个数\n")
scanf("%d%d%d",&hang,&lie,&ge)
if(hang<2){printf("行数太少\n")t=1}
if(hang>100){printf("行数太多\n")t=1}
if(lie<2){printf("列数太少\n")t=1}
if(lie>100){printf("列数太多\n")t=1}
if(ge<1){printf("至少要有一个雷\n")t=1}
if(ge>=(hang*lie)){printf("雷太多了\n"哪清)t=1}
}while(t==1)
}
else{hang=10,lie=10,ge=10} /*否则就是选择了标准模式(默认参数)*/
for(i=1i<=gei=i+1) /*确定雷的位置李拍前*/
{do
{t=0z[i]=rand( )%(hang*lie)
for(j=1j<ij=j+1){if(z[i]==z[j]) t=1}
}while(t==1)
}
for(i=0i<=hang+1i=i+1) /*初始化a,b,c*/
{for(j=0j<=lie+1j=j+1) {a[i][j]='1'b[i][j]='1'c[i][j]='0'} }
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1) {a[i][j]='+'} }
for(i=1i<=gei=i+1) /*把雷放入c*/
{x=z[i]/lie+1y=z[i]%lie+1c[x][y]='#'}
for(i=1i<=hangi=i+1) /*计算b中数字*/
{for(j=1j<=liej=j+1)
{m=48
if(c[i-1][j-1]=='#')m=m+1if(c[i][j-1]=='#')m=m+1
if(c[i-1][j]=='#')m=m+1 if(c[i+1][j+1]=='#')m=m+1
if(c[i][j+1]=='#')m=m+1 if(c[i+1][j]=='#')m=m+1
if(c[i+1][j-1]=='#')m=m+1if(c[i-1][j+1]=='#')m=m+1
b[i][j]=m
}
}
for(i=1i<=gei=i+1) /*把雷放入b中*/
{x=z[i]/lie+1y=z[i]%lie+1b[x][y]='#'}
lei=ge /*以下是游戏设计*/
do
{leb2: /*输出*/
system("cls")printf("\n\n\n\n")
printf(" 贺迅")
for(i=1i<=liei=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c ",w)
}
printf("\n |")
for(i=1i<=liei=i+1){printf("---|")}
printf("\n")
for(i=1i<=hangi=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c |",w)
for(j=1j<=liej=j+1)
{if(a[i][j]=='0')printf(" |")
else printf(" %c |",a[i][j])
}
if(i==2)printf(" 剩余雷个数")
if(i==3)printf(" %d",lei)
printf("\n |")
for(j=1j<=liej=j+1){printf("---|")}
printf("\n")
}
scanf("%d%c%d",&u,&w,&v) /*输入*/
u=u+1,v=v+1
if(w!='#'&&a[u][v]=='@')
goto leb2
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'lei=lei-1}
else if(a[u][v]=='@'){a[u][v]='?'lei=lei+1}
else if(a[u][v]=='?'){a[u][v]='+'}
goto leb2
}
a[u][v]=b[u][v]
leb3: /*打开0区*/
t=0
if(a[u][v]=='0')
{for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=1i<=hangi=i+1)
{for(j=liej>=1j=j-1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=hangi>=1i=i-1)
{for(j=1j<=liej=j+1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=hangi>=1i=i-1)
{for(j=liej>=1j=j-1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=1i<=hangi=i+1) /*检测0区*/
{for(j=1j<=liej=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1
}
}
}
if(t==1)goto leb3
}
n=0 /*检查结束*/
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge))
for(i=1i<=gei=i+1) /*游戏结束*/
{x=z[i]/lie+1y=z[i]%lie+1a[x][y]='#'}
printf(" ")
for(i=1i<=liei=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c ",w)
}
printf("\n |")
for(i=1i<=liei=i+1){printf("---|")}
printf("\n")
for(i=1i<=hangi=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c |",w)
for(j=1j<=liej=j+1)
{if(a[i][j]=='0')printf(" |")
else printf(" %c |",a[i][j])
}
if(i==2)printf(" 剩余雷个数")
if(i==3)printf(" %d",lei)printf("\n |")
for(j=1j<=liej=j+1) {printf("---|")}
printf("\n")
}
if(n==(hang*lie-ge)) printf("你成功了!\n")
else printf(" 游戏结束!\n")
printf(" 重玩请输入1\n")
t=0
scanf("%d",&t)
if(t==1)goto leb1
}
/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/
#include<graphics.h>#include<stdlib.h>
#include<dos.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=50i<=600i+=10)
{
rectangle(i,40,i+10,49)/*画出上边框*/
rectangle(i,451,i+10,460)/*画出下边框*/
}
for(i=40i<=450i+=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]=100snake.y[0]=100
snake.x[1]=110snake.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-1i>0i--) /*贪吃蛇的移动算法*/
{
snake.x[i]=snake.x[i-1]
snake.y[i]=snake.y[i-1]/*贪吃蛇的身体移动算法*/
}
switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/
{
case 1:snake.x[0]+=10break
case 2:snake.x[0]-=10break
case 3:snake.y[0]-=10break
case 4:snake.y[0]+=10break
}
for(i=3i<snake.nodei++) /*判断是否头部与身体相撞*/
{
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.x&&snake.y[0]==food.y) /*判断蛇是否吃到食物*/
{
setcolor(0)
rectangle(food.x,food.y,food.x+10,food.y-10)/*吃的食物后用黑色将食物擦去*/
snake.x[snake.node]=-20snake.y[snake.node]=-20/*现把增加的一节放到看不到的地方去*/
snake.node++
food.yes=1
score+=10
PrScore()
}
setcolor(4)/*每次移动后将后面的身体擦去*/
for(i=0i<snake.nodei++)
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==UP&&snake.direction!=4)/*判断是否改变方向*/
snake.direction=3
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2
else
if(key==DOWN&&snake.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()
}
贪吃蛇
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)