部分效果图:

  1. 总体设计

这里我将叙述一个大概的设计过程。

玩家一使用的棋子是’*’ 玩家二以及电脑使用的棋子是’#’。这两个字符只是方便做相关操作。

实际显示时,我将玩家一显示为白棋子,玩家二显示为黑棋子。而不是直接把’*’和’#’显示给用户。

棋盘用的是二维数组。

一盘游戏几乎所有操作都是在这个二维数组上面实现。主要功能有:游戏背景音乐,实时棋盘的更新,棋子的移动,判断胜负,胜负播报音乐,电脑实现智能化落子。

本程序分为两大部分,一部分是人机对战,另一部分是人人对战。人人对战就不说了。人机对战让电脑实现了一定的智能化,主要算法是Ai()函数。

以下是各个功能函数的简要概述。

int isWin();//判定胜负

void Ai6();//电脑随机放子

void Ai5();//阻止玩家冲三

void Ai4();//电脑实现冲四

void Ai3();//阻止玩家冲四

void Ai2();//让电脑实现冲五

void Ai1();//阻止玩家冲五

void load();//初始界面

void printS();//打印棋盘

void newgame();//游戏主体

void gamer();//双人对战

void movedown(int *x,int *y,int ret);//向上

void moveup(int *x,int *y,int ret);//向下

void moveright(int *x,int *y,int ret);//向右

void moveleft(int *x,int *y,int ret);//向左

void move();//人机模式移动

void move1();//双人对战 玩家一

void move2(); //双人对战 玩家二

void end(int flag);//结束界面

2. 算法设计

主要算法函数:电脑智能下棋。

使用了函数嵌套,

优先级:

Ai1()        ->Ai2()         ->Ai3()        ->Ai4()        ->Ai5()        ->Ai6()

阻止玩家冲五->让电脑实现冲五->阻止玩家冲四->电脑实现冲四->阻止玩家冲三->随机放子

函数说明:

阻止玩家冲五:通过遍历棋盘(用两个for循环),得到玩家的棋子位置,判断它的棋子里面是否有连四的情况出现,如果有就进行防守。其它防守函数同理。电脑实现冲五则是通过遍历棋盘上自己的棋子,如果有连四的情况,那么就补上最后一个棋子完成胜局。其它进攻函数同理。

怎样实现优先级?通过函数嵌套,把Ai1()(阻止玩家冲五)作为第一个返回函数,如果能找到相应的位置(成功防守)那么就返回该位置,否则继续进行下一个判断也就是Ai2()(让自己实现冲五),以此类推。

void Ai6();//电脑随机放子

void Ai5();//阻止玩家冲三

void Ai4();//电脑实现冲四

void Ai3();//阻止玩家冲四

void Ai2();//让电脑实现冲五

void Ai1();//阻止玩家冲五

void Ai1()//阻止玩家冲五

以下是Ai1()的示例:

void Ai1(){int i,j;/*遍历棋盘,找出玩家的棋子是否有连四的情况,四种连四情况都得查找,即横/纵/左上斜/右下斜*/for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向{if(game[i][j-1]=='.'){game[i][j-1]='#';return; //如果找到该位置那么把棋子放好之后直接return}if(game[i][j+4]=='.'){game[i][j+4]='#';return;}}if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向{if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+4][j]=='.'){game[i+4][j]='#';return;}}if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1{if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+4][j+4]=='.'){game[i+4][j+4]='#';return;}}if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2{if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-4][j+4]=='.'){game[i-4][j+4]='#';return;}}}Ai2();//如果没找到那么进入下一个函数return;}

个人总结

首先对我的编程思维的提升是巨大的,在此之前我从未尝试过去敲一个几百行的代码,甚至在写这个程序的前期(未修改完善之前)一度达到了上千行。写这种工程量稍大的程序项目,令我不敢太马虎应对,因为如果出现bug,那修复Bug 的工作量也是比较恐怖的。所以我在写的时候打了不少的草稿。一开始这个程序的下棋方式是输入坐标进行棋子的定位。但是自己试玩的时候发现这样的方式极不方便,密密麻麻的棋盘线条看着眼睛也很不舒服,下棋的时候很容易出现落下的棋子位置跟自己的意愿不一样的情况。用户体验感极差。于是我就想能不能改成用方向键去移动棋子。这样移动比较直观,也不会出现下错位置的尴尬情况。但是通过方向键去移动棋子,画面就应该实时刷新。不然移动的跨度大了,用户界面上会出现很多个棋盘。所以我又去网上搜索刷新界面的方法。又查到了一个清屏的命令。“system(“cls”)”.这样,我就能够实现棋子的移动并且实时更新画面了。我写完这个程序之后又去学习了一点图形编程,安装了相关的软件。并且又写出了一个小小的图形游戏。总的来说,就是这种自主查阅能力提升了,编程思维也提升了。深刻体会到程序中把若干功能分成各个功能函数的重要性。既美观,排查bug也方便。

不足之处:应该把这个棋盘写成图形界面的,这样会更好看。

以下是完整代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
int FLAG=1;
char game[21][21];//棋盘矩阵
int isWin();//判定胜负
void Ai6();
void Ai5();//电脑随机放子
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void load();//初始界面
void printS();//打印棋盘
void newgame();//游戏主体
void gamer();//双人对战
void movedown(int *x,int *y,int ret);//向上
void moveup(int *x,int *y,int ret);//向下
void moveright(int *x,int *y,int ret);//向右
void moveleft(int *x,int *y,int ret);//向左
void move();//人机模式移动
void move1();//双人对战 玩家一
void move2(); //双人对战 玩家二
void end(int flag);//结束界面
int main()
{while(FLAG){load();//游戏入口}                 return 0;
}void movedown(int *x,int *y,int ret){/*这里将棋盘返回之前状态*/ if(game[*x][*y]!='*'&&game[*x][*y]!='#')game[*x][*y]='.';  *x+=1;if(*x>=19||*x<=0)return;if(game[*x][*y]!='.'){*x+=1;return;}     system("cls");if(game[*x][*y]!='*'&&game[*x][*y]!='#'){if(ret==1)game[*x][*y]='O';if(ret==2)game[*x][*y]='Q';}    printS();printf("你的位置:【%d】 【%d】\n",*x,*y);return;}
void moveup(int *x,int *y,int ret){/*这里将棋盘返回之前状态*/ if(game[*x][*y]!='*'&&game[*x][*y]!='#')game[*x][*y]='.';   *x-=1;if(*x>=19||*x<=0)return;if(game[*x][*y]!='.'){ *x-=1;return;}        system("cls");if(game[*x][*y]!='*'&&game[*x][*y]!='#'){if(ret==1)game[*x][*y]='O';if(ret==2)game[*x][*y]='Q';}printS();printf("你的位置:【%d】 【%d】\n",*x,*y);return;}
void moveright(int *x,int *y,int ret){/*这里将棋盘返回之前状态*/ if(game[*x][*y]!='*'&&game[*x][*y]!='#')game[*x][*y]='.';     *y+=1;if(*x>=19||*x<=0)return;if(game[*x][*y]!='.'){*y+=1;return;}      system("cls");if(game[*x][*y]!='*'&&game[*x][*y]!='#'){if(ret==1)game[*x][*y]='O';if(ret==2)game[*x][*y]='Q';}printS();printf("你的位置:【%d】 【%d】\n",*x,*y);return;}
void moveleft(int *x,int *y,int ret){/*这里将棋盘返回之前状态*/ if(game[*x][*y]!='*'&&game[*x][*y]!='#')game[*x][*y]='.';    *y-=1;if(*x>=19||*x<=0)return;if(game[*x][*y]!='.'){*y-=1;return;}      system("cls");if(game[*x][*y]!='*'&&game[*x][*y]!='#'){if(ret==1)game[*x][*y]='O';if(ret==2)game[*x][*y]='Q';}printS();printf("你的位置:【%d】 【%d】\n",*x,*y);return;} void move(){int x=1,y=1;char ret;int shift=1;while(shift){      ret=getch();switch(ret){case 72: moveup(&x,&y,1);break;  case 80: movedown(&x,&y,1);break; case 75: moveleft(&x,&y,1);break;case 77: moveright(&x,&y,1);break; case 's':movedown(&x,&y,1);break;             case 'S':movedown(&x,&y,1);break;                             case 'W':moveup(&x,&y,1);break;                               case 'w':moveup(&x,&y,1);break;                                   case 'a':moveleft(&x,&y,1);break;                             case 'A':moveleft(&x,&y,1);break;                         case 'd':moveright(&x,&y,1);break;                                    case 'D':moveright(&x,&y,1);break;                                    case ' ':             game[x][y]='*';system("cls");printS();shift=0;                                    break;  }           }return;}
void move1()
{int x=1,y=1;char ret;int shift=1;while(shift){      ret=getch();switch(ret){case 's':movedown(&x,&y,1);break;                case 'S':movedown(&x,&y,1);break;                             case 'W':moveup(&x,&y,1);break;                               case 'w':moveup(&x,&y,1);break;                                   case 'a':moveleft(&x,&y,1);break;                             case 'A':moveleft(&x,&y,1);break;                         case 'd':moveright(&x,&y,1);break;                                    case 'D':moveright(&x,&y,1);break;    case ' ':             game[x][y]='*';system("cls");printS();shift=0;                                    break;  }           }return;
}
void move2()
{int x=1,y=1;char ret;int shift=1;while(shift){      ret=getch();switch(ret){case 72: moveup(&x,&y,2);break;  case 80: movedown(&x,&y,2);break; case 75: moveleft(&x,&y,2);break;case 77: moveright(&x,&y,2);break; case ' ':             game[x][y]='#';system("cls");printS();shift=0;                                    break;  }           }return;
}
int isWin()//判定胜负
{int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){        if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='*')return 1;//横向赢               if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='*') return 1;//纵向赢      if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='*') return 1; //从左上到右下      if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='*') return 1;//从右上到左下/*相同的条件,判定电脑胜利*/if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='#')return 2;//横向                if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='#') return 2;//纵向 if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='#')return 2;//斜向1 if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='#') return 2;//斜向2 }    for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='.')return -1;//比赛继续 }return 0;//平局即是棋盘上没有.了
}
void Ai6()//电脑随机放子
{   int i,j;srand(time(NULL)*10);for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='#'){if(game[i+1][j]=='.'){game[i+1][j]='#';return;}if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i][j+1]=='.'){game[i][j+1]='#';return;}if(game[i][j-1]=='.'){game[i][j-1]='#';return;}}}while(game[i][j]!='.'){i=rand()%19+1;j=rand()%19+1;} game[i][j]='#';return;
}
void Ai5()//阻止玩家冲三
{int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='*'&&game[i][j+1]=='*')//横向 {if(game[i][j-1]=='.'){game[i][j-1]='#';return;  }           if(game[i][j+2]=='.'){game[i][j+2]='#';return; }           }if(game[i][j]=='*'&&game[i+1][j]=='*') //纵向 {if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+2][j]=='.'){game[i+2][j]='#';return;}}if(game[i][j]=='*'&&game[i+1][j+1]=='*')//斜向1 {if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+2][j+2]=='.'){game[i+2][j+2]='#';return;}} if(game[i][j]=='*'&&game[i-1][j+1]=='*')  //斜向2 {if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-2][j+2]=='.'){game[i-2][j+2]='#';return;}}} Ai6();return;
}
void Ai4()//电脑实现冲四
{   int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#')//横向 {if(game[i][j-1]=='.'){game[i][j-1]='#';return;   }           if(game[i][j+3]=='.'){game[i][j+3]='#';return; }           }if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='#') //纵向 {if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+3][j]=='.'){game[i+3][j]='#';return;}}if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='#') //斜向1 {if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+3][j+3]=='.'){game[i+3][j+3]='#';return;}} if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='#')  //斜向2 {if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-3][j+3]=='.'){game[i-3][j+3]='#';return;}}} Ai5();return;
}
void Ai3()//阻止玩家冲四
{   int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*')//横向 {if(game[i][j-1]=='.'){game[i][j-1]='#';return;   }           if(game[i][j+3]=='.'){game[i][j+3]='#';return; }           }if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='*') //纵向 {if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+3][j]=='.'){game[i+3][j]='#';return;}}if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='*')//斜向1 {if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+3][j+3]=='.'){game[i+3][j+3]='#';return;}} if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='*')  //斜向2 {if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-3][j+3]=='.'){game[i-3][j+3]='#';return;}}} Ai4();return;
}
void Ai2()//让电脑实现冲五
{int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){ if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#'&&game[i][j+3]=='#')//横向 {if(game[i][j-1]=='.'){game[i][j-1]='#';return; }           if(game[i][j+4]=='.'){game[i][j+4]='#';return; }           }if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='#') //纵向 {if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+4][j]=='.'){game[i+4][j]='#';return;}}if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='#') //斜向1 {if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+4][j+4]=='.'){game[i+4][j+4]='#';return;}} if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='#')  //斜向2 {if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-4][j+4]=='.'){game[i-4][j+4]='#';return;}}}Ai3();return;
}
void Ai1()//阻止玩家冲五
{   int i,j;for(i=1;i<20;i++)for(j=1;j<20;j++){if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向 {if(game[i][j-1]=='.'){game[i][j-1]='#';return;   }           if(game[i][j+4]=='.'){game[i][j+4]='#';return; }           }if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向 {if(game[i-1][j]=='.'){game[i-1][j]='#';return;}if(game[i+4][j]=='.'){game[i+4][j]='#';return;}}if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1 {if(game[i-1][j-1]=='.'){game[i-1][j-1]='#';return;}if(game[i+4][j+4]=='.'){game[i+4][j+4]='#';return;}} if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2 {if(game[i+1][j-1]=='.'){game[i+1][j-1]='#';return;}if(game[i-4][j+4]=='.'){game[i-4][j+4]='#';return;}}}Ai2();return;
}
void load()//初始界面
{   int i,j;char ret;for(i=0;i<17;i++){    for(j=0;j<34;j++){if(i!=8)printf("**");else {printf("\n                    <<<欢迎进入五子棋游戏>>>\n"); printf("                    <<<输入【1】开始人机游戏>>>\n");    printf("                    <<<输入【2】开始双人对战模式>>>\n                    <<<输入【ESC】退出游戏>>>\n");printf("                    <<<祝你玩得开心>>>\n");system("color 70");break;       }               }printf("\n"); } ret=getch();puts("\a");switch(ret){case '1':system("cls");newgame(); break;case '2':system("cls");gamer(); break;case 27:FLAG=0;return;break;}   return;
}
void printS()//打印棋盘
{int i,j;for(i=0;i<21;i++)for(j=0;j<21;j++){if(i==0&&j==0)printf(" 0");   if((i==0&&j!=0&&j!=20)||(i==20&&j!=0&&j!=20))printf(" %2d",j);if(j==0&&i!=0)printf("%2d",i);if(i!=0&&j!=0){if(game[i][j]=='.'||game[i][j]=='O'||game[i][j]=='Q')   printf("_%c|",game[i][j]);    else{       if(game[i][j]=='*')printf("_Ο");else if(game[i][j]=='#')printf("_●");}  }if(j==19&&i!=20&&i!=0)printf("_%2d",i);if(j==20)printf("\n");    }}
void newgame()//游戏主体
{           PlaySound(TEXT("song.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 int i,j,x=1,y=1,flag,cnt=0;char tip,ret;srand(time(NULL));      for(i=0;i<20;i++)for(j=0;j<20;j++)game[i][j]='.';printf("开始游戏之前,请选择你想先手还是想后手\n输入【1】你先手,输入【2】你后手,【ESC】返回");  tip=getch();puts("\a");   if(tip==27){load(); return;}             if(tip=='1')//玩家先手 {while(1){system("cls");printS();printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");move();          flag=isWin();  if(flag==1||flag==0||flag==2)end(flag);           else Ai1();//还未分出胜负 电脑落子:智能化system("cls");printS();flag=isWin(); //判定胜负,否则一直循环下棋if(flag==1||flag==0||flag==2){end(flag);   break;}             }   }else if(tip=='2')//玩家后手 {while(1){         Ai1();system("cls");system("cls");printS();                         flag=isWin();if(flag==1||flag==0||flag==2)end(flag);printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");move();flag=isWin();if(flag==1||flag==0||flag==2){end(flag); break;}}        }
}
void gamer()
{PlaySound(TEXT("song2.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 int i,j,x=1,y=1,flag,cnt=0;char tip,ret;         for(i=0;i<20;i++)for(j=0;j<20;j++)game[i][j]='.';printf("始游戏之前,请选择:\n输入【1】玩家一先手\n输入【2】玩家二先手\n【ESC】返回");tip=getch();puts("\a");   if(tip==27){load();return;}                               if(tip=='1')//玩家一先手 {while(1){system("cls");printS();printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");         move1();           flag=isWin();  if(flag==1||flag==0||flag==2)end(flag);               else {printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");move2(); }system("cls");printS();flag=isWin(); //判定胜负,否则一直循环下棋if(flag==1||flag==0||flag==2){end(flag);break;;}                   }   }else if(tip=='2')//玩家二先手 {while(1){            printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");move2();system("cls");printS();                           flag=isWin();if(flag==1||flag==0||flag==2)end(flag);printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");move1();flag=isWin();if(flag==1||flag==0||flag==2){end(flag);    break;}}        }       return;
}
void end(int flag)
{   switch(flag){case 1:    system("cls");        printf("************WINNER**************\n"); printf("************你赢啦*************\n");printf("*************666*****************\n"); PlaySound(TEXT("win.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 system("pause");load();break;case 2:system("cls");     printf("************LOSER**************\n");  printf("************你输啦*************\n");printf("*************菜鸡*****************\n"); PlaySound(TEXT("lose.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 system("pause");load();break;    case 0:system("cls");printf("************PEACE**************\n");   printf("************平局*************\n");printf("******************************\n");PlaySound(TEXT("peace.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 system("pause");load();break;   }
}

c语言写一个五子棋小游戏相关推荐

  1. ChatGPT实现用C语言写一个扫雷小游戏

    前几天我们利用 ChatGPT实现用C语言写一个学生成绩管理系统 其过程用时不到30秒,速度惊人 今天又让ChatGPT用C语言写了一个扫雷小游戏,它的回答是:抱歉,我是AI语言模型,无法编写程序. ...

  2. 使用C语言写一个扫雷小游戏

    前言 相信扫雷游戏小伙伴们肯定都玩过吧,学习了C语言中的数组.函数等基础内容之后就可以自己写一个简易的扫雷小游戏了,今天就我写扫雷小游戏的过程及思路写一篇博客,希望大家看完我的博客能有所收获. 软件及 ...

  3. C语言制作一个五子棋小游戏【附代码】

    目录 五子棋游戏设计与实现 1.1 系统开发思路(需求分析) 1.2 系统功能设计 1.3 系统详细设计 1.3.1数据结构设计 1.4 系统实现 1.5 系统测试 五子棋游戏设计与实现 1.1 系统 ...

  4. 用Java写一个五子棋小游戏

    棋盘是15*15(可以自己规定) 游戏规则: (1)对局双方各执一色棋子. (2)空棋盘开局. (3)黑先.白后,交替下子,每次只能下一子. (4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动 ...

  5. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  6. 用C语言做一个迷宫小游戏

    用C语言做一个迷宫小游戏,以下是代码段 这个迷宫游戏使用了递归回溯算法来寻找通往出口的路径.迷宫中的墙用'#'表示,路径用空格表示,入口和出口分别用'S'和'E'表示,已走过的路径用'*'表示.在生成 ...

  7. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

  8. 教你前端如何用js写一个跑酷小游戏

    在线体验地址:http://summer.pkec.net/ 源码地址:https://gitee.com/ihope_top/juejin-summer 前言 不知不觉夏天又到了,提到夏天你们能想到 ...

  9. ES6 手写一个“辨色”小游戏

    1. 前言 依稀记得几年前朋友圈流行的辨色小游戏,找出颜色不同的矩形.前些天突发奇想,打算自己手写一个类似的游戏,话不多说,先上 Demo . --项目源码 本实例基于 ES6 实现,并兼容 ie9及 ...

  10. 用C语言来实现五子棋小游戏

    目录 一.五子棋的准备工作 二.五子棋的具体实现 1.棋盘 2.人机对战 2.1 玩家下棋 2.2 电脑下棋 2.3 判断输赢 三.总结 一.五子棋的准备工作 我们在写一个项目的时候,首先第一步就是应 ...

最新文章

  1. JavaScript 输出
  2. QoS技术之流量监管和流量整形
  3. Nginx服务器编译添加SSL模块
  4. python配置opencv镜像安装
  5. CODEVS-2050 派对灯
  6. 【Elasticsearch】中文分词器比对表
  7. 怎么删除安卓手机里没用的文件夹,如何知道哪个有用哪些没用?
  8. opencv 中从cv::line和resize()函数
  9. antd-pro1.0使用jest对react组件进行单元测试
  10. Flink CDC + Hudi + Hive + Presto 构建实时数据湖最佳实践
  11. MSDN Visual系列:用WSSv3中的SPGridView控件来显示数据
  12. 怎么调用pda的打印机_win7系统如何更改打印机缓存文件夹 win7系统更改打印机缓存文件夹方法【介绍】...
  13. Elasticsearch7.13+kibana7.13安装
  14. 我们终究是一群平凡的人
  15. android 框架搭建养成的良好习惯(一)
  16. 零基础入门编程神器!苹果的免费编程应用出了Mac版了
  17. java ftp 被动模式_ftp 主动模式与被动模式
  18. 中国铁通集团有限公司
  19. Visual Studio 2022 免费版最新版本下载安装教程
  20. 量子力学揭示时间为何向前

热门文章

  1. ueditor 动态设置多语言
  2. sql server 2000(迷你sql2000) jdbc驱动
  3. windows10安装adb/fastboot教程
  4. gitlab 邮件服务器配置
  5. 死亡之ping(Ping of Death)
  6. 基于SSM的小区物业管理系统(附源码+论文)
  7. Extjs EditorGridPanel功能
  8. 硬盘分区整数计算器(如何让硬盘容量成整数)
  9. 天堂2芙蕾雅单机版mysql闪退_【图片】天堂2单机版-芙蕾雅。算是我这个老人对天堂2吧友的最后贡献吧!_天堂2吧_百度贴吧...
  10. 特洛伊木马程序_历史著名的特洛伊木马计,希腊的人造礼物