五子棋游戏c语言程序设计,c语言制作五子棋游戏,C语言实现简易五子棋小游戏

五子棋游戏c语言程序设计,c语言制作五子棋游戏,C语言实现简易五子棋小游戏

本文主要详细介绍了用C语言实现简单的五子棋游戏。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

本文分享简单五子棋游戏的C语言具体代码,供大家参考。具体内容如下

效果图如下:

设计思路:

棋盘设计为1515的正方形,初始光标在棋盘的中心。白棋先行,依次走棋。当一方连五或满棋盘时,游戏结束(连五者胜,满棋盘为平局)。当游戏一方获胜时,显示胜利信息,用汉字点阵输出提示信息。

程序是二维平面,可以用二维数组来实现。数组的两个下标可以表示棋盘上的位置,数组元素的值表示棋盘上的状态。有三种情况,即0代表空格,1代表白棋,2代表黑棋。程序的主要工作是接收玩家的按键操作。玩家1通过设置四个键来控制光标移动,回车键表示移动。棋手2用其他四个键控制光标移动,空格键表示移动。当你收到回车键或空格键,这意味着棋手移动。先判断是否是有效位置,即棋子的位置不能互相重叠。棋子一旦掉落成功,立即判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子,并连接成五个棋子。如果它们连接成五个棋子,游戏就结束了。

# includestdio.h

#includestdlib.h

#includewindows.h

#pragma注释(lib,' WINMM。LIB’)

#包含mmsystem.h

#includeconio.h

#includetime.h

#定义宽度32 //棋盘的总宽度

#定义高31 //棋盘的总高度

#定义MAX_X 15 //棋盘上水平方格的数量

#定义MAX_Y 15 //棋盘上垂直方格的个数

#define WIDTH (16 width) //游戏总高度

#define HIGH (high 4) //游戏总高度

#定义玩家1 1 //白子玩家

#定义播放器2 2 //黑子播放器

#define emptyPlayer 0//没有子级

#定义Unplayer -2 //中途退出游戏,没有玩家获胜。

typedef结构堆栈{

//记录下每次移动的坐标。

int X[MAX _ X * MAX _ Y];

int Y[MAX _ X * MAX _ Y];

//相当于栈顶指针

int top

}栈;

int pos[MAX _ X][MAX _ Y];//存储棋盘上每个位置的状态,比如白子是1,黑子是2,无子女是0。

int px,py;//光标位置

int player=1;//从白边记录当前玩家的默认玩家。

int flag 1=0;//标记游戏的开始

int game over _ player=-1;//判断结束的标志

int pre_px=-1,pre _ py=-1;//记录最后一个坐标位置

void gotoxy(int x,int y);//设置CMD窗口的光标位置

void hide_cursor()。//隐藏CMD窗口光标

void map();//打印地图

void game_Description()。//打印动态游戏描述

void initMapState();//初始化游戏位置数据

void mapState(int qizi);//数组记录对应位置的状态。

int is goplay();//确定自己是否可以继续前进。

int hasGoPlay(int播放器);//以棋盘掉落的地方为中心,判断棋盘掉落后的棋盘是否与五个棋盘相连。

void goPlay(int Player,Stack * p);//玩家1 2 0

void yidongwuan();//移动盒子

void player 1 _ move();//玩家1_ Move

void player 2 _ move();//玩家2_ Move

int game over();//判断游戏是否结束

stack * create stack();//创建一个空堆栈

void push(Stack* p,int x,int y);//堆栈

void color(const无符号短text color);//自定义字母根据参数改变颜色。

//void setColor(无符号short back color);//设置游戏背景颜色

Voigotoxy (int x,int y)//设置CMD窗口的光标位置

{

COORD coord

坐标。X=x

坐标。Y=y

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),coord);

}

voi Hide _ cursor()//隐藏CMD窗口光标

{

控制台_光标_信息CCI;

cci.bVisible=FALSE

CCI . dw size=sizeof(CCI);

HANDLE HANDLE=GetStdHandle(STD _ OUTPUT _ HANDLE);

SetConsoleCursorInfo(handle,CCI);

}

void color(const unsigned short text color)//自定义函数根据参数改变颜色。

{

If(textColor0 textColor=15) //颜色,参数范围为0-15

SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),文本颜色);//用一个参数,改变字体颜色

else //默认的字体颜色是白色

SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),7);

}

//打印地图

空贴图()

{

int x,y;

颜色(02);

/*开始打印棋盘格子*/

//打印横向图格

for(y=2;y高-1;y=2){

for(x=1;x宽度-2;x=2){

gotoxy(x,y);

printf('-');

}

}

//打印竖向图格

for(y=1;y高;y=2) {

for(x=2;x宽度-2;x=2){

gotoxy(x,y);

printf(' | ');

}

}

/*打印棋盘格子结束*/

/*开始打印图框*/

//打印棋盘图框

for(y=0;y高;y)

{

for(x=0;x宽度;x=2)

{

if (x==0 || x==width - 2){

gotoxy(x,y);

printf(' | ');

}

if(y==0 || y==高- 1 ){

gotoxy(x,y);

printf('-');

}

}

}

//打印右图框

for(y=0;y高;y ){

对于(x=)宽度;x宽度;x=2){

if (x==WIDTH - 2){

gotoxy(x,y);

printf(' | ');

}

if(y==0 || y==高- 1 ){

gotoxy(x,y);

printf('-');

}

}

}

//打印下图框你-高~高-1 x-0 ~宽-2

for(y=高;y高;y ){

for(x=0;x宽度;x=2){

if (x==0 || x==WIDTH - 2){

gotoxy(x,y);

printf(' | ');

}

if(y==高|| y==高- 1 ){

gotoxy(x,y);

printf('-');

}

}

}

//打印下图框内容

gotoxy( 1,高1);

printf('欢迎来到五子棋游戏!');

//打印右图框内容

gotoxy(宽度-1,1);

printf('游戏说明:');

gotoxy(宽度-1,3);

printf('1)X表示玩家一棋');

gotoxy(宽度-1,4);

printf('子,而O表示玩家');

gotoxy(宽度-1,5);

printf('二棋子');

gotoxy(宽度-1,7);

printf('2)X先、O后,交替');

gotoxy(宽度-1,8);

printf('下子,每次只能下');

gotoxy(宽度-1,9);

printf('一子');

gotoxy(宽度-1,11);

printf('3)棋子下在棋盘');

gotoxy(宽度-1,12);

printf('的格子内,棋子下');

gotoxy(宽度-1,13);

printf('定后,不得向其它');

gotoxy(宽度-1,14);

printf('点移动');

gotoxy(宽度-1,16);

printf('4)最先连成五子');

gotoxy(宽度-1,17);

printf('的一方即为获胜');

gotoxy(宽度-1,19);

printf('玩家一移动键:');

gotoxy(宽度-1,20);

printf('w上s下a左d右');

gotoxy(宽度-1,21);

printf('下子:空格键');

gotoxy(宽度-1,23);

printf('玩家二移动键:');

gotoxy(宽度-1,24);

printf('i上k下j左l右');

gotoxy(宽度-1,25);

printf('下子:回车键');

gotoxy(宽度1,27);

颜色(4);

printf('退出键:Y’);

gotoxy(宽度1,29);

颜色(6);

printf('悔棋键:G’);

/*打印图框结束*/

颜色(02);

/*打印棋盘上的四个标记点*/

gotoxy( 3*2 2,3 * 2 2);

printf(' * ');

gotoxy( (MAX_X-4)*2,3 * 2 ^ 2);

printf(' * ');

gotoxy(3 * 2 ^ 2,(max _ y-4)* 2);

printf(' * ');

gotoxy( (MAX_X-4)*2,(MAX _ Y-4)* 2);

printf(' * ');

/*打印结束*/

/*开始修边*/

/*gotoxy(宽度- 1,0);

printf(" ");

gotoxy(宽度- 1,高度-1);

printf(" ");*/

/*修边结束*/

/*打印地图完成*/

}

//打印动态游戏说明

无效游戏_描述()

{

//打印下图框内容

gotoxy( 1,高1);

printf(" ");

if(player==player1){

gotoxy( 1,高1);

颜色(2);

printf('玩家一下棋中.');

}else if(player==player2){

gotoxy( 1,高1);

颜色(2);

printf('玩家二下棋中.');

}

}

//初始化游戏位置数据

void initMapState()

{

for(int I=0;I MAX _ Y;i ){

for(int j=0;j MAX _ X;j ){

pos[I][j]=0;//初始状态全为空

}

}

//注意光标的位置和存储在数组中的位置是不同的

px=7;

py=7;

gotoxy(py*2 1,px * 2 1);//初始位置

}

//数组记录下对应位置的状态

void mapState(int qizi)

{//2 * px 1=x//2 * py 1=y//px-0 ~ 14//py-0 ~ 14

if(px=MAX _ X | | px 0 | | py=MAX _ Y | | py 0)

返回;//其他情况下不能记录状态。

pos[px][py]=qizi;

}

//确定自己是否可以继续前进。

int isGoPlay()

{

if(px=MAX _ X | | px 0 | | py=MAX _ Y | | py 0)

返回0;//其他情况下不能记录状态。

if(pos[px][py]==emptyplayer){//表示没有子代。

返回1;

}else{//表示有孩子。

返回0;

}

}

//以棋盘掉落的地方为中心,判断棋盘掉落后的棋盘是否与五个棋盘相连。

int hasGoPlay(int播放器)

{//它分为两部分。首先,在一部分中记录同一玩家的号码。

//记录其他部分的数量,并将它们相加,得到相连部分的总数。

int port1=0,port 2=0;

int x,y,count

//上下看

x=px,y=py-1;

while(pos[x][y]==Player y=0){

端口1;//上部零件的数量

-y;//上移

}

y=py 1;

while(pos[x][Y]==Player Y MAX _ Y){

端口2;//下部的数量

y;//向下移动

}

//计算总数

count=port1 port2 1

if(count=5)返回1;

//环顾四周

端口1=0,端口2=0;

x=px-1,y=py

while(pos[x][y]==Player x=0){

端口1;//上部零件的数量

-x;//向左移动

}

x=px 1;

while(pos[X][y]==Player X MAX _ X){

端口2;//下部的数量

x;//向右移动

}

//计算总数

count=port1 port2 1

if(count=5)返回1;

//左上角,右下角搜索

端口1=0,端口2=0;

x=px-1,y=py-1;

while(pos[x][y]==Player x=0y=0){

端口1;//上部零件的数量

-x;//向左移动

-y;//上移

}

x=px 1,y=py 1;

while(pos[X][Y]==Player X MAX _ X Y MAX _ Y){

端口2;//下部的数量

x;//向右移动

y;//向下移动

}

//计算总数

count=port1 port2 1

if(count=5)返回1;

//右上,左下搜索

端口1=0,端口2=0;

x=px 1,y=py-1;

while(pos[X][y]==Player X MAX _ X y=0){

端口1;//上部零件的数量

x;//向左移动

-y;//上移

}

x=px-1,y=py 1;

while(pos[x][Y]==Player x=0y MAX _ Y){

端口2;//下部的数量

-x;//向右移动

y;//向下移动

}

//计算总数

count=port1 port2 1

if(count=5)返回1;

返回0;

}

//玩家1 2 0

void goPlay(int Player,Stack* p)

{

If(isGoPlay()){//表示可以继续前进。

mapState(播放器);//记录数组中相应位置的情况

If(hasGoPlay(Player)){//如果五子相连,gameover

gameOver_player=玩家;//记录此时获胜的玩家,结束游戏。

}

/*堆栈*/

push(p,px,py);

/*角色切换*/

if(Player==player1){

player=player2//切换到玩家1

gotoxy(px*2 1,py * 2 1);//将光标移动到相应的位置

颜色(07);

printf(' X ');//打印播放器1

游戏_描述();//动态描述

}else if(Player==player2){

player=player1//切换到另一个播放器2

gotoxy( px*2 1,py * 2 1);//将光标移动到相应的位置

颜色(07);

printf(' O ');//打印播放器2

游戏_描述();//动态描述

}

}

}

//堆栈

void push(Stack* p,int x,int y)

{

//堆叠此刻的坐标

int top=p-top;

p-top;//移动堆栈指针

p-x[top]=x;

p-y[top]=y;

返回;

}

//退出堆栈

无效弹出(堆栈* p)

{

int x,y;

//弹出堆栈,移动顶部指针。

//如果堆栈为空,则不会弹出

if(p-top=0)返回;

-p-top;

int top=p-top;

//记录弹出位置。

x=p-x[top];

y=p-y[top];

//在弹出位置打印空格

gotoxy(x * 2 ^ 1,y * 2 ^ 1);

printf(“”);

//删除记录

pos[x][y]=0;

}

//移动盒子

void移动框()

{

//打印移动框

gotoxy(px*2,py * 2 1);

颜色(11);

printf('[');

gotoxy(px*2 2,py * 2 1);

printf(']');

//打印移动框结束

如果(pre_px!=-1 pre_py!=-1){

If(pre_px px pre_py==py){//向左移动时

//保持最后一个位置的右侧不变

gotoxy(pre_px*2 2,pre _ py * 2 1);

颜色(2);

printf(' | ');

}else if(pre_px px pre_py==py){//当向右移动时

//将上一个位置的左边保持原样

gotoxy(pre_px*2,pre _ py * 2 1);

颜色(2);

printf(' | ');

}else{//当向上下移动时

//将上一个位置的左右边保持原样

gotoxy(pre_px*2 2,pre _ py * 2 1);

颜色(2);

printf(' | ');

gotoxy(pre_px*2,pre _ py * 2 1);

颜色(2);

printf(' | ');

}

}

前px=px

pre _ py=py

}

//玩家一移动

void player1_move(Stack* p)

{

茶键;

if (_kbhit())//检测是否按键

{

fflush(stdin);

key=_ getch();//保存按键

游戏_描述();//动态说明

}

开关(钥匙)

{

格“w”:py-;一东匡();打破;//上

案例“a”:px-;一东匡();打破;//左

案例“d”:px;一东匡();打破;//右

大小写:py;一东匡();打破;//下

案例“”:goPlay(玩家1,p);打破;//落子

情况‘y’:game over _ player=-2;游戏结束();//退出游戏

情况‘Y’:game over _ player=-2;游戏结束();//退出游戏

格' g ':pop(p);pop(p);打破;//悔棋

格' g ':pop(p);pop(p);打破;//悔棋

默认:断开

}

//限制光标范围

if(py 0)py=MAX _ Y-1;

else if(py=MAX _ Y)py=0;

else if(px 0)px=MAX _ X-1;

else if(px=MAX _ X)px=0;

gotoxy(2*py 1,2 * py 1,2

}

//玩家2移动

void player2_move(Stack* p)

{

茶键;

if (_kbhit())//检测是否按键

{

fflush(stdin);

key=_ getch();//保存按键

游戏_描述();//动态说明

}

开关(钥匙)

{

格' I ':py-;一东匡();打破;//上

案例“j”:px-;一东匡();打破;//左

案例“l”:px;一东匡();打破;//右

格' k ':py;一东匡();打破;//下

case '\r': goPlay(player2,p);打破;//落子

情况‘y’:game over _ player=-2;游戏结束();//退出游戏

情况‘Y’:game over _ player=-2;游戏结束();//退出游戏

格' g ':pop(p);pop(p);打破;//悔棋

格' g ':pop(p);pop(p);打破;//悔棋

默认:断开

}

//限制光标范围

if(py 0)py=MAX _ Y-1;

else if(py=MAX _ Y)py=0;

else if(px 0)px=MAX _ X-1;

else if(px=MAX _ X)px=0;

gotoxy(2*px 1,2 * px 1,2

}

//创建空栈

Stack* createStack(){

//申请空间

Stack * p=(Stack *)malloc(sizeof(Stack));

//如果未申请到空间

if(p==NULL)返回NULL

p-top=0;//初始化栈顶

返回p;

}

//判断游戏是否结束

int gameOver()

{ //gamerOver_player -1表示继续游戏一表示白方胜利2表示黑方胜利0 表示平局

//五子相连一方取胜你-高~高-1 x-0 ~宽-2

if(gameOver_player==-1){

返回1;

} else if(game over _ player==player 1){//白方胜利

gotoxy( 1,高1);

printf('玩家一胜利!');

返回0;

} else if(game over _ player==player 2){//黑方胜利

gotoxy( 1,高1);

printf('玩家2胜利!');

返回0;

} else if(game over _ player==emptyPlayer){//棋盘满棋平局

gotoxy( 1,高1);

printf('平局!');

返回0;

} else if(game over _ player==Unplayer){//中途退出

gotoxy( 1,高1);

printf('正在退出游戏中.');

出口(1);

}

返回1;

}

int main(){

//调整游戏框

系统('模式控制列=48行=35 ');

//打印地图

map();

//初始化游戏位置数据

initMapState();

//创建空栈

stack * p=create stack()。

//隐藏光标

hide_cursor()。

//游戏循环控制移动

while(gameOver()){

//不断调换人物

if(player==player1)

玩家1 _移动(p);//切换玩家一

else if(player==player2)

玩家2 _移动(p);//切换玩家2

}

免费(p);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: