c语言编写五子棋代码(用c语言编五子棋)
怎样用c语言编写五子棋的棋盘
????棋盘如果没有界面,那种有线和框的,就用0放在每个位置,当作一个位置,玩家1如果放下子的话,就将0变成1,玩家2放下棋子,0变成2
????复杂的界面,就去找MFC、QT吧
struct?stu??//定义位置记录结构体
{
????int?x;
????int?y;
}weizhi;
int?player=1;
int?Q[20][20]={0};?//定义数组以记录落子情况
?
void?drawqipan()?//绘制棋盘及数据初始化
{
????int?i,j;
????system("cls");?//清除屏幕
????for(i=0;i20;i++)
????{
????????for(j=0;j20;j++)
????????{
????????????Q[i][j]=0;
????????????printf("十");
????????}
????????printf("\n");
????}
????weizhi.x=0;weizhi.y=0;?//程序数据初始化
????gotoxy(0,0);
}
C语言编五子棋(二维数组),很简单
#include stdio.h
int a[16][16]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};
void banben()
{
printf(" ***************************************\n");
printf(" * 欢 迎 *\n");
printf(" * 五 子 棋 *\n");
printf(" * 版本号:V2.0 正式版*\n");
printf(" * 更新:1.新增系统只能判断结果!*\n");
printf(" * 2.全面支持中文人名 *\n");
printf(" * 3.采用国际标准棋盘15*15 *\n");
printf(" ***************************************\n\n\n");
}
void guize()
{
printf(" 五子棋规则 \n");
printf(" 五子棋比赛规则行棋顺序黑先、白后,从天元开始相\n");
printf(" 互顺序落子。判断胜负最先在棋盘横向、竖向、斜向\n");
printf(" 形成连续的相同色五个棋子的一方为胜。棋盘:15*15 \n");
printf(" 注意:输入姓名是一定是3个汉字!如果姓名为两个字\n");
printf(" 的话,请多打2个字符,以保证程序正常运行!谢谢!\n\n\n\n\n\n\n\n");
}
void printQP()
{
int x,y,k=1;
printf(" 1 2 3 4 5 6 7 8 9 101112131415\n");
for (x=1;x=15;x++)
{ if(k=9 )
printf(" ");
printf("%d",k);
for(y=1;y=15;y++)
{
if(a[x][y]==0)
printf("□");
if(a[x][y]==1)
printf("○");
if(a[x][y]==2)
printf("●");
}
printf("\n");
k++;
}
}
int pd(int x,int y,int cc)
{ int xt,yt,count;
//横向
count=0;
xt=x;yt=y-1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
yt--;
}
xt=x;yt=y+1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
yt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//纵向
count=0;
xt=x-1;yt=y;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
xt--;
}
xt=x+1;yt=y;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//主对角线
count=0;
xt=x-1;yt=y+1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
xt--;yt++;
}
xt=x+1;yt=y-1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
yt--;xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
//对角线
count=0;
xt=x-1;yt=y-1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
yt--;xt--;
}
xt=x+1;yt=y+1;
while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)
{
count++;
yt++;xt++;
}
count++;
if(count==5)
{
if(cc=1)
return 1;
if(cc=2)
return 2;
}
else
return 0;
}
int hefa(int x,int y)
{
if( x=1 y=1 x=15 y=15 a[x][y]==0)
return 1;
else
return 0;
}
int main()
{
int xt,yt,x,y,cc,count,l=0,g=0;
char e[7],f[7];
banben();
e[6]=1;
f[6]=1;
guize();
printf("请输入玩家一姓名(黑棋)支持中文:");
scanf("%s",e);
printf("请输入玩家二姓名(白棋)支持中文:");
scanf("%s",f);
printQP();
g=0;
while(g==0)
{
kaishi:
cc=1;
printf("%s下\n",e);
scanf("%d%d",x,y);
l=hefa(x,y);
if (l==1)
{
a[x][y]=1;
}
else
{printf("棋子错误!\n");
goto kaishi;
}
if (a[x][y]==1)
{
printQP();
}
g=0;
g=pd(x,y,cc);
if(g==1)
{printf("s赢!\n",e); break;}
if(g==2)
{printf("%s赢!\n",f); break;}
///////////////////////////////////////////////////////
kaishi2:
cc=2;
printf("%s下\n",f);
scanf("%d%d",x,y);
l=hefa(x,y);
if (l==1)
{
a[x][y]=2;
}
else
{
printf("棋子错误!\n");
goto kaishi2;
}
if (a[x][y]==2)
{
printQP();
}
g=0;
g=pd(x,y,cc);
if(g==1)
{printf("%s赢!\n",e); break;}
if(g==2)
{printf("%s赢!\n",f); break;}
}
getchar(); getchar();
return 0;
}
C语言五子棋算法
五子棋胜负的判定,一般有一下两种算法:
1.扫描整个棋盘,分别扫描四个方向是否有5个连子。网上找了很多五子棋源码都是用此算法,这意味着每下一个棋子都要扫描一遍19×19的棋盘,复杂而且低效,代码略。
2.每下一字,从该子开始扫描其四个方向(例如:从该子的(x-4,y)坐标开始扫描横向)是否存在5个连子。此算法较为常用,而且不涉及更为复杂的数据结构。
另外,为解决扫描越界的问题,在声明棋盘棋子位置时,可声明一个(4+19+4)×(4+19+4)的棋盘,而让棋子偏移(4,4)个坐标。
算法2源代码如下:
?123456789101112131415161718192021static void IfWin(int x,int y,int color){ TCHAR win[20]; int a,b; if(stone[x][y]==1) wcscpy_s(win,_T("黑棋胜利!")); else wcscpy_s(win,_T("白棋胜利!")); for(a=x-4;a=x+4;a++)//判断横 if(stone[a][y]==colorstone[a+1][y]==colorstone[a+2][y]==colorstone[a+3][y]==colorstone[a+4][y]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(b=y-4;b=y+4;b++)//判断竖 if(stone[x][b]==colorstone[x][b+1]==colorstone[x][b+2]==colorstone[x][b+3]==colorstone[x][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y-4;a=x+4;a++,b++)//判断右斜 if(stone[a][b]==colorstone[a+1][b+1]==colorstone[a+2][b+2]==colorstone[a+3][b+3]==colorstone[a+4][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y+4;a=x+4;a++,b--)//判断左斜 if(stone[a][b]==colorstone[a+1][b-1]==colorstone[a+2][b-2]==colorstone[a+3][b-3]==colorstone[a+4][b-4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;}}
C语言五子棋
我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围8个方向检查是否存在5子的情况,只需要一个判断方法,而且较为简单。
void chooseONE()
{
printf("第一玩家请选择下棋位置\n");
printf("第几个直的\n");
scanf("%d",co);
printf("第几个横的\n");
scanf("%d",ro);
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n");
printf("第几个直的\n");
scanf("%d",co);
printf("第几个横的\n");
scanf("%d",ro);
}
arr[ro][co]=1;
//这里加判断代码,建议用一个判断函数,我给你写个吧
}
//我这里这个方法写了个大概,你看一下和你的代码结合一下就可以了,我用i和j作为for循环的变量,你用来做最大的长宽值,这些你都要改一下。
flag作为判断是否胜利的标志,playerNum是玩家的标志,分1和2,这个函数只写了左和左上的判断,其他方向楼主仿照着写
int win(int row, int col, int playerNum){
int i = 0,j = 0;
int flag = 1;
if(row - 4 = 0){
flag = 1;
for(i = row; i = 0; i--){
if(arr[i][j] != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
if(row - 4 = 0 col - 4 = 0){
flag = 1;
for(i = row ,j = col ; i = 0j=0; i--,j--){
if(arr[i][j] != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
}
如何用c#窗体做五子棋小游戏,求开始的按钮到对应的代码能整个实现
用c#窗体做五子棋小游戏?:
首先是界面设计,控件一共有4个,1个PictureBox ;1个开始按钮,命名为btnStart;1个重置按钮,命名为btnReset;1个文本框Label,用于显示游戏状态;
2. 新建一个MainSize类用于存放界面上的可能用到的参数,主框体大小520*460,棋盘是一个PictureBox控件,大小401*401,棋盘20行20列,每个格子边长20,棋子直径16。
3. 新建一个ChessBoard类表示棋盘,有一个静态函数DrawBoard,函数代码如下:
class ChessBoard
{
static readonly Color color = Color.Black;
static readonly float penWid = 1.0f;
static readonly Pen pen = new Pen(color, penWid);
public static void DrawCB(Graphics gra,PictureBox pic)
{
//每排数量
int horC = MainSize.CBWid / MainSize.CBGap;
//间隔
int gap = MainSize.CBGap;
Image img = new Bitmap(MainSize.CBWid, MainSize.CBHei);
gra = Graphics.FromImage(img);
gra.Clear(Color.White);
gra.DrawRectangle(pen, 0, 0, MainSize.CBWid, MainSize.CBHei);
//画棋盘
for (int i = 0; i horC; i++)
{
gra.DrawLine(pen, 0, i * gap, MainSize.CBWid, i * gap);
gra.DrawLine(pen, i * gap, 0, i * gap, MainSize.CBHei);
}
gra.DrawLine(pen, 0, horC * gap, MainSize.CBWid, horC * gap - 1);
gra.DrawLine(pen, horC * gap - 1, 0, horC * gap, MainSize.CBHei);
pic.Image = img;
}
}
4.? 新建一个基本类Chess,用来表示棋子,有一个静态函数DrawChess,代码如下:
class Chess
{? public static void DrawChess(bool type,PictureBox pic,Graphics graphic,MouseEventArgs e)
//bool型变量用于表示下棋的双方
{
graphic = pic.CreateGraphics();
Pen pen1 = new Pen(Color.Red, 1);
Brush bru1 = new SolidBrush(Color.Red);
Pen pen2 = new Pen(Color.Blue, 1);
Brush bru2 = new SolidBrush(Color.Blue);
int newX = (int)((e.X + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
int newY = (int)((e.Y + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
//pen1和pen2用于绘制双方的棋子,颜色设置为红蓝
if (type)
{? graphic.DrawEllipse(pen1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);?}
if (!type)
{ graphic.DrawEllipse(pen2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);? }
//整型变量nexX和newY用于表示棋子在棋盘上的坐标,根据四舍五入就近原则落点???? graphic.Dispose();
}
}
5. 主程序,一共设置了4个全局变量,Graphics graphic用于画图,bool type用于表示下棋双方,bool start表示游戏是否开始,二维数组ChessBack用于模拟下棋场景并进行计算。?主程序的构造函数对主框体和PictureBox的大小进行初始化,在Form1_Load函数中添加函数InitializeThis()对游戏进行初始化,包括将ChessBack数组全部置0,type设为true,start设为false,绘制棋盘,按键开始的Enabled属性设为true,按键重置设为false。?按键开始和重置的功能较为简单,代码如下:
private void btnStart_Click(object sender, EventArgs e)
{
start = true;
label1.Text = "游戏开始!";
btnStart.Enabled = false;
btnReset.Enabled = true;
}
private void btnReset_Click(object sender, EventArgs e)
{?if (MessageBox.Show("确定要重新开始?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{???????????????????????????? InitializeThis();
}
}
6. picturebox的函数,先判断游戏是否开始,否则不会有反应。游戏开始后点击即可落子,并修改ChessBack矩阵,红色为1,蓝色为2,如果已经有棋子则返回,即落子失败。如果棋盘已满但没有分出胜负则弹出平局的提示框并给出提示。之后判断是否分出胜负,添加函数bool Victory(int bx,int by),分出胜负后提示胜利,如果没有则返回。最后换人,type=!type即可,然后修改label的文字表面到哪一方落子了。代码如下。
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (start)
{
//在计算矩阵中的位置
int bX = (int)((e.X + MainSize.CBGap / 2) / MainSize.CBGap);
int bY = (int)((e.Y + MainSize.CBGap / 2) / MainSize.CBGap);
//防止在同一个位置落子
if (ChessBack[bX, bY] != 0)
return;
Chess.DrawChess(type, pictureBox1, graphic, e);
ChessBack[bX,bY] = type?1:2;
//判断棋盘是否满了
if (IsFull() !Victory(bX,bY))
{
if (MessageBox.Show("游戏结束,平局") == DialogResult.OK)
InitializeThis();
return;
}
//判断胜利
if (Victory(bX,bY))
{
string Vic = type ? "红" : "蓝";
if (MessageBox.Show(Vic + "方胜利!") == DialogResult.OK)
InitializeThis();
return;
}
//换人
type = !type;
label1.Text = type ? "红方's trun!" : "蓝方's turn!";
}
else
return;
}
7.? 判断胜负的函数,先写了一个横向的进行测试,如果横向两端的值与当前值相同则变量count++,最后返回count的值,如果4则表示胜利。但是这个函数运行出错,显示为stackoverflow,但我不知道错误在哪,只好换一种判断方法。后来才想明白两端的值都是0则会溢出,应该判断两端的值是否为1或2而不是当前值。此处借鉴了实验楼网站上的C语言版五子棋的判断胜负方式,从当前落子的矩阵中,横竖斜4个方向任意一个方向有连续5个数的值与当前的值相同则胜利,实现也不复杂,细分为三个函数实现。代码如下:
#region 判断胜利
private bool Victory(int bx,int by)
{
if (HorVic(bx, by))
return true;
if (VerVic(bx, by))
return true;
if (Vic45(bx, by))
return true;
else
return false;
}
private bool Vic45(int bx, int by)
? ? ? ?{
? ? ? ? ? ?int b1 = (bx - 4) 0 ? bx - 4 : 0;
int b2 = (by - 4) 0 ? by - 4 : 0;
//int buttom = b1 b2 ? b2 : b1;
int val = ChessBack[bx, by];
for (int i = b1,j=b2; i 16j16; i++,j++)
{
if (ChessBack[i, j] == val ChessBack[i + 1, j + 1] == val
ChessBack[i + 2, j + 2] == val ChessBack[i + 3, j + 3] == val
ChessBack[i + 4, j + 4] == val)
return true;
}
for (int i = b1, j = b2; i 16 j 16; i++, j++)
{
if (ChessBack[i, j] == val ChessBack[i + 1, j - 1] == val
ChessBack[i + 2, j - 2] == val ChessBack[i + 3, j - 3] == val
ChessBack[i - 4, j - 4] == val)
return true;
}
return false;
}
private bool VerVic(int bx, int by)
{
int buttom = (by - 4) 0 ? by - 4 : 0;
int val = ChessBack[bx, by];
for (int i = buttom; i 16; i++)
{
if (ChessBack[bx, i] == val ChessBack[bx, i+1] == val
ChessBack[bx, i+2] == val ChessBack[bx ,i+3] == val
ChessBack[bx, i+4] == val)
return true;
}
return false;
}
private bool HorVic(int bx, int by)
{
int left = (bx-4)0?bx-4:0;
int val = ChessBack[bx,by];
for (int i = left; i 16; i++)
{
if (ChessBack[i, by] == val ChessBack[i + 1, by] == val
ChessBack[i + 2, by] == val ChessBack[i + 3, by] == val
ChessBack[i + 4, by] == val)
return true;
}
return false;
}
#endregion
8 .经过测试,没有问题大功告成
楼主要及时采纳加分哦