c++一些好玩的代码?编程好玩的代码
各位老铁们好,相信很多人对c++一些好玩的代码都不是特别的了解,因此呢,今天就来为大家分享下关于c++一些好玩的代码以及编程好玩的代码的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
C++做一个小游戏,有源代码的最好,谢谢
#include<iostream>
#include<fstream>
#include<ctime>
#include<cmath>
#include<stdlib.h>
#include<stdio.h>//时间//文件
#include<string>
#define random(x)(rand()%x)
using namespace std;
void thunder(int Dif,int Row,int Column,char*USer)
{
int r,c,alls[22][22],backstage[22][22]={0};
srand((int)time(0));
for(r=1;r<=Row;r++)//生成alls(0~1)1是雷
{
for(c=1;c<=Column;c++)
{
if(random(6)<1){alls[r][c]=1;} else{alls[r][c]=0;};
}
};
for(r=0;r<=Row+1;r++)//生成 backstage(正确答案)
{
for(int c=0;c<=Column+1;c++)
{
if(alls[r][c]==1)
{
(int)backstage[r][c]='*';//将1变为*代表雷
}
else
{
for(int i=r-1;i<=r+1;i++)//将0变为数字(代表周围雷数)
for(int j=c-1;j<=c+1;j++)
{
if(alls[i][j]!=alls[r][c]&&alls[i][j]==1){backstage[r][c]++;};
}
};//else结束
};// for结束
};// for结束
cout<<"======================*********================================"<<endl;
char surface[22][22];//生成surface(用户界面)
for(r=0;r<22;r++)//全部为零
for(c=0;c<22;c++)
{
surface[r][c]='0';
}
for(r=1;r<=Row;r++)//中间化#形成0包围#的形式(通过数#-->(*||数字)的个数赢的时候停止循环)
for(c=1;c<=Column;c++)
{
surface[r][c]='#';
}
for(r=1;r<=Row;r++)//输出 surface界面便于检查
{
for(c=1;c<=Column;c++){cout<<""<<surface[r][c];};
cout<<endl;
};
cout<<"请按格式输入"<<endl
<<"前两个数字为坐标,最后一个数字“1”表示此位置为雷,“0”则表示不是。"<<endl
<<"如:1 3 1表示一行三列是雷;2 4 0表示二行四列不是雷"<<endl
<<"提示:当数字周围雷都被扫出时,可再次按要求输入此位置,可得到周围数字。"<<endl;
long i=10000000L;//计算时间开始
clock_t start,finish;
double duration;
start=clock();
while(i--);//计算时间开始
int num=Row*Column;//计算#号个数
while(num!=0)//控制是否点完所有位置
{
int x,y,judge;
cin>>x>>y>>judge;
if(alls[x][y]!=judge)
{
cout<<"you lose!!!"<<endl;
cout<<"The answer is:"<<endl;
for(r=1;r<=Row;r++)//输了输出backstage显示正确答案
{
for(int c=1;c<=Column;c++)
{
cout<<""<<(char)(backstage[r][c]==42?backstage[r][c]:backstage[r][c]+'0');//输出backstage
}
cout<<endl;
}
break;
}
else
{
if(alls[x][y]==1){if(surface[x][y]=='#'){num--;}surface[x][y]='@';}//雷判断正确显示“@”;数“#”
else
{
if(backstage[x][y]!=0)//数字判断正确显示数字
{
if(surface[x][y]=='#'){num--; surface[x][y]=backstage[x][y]+'0';}//数“#”
else
{
int lei_num=0;
for(int i=x-1;i<=x+1;i++)//数数字周围雷的个数
for(int j=y-1;j<=y+1;j++)
{
if(surface[i][j]=='@')
lei_num++;
}
if(backstage[x][y]==lei_num)//看数字周围雷是否全部扫出提示显示数字周围
{
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
if(surface[i][j]=='#')//数“#”
{
surface[i][j]=backstage[i][j]+'0';
num--;
}
}
}
}
else//数字为零时显示零周围的零
{
if(surface[x][y]=='#'){num--;};//数“#”
surface[x][y]=backstage[x][y]+'0';
for(int i=x-1;i<=x+1;i++)//显示零周围的数字
for(int j=y-1;j<=y+1;j++)
if(surface[i][j]=='#')//避免死循环
{
surface[i][j]=backstage[i][j]+'0';
num--;//数“#”
}
for(int k=0;k<20;k++)//最多20层零(点出最边上的零)
{
for(int R=1;R<=Row;R++)//检查所有零
for(int C=1;C<=Column;C++)//再次显示零周围的数字
{
if(surface[R][C]=='0')
{
for(int i=R-1;i<=R+1;i++)
for(int j=C-1;j<=C+1;j++)
{
if(surface[i][j]=='#')//避免死循环数“#”
{
surface[i][j]=backstage[i][j]+'0';
num--;
}
}
}
}//匹配for内
}//匹配 for外
}//匹配else
}//匹配else
}//匹配els
cout<<endl;
cout<<"======================*********================================"<<endl;
for(r=1;r<=Row;r++)//输出界面(已修改)
{
for(c=1;c<=Column;c++){cout<<""<<surface[r][c];};
cout<<endl;
};
}//匹配while
finish=clock();//计算时间结束
duration=(double)(finish-start)/CLOCKS_PER_SEC;//时间变量
if(num==0)//所有
{
cout<<" You win! Congratulations!!"<<endl;
cout<<" Your time is:"<<duration<<endl;
if(Dif==1)//读取简单扫雷的存储文件
{
string Name;
string name[6];
double Time,rang;
double times[6];
int i=0;
ifstream inf("扫雷简单.txt");
for(i=0;i<5;i++)//文件中信息导入到数组里
{
inf>>Name;inf>>rang>>Time;
name[i]=Name;
times[i]=Time;
}
inf.close();
name[5]=USer;//本轮玩家信息
times[5]=duration;
double t1=0;
string t2;
for(int j=0;j<5;j++)//冒泡排序法
{
for(i=0;i<5-j;i++)
{
if(times[i]>times[i+1])
{
t1=times[i];
times[i]=times[i+1];
times[i+1]=t1;
t2=name[i];
name[i]=name[i+1];
name[i+1]=t2;
}
}
}
ofstream outf("扫雷简单.txt");
for(i=0;i<5;i++)//将前五名玩家信息存储到文件中
{
cout<<name[i]<<""<<i+1<<""<<times[i]<<endl;
outf<<name[i]<<""<<i+1<<""<<times[i]<<endl;
}
outf.close();
}
if(Dif==2)//读取一般扫雷的存储文件
{
string Name;
string name[6];
double Time,rang;
double times[6];
int i=0;
ifstream inf("扫雷一般.txt");
for(i=0;i<5;i++)//文件中信息导入到数组里
{
inf>>Name;inf>>rang>>Time;
name[i]=Name;
times[i]=Time;
}
inf.close();
name[5]=USer;//本轮玩家信息
times[5]=duration;
double t1=0;
string t2;
for(int j=0;j<5;j++)//冒泡排序法
{
for(i=0;i<5-j;i++)
{
if(times[i]>times[i+1])
{
t1=times[i];
times[i]=times[i+1];
times[i+1]=t1;
t2=name[i];
name[i]=name[i+1];
name[i+1]=t2;
}
}
}
ofstream outf("扫雷一般.txt");
for(i=0;i<5;i++)//将前五名玩家信息存储到文件中并输出
{
cout<<name[i]<<""<<i+1<<""<<times[i]<<endl;
outf<<name[i]<<""<<i+1<<""<<times[i]<<endl;
}
outf.close();
}
if(Dif==3)//读取困难扫雷的存储文件
{
string Name;
string name[6];
double Time,rang;
double times[6];
int i=0;
ifstream inf("扫雷困难.txt");
for(i=0;i<5;i++)//文件中信息导入到数组里
{
inf>>Name;inf>>rang>>Time;
name[i]=Name;
times[i]=Time;
}
inf.close();
name[5]=USer;//本轮玩家信息
times[5]=duration;
double t1=0;
string t2;
for(int j=0;j<5;j++)//冒泡排序法
{
for(i=0;i<5-j;i++)
{
if(times[i]>times[i+1])
{
t1=times[i];
times[i]=times[i+1];
times[i+1]=t1;
t2=name[i];
name[i]=name[i+1];
name[i+1]=t2;
}
}
}
ofstream outf("扫雷困难.txt");
for(i=0;i<5;i++)//将前五名玩家信息存储到文件中
{
cout<<name[i]<<""<<i+1<<""<<times[i]<<endl;
outf<<name[i]<<""<<i+1<<""<<times[i]<<endl;
}
outf.close();
}
}
}
void scale(int dif,char*User)//选择难度
{
int row,column;
if(dif==1){row=3;column=3;}
if(dif==2){row=7;column=7;}
if(dif==3){row=10;column=10;}
cout<<"The scale is:"<<row<<"*"<<column<<endl;
thunder(dif,row,column,User);
};
int main()
{
int Continue=1;
int difficulty;
char user[10];
cout<<" Welcom to the game!"<<endl
<<"请输入用户名!"<<endl;
cin>>user;
while(Continue==1)
{
cout<<"=======================*******************======================="<<endl
<<"请选择难度!"<<endl
<<"简单——1"<<endl
<<"一般——2"<<endl
<<"困难——3"<<endl;
cin>>difficulty;
scale(difficulty,user);
cout<<"继续游戏——1结束游戏——0"<<endl;
cin>>Continue;
}
return 0;
}
扫雷小游戏,自己编的代码
小游戏的C++代码
/*===========================Program Description==========================*/
/*程序名称:game.c*/
/*程序目的:打砖块游戏演示*/
/*written by:董大钿*/
/*========================================================================*/
#include"graphics.h"
#include"stdio.h"
#include"conio.h"/*所需的头文件*/
int on;/*声明具有开关作用的全局变量*/
static int score;/*声明静态的记分器变量*/
/*定义开始界面函数*/
int open()
{
setviewport(100,100,500,380,1);/*设置图形窗口区域*/
setcolor(4);/*设置作图色*/
rectangle(0,0,399,279);/*以矩形填充所设的图形窗口区域*/
setfillstyle(SOLID_FILL,7);/*设置填充方式*/
floodfill(50,50,4);/*设置填充范围*/
setcolor(8);
settextstyle(0,0,9);/*文本字体设置*/
outtextxy(90,80,"BALL");/*输出文本内容*/
settextstyle(0,0,1);
outtextxy(110,180,"version 1.0");
outtextxy(110,190,"made by ddt");
setcolor(128);
settextstyle(0,0,1);
outtextxy(120,240,"Press any key to continue......");
}
/*定义退出界面函数*/
int quitwindow()
{
char s[100];/*声明用于存放字符串的数组*/
setviewport(100,150,540,420,1);
setcolor(YELLOW);
rectangle(0,0,439,279);
setfillstyle(SOLID_FILL,7);
floodfill(50,50,14);
setcolor(12);
settextstyle(0,0,8);
outtextxy(120,80,"End");
settextstyle(0,0,2);
outtextxy(120,200,"quit? Y/N");
sprintf(s,"Your score is:%d",score);/*格式化输出记分器的值*/
outtextxy(120,180,s);
on=1;/*初始化开关变量*/
}
/*主函数*/
main()
{
int gdriver,gmode;
gdriver=DETECT;/*设置图形适配器*/
gmode=VGA;/*设置图形模式*/
registerbgidriver(EGAVGA_driver);/*建立独立图形运行程序*/
initgraph(&gdriver,&gmode,"");/*图形系统初试化*/
setbkcolor(14);
open();/*调用开始界面函数*/
getch();/*暂停*/
while(1)/*此大循环体控制游戏的反复重新进行*/
{
int driver,mode,l=320,t=400,r,a,b,dl=5,n,x=200,y=400,r1=10,dx=-2,dy=-2;/*初始化小球相关参数*/
int left[100],top[100],right[100],bottom[100],i,j,k,off=1,m,num[100][100];/*方砖阵列相关参数*/
static int pp;
static int phrase;/*一系列起开关作用的变量*/
int oop=15;
pp=1;
score=0;
driver=DETECT;
mode=VGA;
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
setbkcolor(10);
cleardevice();/*图形状态下清屏*/
clearviewport();/*清除现行图形窗口内容*/
b=t+6;
r=l+60;
setcolor(1);
rectangle(0,0,639,479);
setcolor(4);
rectangle(l,t,r,b);
setfillstyle(SOLID_FILL,1);
floodfill(l+2,t+2,4);
for(i=0,k=0;i<=6;i++)/*此循环绘制方砖阵列*/
{
top[i]=k;
bottom[i]=top[i]+20;
k=k+21;
oop--;
for(j=0,m=0;j<=7;j++)
{
left[j]=m;
right[j]=left[j]+80;
m=m+81;
setcolor(4);
rectangle(left[j],top[i],right[j],bottom[i]);
setfillstyle(SOLID_FILL,j+oop);
floodfill(left[j]+1,top[i]+1,4);
num[i][j]=pp++;
}
}
while(1)/*此循环控制整个动画*/
{
while(!kbhit())
{
x=x+dx;/*小球运动的圆心变量控制*/
y=y+dy;
if(x+r1>r||x+r1<r)
{ phrase=0;}
if((x-r1<=r||x+r1<=r)&&x+r1>=l)
{
if(y<t)
phrase=1;
if(y+r1>=t&&phrase==1)
{dy=-dy;y=t-1-r1;}
}
if(off==0)
continue;
for(i=0;i<=6;i++)/*此循环用于判断、控制方砖阵列的撞击、擦除*/
for(j=0;j<=7;j++)
{
if((x+r1<=right[j]&&x+r1>=left[j])||(x-r1<=right[j]&&x-r1>=left[j]))
{
if(( y-r1>top[i]&&y-r1<=bottom[i])||(y+r1>=top[i]&&y+r1<=bottom[i]))
{
if(num[i][j]==0)
{continue;}
setcolor(10);
rectangle(left[j],top[i],right[j],bottom[i]);
setfillstyle(SOLID_FILL,10);
floodfill(left[j]+1,top[i]+1,10);
dy=-dy;
num[i][j]=0;
score=score+10;
printf("%d\b\b\b",score);
}
}
if((y+r1>=top[i]&&y+r1<=bottom[i])||(y-r1>=top[i]&&y-r1<=bottom[i]))
{
if((x+r1>=left[j]&&x+r1<right[j])||(x-r1<=right[j]&&x-r1>left[j]))
{
if(num[i][j]==0)
{ continue;}
setcolor(10);
rectangle(left[j],top[i],right[j],bottom[i]);
setfillstyle(SOLID_FILL,10);
floodfill(left[j]+1,top[i]+1,10);
dx=-dx;
num[i][j]=0;
score=score+10;
printf("%d\b\b\b",score);
}
}
}
if(x+r1>639)/*控制小球的弹射范围*/
{dx=-dx;x=638-r1;}
if(x<=r1)
{dx=-dx;x=r1+1;}
if(y+r1>=479)
{off=0;quitwindow();break;}
if(y<=r1)
{dy=-dy;y=r1+1;}
if(score==560)
{off=0;quitwindow();break;}
setcolor(6);
circle(x,y,r1);
setfillstyle(SOLID_FILL,14);
floodfill(x,y,6);
delay(1000);
setcolor(10);
circle(x,y,r1);
setfillstyle(SOLID_FILL,10);
floodfill(x,y,10);
}
a=getch();
setcolor(10);
rectangle(l,t,r,b);
setfillstyle(SOLID_FILL,10);
floodfill(l+2,t+2,10);
if(a==77&&l<=565)/*键盘控制设定*/
{dl=20;l=l+dl;}
if(a==75&&l>=15)
{dl=-20;l=l+dl;}
if(a=='y'&&on==1)
break;
if(a=='n'&&on==1)
break;
if(a==27)
{quitwindow();off=0;}
r=l+60;
setcolor(4);
rectangle(l,t,r,b);
setfillstyle(SOLID_FILL,1);
floodfill(l+5,t+5,4);
delay(100);
}
if(a=='y'&&on==1)/*是否退出游戏*/
{break;}
if(a=='n'&&on==1)
{ continue;}
}
closegraph();
}
用C++编写的小游戏源代码
五子棋的代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int N=15;//15*15的棋盘
const char ChessBoardflag='';//棋盘标志
const char flag1='o';//玩家1或电脑的棋子标志
const char flag2='X';//玩家2的棋子标志
typedef struct Coordinate//坐标类
{
int x;//代表行
int y;//代表列
}Coordinate;
class GoBang//五子棋类
{
public:
GoBang()//初始化
{
InitChessBoard();
}
void Play()//下棋
{
Coordinate Pos1;//玩家1或电脑
Coordinate Pos2;//玩家2
int n= 0;
while(1)
{
int mode= 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<<"y or n:";
char c='y';
cin>> c;
if(c=='n')
break;
}
}
protected:
int ChoiceMode()//选择模式
{
int i= 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)
return i;
cout<<"输入不合法"<< endl;
}
}
void InitChessBoard()//初始化棋盘
{
for(int i= 0; i< N+ 1;++i)
{
for(int j= 0; j< N+ 1;++j)
{
_ChessBoard[i][j]= ChessBoardflag;
}
}
}
void PrintChessBoard()//打印棋盘,这个函数可以自己调整
{
system("cls");//系统调用,清空屏幕
for(int i= 0; i< N+1;++i)
{
for(int j= 0; j< N+1;++j)
{
if(i== 0)//打印列数字
{
if(j!=0)
printf("%d", j);
else
printf("");
}
else if(j== 0)//打印行数字
printf("%2d", i);
else
{
if(i< N+1)
{
printf("%c|",_ChessBoard[i][j]);
}
}
}
cout<< endl;
cout<<"";
for(int m= 0; m< N; m++)
{
printf("--|");
}
cout<< endl;
}
}
void PlayChess(Coordinate& pos, int player, int flag)//玩家下棋
{
PrintChessBoard();//打印棋盘
while(1)
{
printf("玩家%d输入坐标:", player);
cin>> pos.x>> pos.y;
if(JudgeValue(pos)== 1)//坐标合法
break;
cout<<"坐标不合法,重新输入"<< endl;
}
_ChessBoard[pos.x][pos.y]= flag;
}
void ComputerChess(Coordinate& pos, char flag)//电脑下棋
{
PrintChessBoard();//打印棋盘
int x= 0;
int y= 0;
while(1)
{
x=(rand()% N)+ 1;//产生1~N的随机数
srand((unsigned int) time(NULL));
y=(rand()% N)+ 1;//产生1~N的随机数
srand((unsigned int) time(NULL));
if(_ChessBoard[x][y]== ChessBoardflag)//如果这个位置是空的,也就是没有棋子
break;
}
pos.x= x;
pos.y= y;
_ChessBoard[pos.x][pos.y]= flag;
}
int JudgeValue(const Coordinate& pos)//判断输入坐标是不是合法
{
if(pos.x> 0&& pos.x<= N&&pos.y> 0&& pos.y<= N)
{
if(_ChessBoard[pos.x][pos.y]== ChessBoardflag)
{
return 1;//合法
}
}
return 0;//非法
}
int JudgeVictory(Coordinate pos, char flag)//判断有没有人胜负(底层判断)
{
int begin= 0;
int end= 0;
int begin1= 0;
int end1= 0;
//判断行是否满足条件
(pos.y- 4)> 0? begin=(pos.y- 4): begin= 1;
(pos.y+ 4)>N? end= N: end=(pos.y+ 4);
for(int i= pos.x, j= begin; j+ 4<= end; j++)
{
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)
return 1;
}
//判断列是否满足条件
(pos.x- 4)> 0? begin=(pos.x- 4): begin= 1;
(pos.x+ 4)> N? end= N: end=(pos.x+ 4);
for(int j= pos.y, i= begin; i+ 4<= end; i++)
{
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)
return 1;
}
int len= 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(int i= 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)
return 1;
}
//判断副对角线是否满足条件
(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(int i= 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)
return 1;
}
for(int i= 1; i< N+ 1;++i)//棋盘有没有下满
{
for(int j=1; j< N+ 1;++j)
{
if(_ChessBoard[i][j]== ChessBoardflag)
return 0;//0表示棋盘没满
}
}
return-1;//和棋
}
bool GetVictory(Coordinate& pos, int player, int flag)//对JudgeVictory的一层封装,得到具体那个玩家获胜
{
int n= JudgeVictory(pos, flag);//判断有没有人获胜
if(n!= 0)//有人获胜,0表示没有人获胜
{
PrintChessBoard();
if(n== 1)//有玩家赢棋
{
if(player== 0)//0表示电脑获胜,1表示玩家1,2表示玩家2
printf("***电脑获胜***
");
else
printf("***恭喜玩家%d获胜***
", player);
}
else
printf("***双方和棋***
");
return true;//已经有人获胜
}
return false;//没有人获胜
}
private:
char _ChessBoard[N+1][N+1];
};
扩展资料:设计思路
1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。
2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。
3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。
关于c++一些好玩的代码的内容到此结束,希望对大家有所帮助。