C语言网络编程实战之线上五子棋游戏(三)

C语言网络编程实战之线上五子棋(三)

网上五子棋游戏客户端实现


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <getch.h>
#include <network.h>

//	棋盘数组
char board[15][15];
//	棋子坐标
char key_x = 7,key_y = 7;
//	棋子角色 黑'@' 白'$'
char role = '@';
//	初始化棋盘
void init_board(void)
{
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15;j++)
		{
			board[i][j] = '*';	
		}
	}
}

//	显示棋盘
void show_board(void)
{
	system("clear");
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15;j++)
		{
			printf(" %c",board[i][j]);
		}
		printf("\n");
	}
}

//	落子
void get_key(void)
{

	//	光标落子操作
	printf("请%c落子",role);
	for(;;)
	{
		printf("\33[%hhd;%hhdH",key_x+1,(key_y+1)*2);
		switch(getch())
		{
			case 183:	key_x>0  && key_x--;	break;
			case 184:	key_x<14 && key_x++;	break;
			case 186:	key_y>0 &&  key_y--;	break;
			case 185:	key_y<14 && key_y++;	break;
			case 10:
			{
				if('*' == board[key_x][key_y])
				{
					board[key_x][key_y] = role;
					return;
				}
				break;
			}
		}
	}

}

// 五子连珠,判断一个小方向
int func(int i,int j)
{
	int cnt = 0;
	for(int x=key_x+i,y=key_y+j;x>=0 && x<15 && y>=0 && y<15;x+=i,y+=j)
	{
		if(board[x][y] == role)
		{
			cnt++;	
		}
		else
		{
			return cnt;	
		}
	}
	return cnt;
}

//	检查是否五子连珠
int is_win(void)
{
	if(4 <= func(-1,-1) + func(1,1)) return 1;
	if(4 <= func(-1,0) + func(1,0)) return 1;
	if(4 <= func(0,-1) + func(0,1)) return 1;
	if(4 <= func(-1,1) + func(1,-1)) return 1;
	return 0;
}
int buf[3] = {};
int main(int argc,const char* argv[])
{
	NetWork* snw = init_nw(SOCK_STREAM, atoi(argv[1]), argv[2], false);
	if(snw == NULL)
	{
		perror("init_nw");
		return EXIT_FAILURE;
	}
	init_board();
	for(;;)
	{
		show_board();
		if(buf[0])
		{
			printf("%c胜利\n", role);
			close_nw(snw);
			return 0;
		}
		role = '@';
		get_key();
		buf[1] = key_x, buf[2] = key_y;
		if(is_win())
		{
			show_board();
			printf("%c胜利\n",role);
			buf[0] = 1;
			send_nw(snw, buf, sizeof(buf));  
			close_nw(snw);
			return 0;
		}
		send_nw(snw, buf, sizeof(buf));  
		//	交换角色
		role = '$';
		show_board();
		printf("请%c落子\n", role);
		recv_nw(snw, buf, sizeof(buf));
		board[buf[1]][buf[2]] = '$';
	}
}
C语言网络编程五子棋是一个基于服务器与客户端之间进行互动的游戏。玩家可以通过向对方发送下棋点的坐标来进行游戏,服务器和客户端收到坐标后进行下子,并判断游戏结果。这个游戏是在Linux下实现的,使用了C语言进行编写。游戏的实现需要以下几个要素: 1. 棋盘:游戏开始前需要打印一个棋盘,可以自定义大小。通过初始化一个二维字符数组来表示棋盘,每个坐标的初始值用空格代替。 2. 下子:玩家可以通过输入坐标来下子。游戏提供了一个共用的下子函数,通过判断坐标是否合法来决定是否能够下子。玩家可以选择扮演客户端或者服务器,在对应的移动函数中调用共用的下子函数来下子。 3. 游戏规则:游戏的规则是五子棋规则,玩家需要在棋盘上连成一条直线的五个自己的棋子来获胜。游戏会判断玩家是否获胜或者平局,并进行相应的提示。 这里提供的引用给出了一个简易的五子棋小游戏的代码实现,包括棋盘的初始化和打印函数。引用则给出了玩家移动的代码,包括共用的下子函数和客户端移动、服务器移动的函数。引用提供了更多关于这个游戏的实现方法和思路,并给出了源码的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言实现简单网络版五子棋(服务器与客户端)](https://blog.csdn.net/IT_xiaoye/article/details/80381439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值