c语言编写五子棋代码(用c语言编五子棋)

http://www.itjxue.com  2023-03-18 03:09  来源:未知  点击次数: 

怎样用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 .经过测试,没有问题大功告成

楼主要及时采纳加分哦

(责任编辑:IT教学网)

更多
上一篇:没有了

推荐软件水平考试文章