小游戏案例之联机五子棋制作教程
背景:有人说2048太水了,随便切,所以我做个了更水的游戏教程。
欢迎来到联机五子棋制作教程,本游戏用到EGE,未安装的看这里(不用ege的话就自己改一下可视化部分就可以了,联机c++自带
虽然本代码给了部分代码,但还是建议自己不看教程自己敲一便,要不然做出来了也没啥用,不能自己吸收
1. 首先理一理思路,大家可以先看看这个问题,因为五子棋太水了,所以只能用联机来提高可玩度 我不会说是AI难写
Q1.怎么联机
A1.不知道,别问我
2. 来实现 (1)初始化
int themap[15][15];
一个全局变量就行啦,非常简单对不
(2)可视化 (先抛开联机不说,把基础功能写完再说
setcaption("请下棋");
etfont(60,0,"宋体");
outtextxy(0, 0, "┌┬┬┬┬┬┬┬┬┬┐");
......
outtextxy(0,600, "└┴┴┴┴┴┴┴┴┴┘");
后用类似的代码绘制棋子可视化
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
etfillcolor(EGERGB(255,0,0));
if(themap[i][j]==1)fillellipse(▓,j*60,▓,20);
setfillcolor(EGERGB(0,0,225));
if(themap[i][j]==2)fillellipse(i*60,j*60,20,20);
}
}
(▓是一些简单的填空)
楼上就是一个简单的可视化了,太简单了因此不做说明。
(3)怎么结束游戏
int win=0;
for(int i=1;i<=6;i++){
for(int j=1;j<=10;j++){
if(themap[i][j]==1&&win==0){
win=1;
for(int k=1;k<5;k++){
if(themap[i+k][j]!=1)win=0;
}
}
}
}
和
if(win==1){
outtextxy(0,180,"你胜利了");
Sleep(10000);
break;
}
这里就给一个例子了,其他方向和输的判断自己推。
(4)怎么判断按下的棋子在哪个格子 (半重点)
is=0;
while(is==0){
if(KEY_DOWN(VK_LBUTTON)){
int x,y;
mousepos(&x, &y);
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(x>60*i-30&&x<60*i+30&&y>j*60-30&&y<j*60+30&&themap[i][j]==0){
is=1;
themap[i][j]=1;
}
}
}
}
用mousepos(&x, &y)来获得鼠标点击的位置,后面依次枚举看是不是(其实直接”/“更快)
(5)怎么联机 (重点)
客户端开始加上
inputbox_getline("IPv4是","数字:",SERVER_ADDRESS,14);
WSADATA wsaData;
SOCKET sClient;
SOCKADDR_IN server;
char szMessage[MSGSIZE];
int ret;
WSAStartup(0x0202, &wsaData);
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
memset(&server, 0, sizeof(SOCKADDR_IN));
server.sin_family = PF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN));
和
#pragma comment(lib, "ws2_32.lib")
#define PORT 5150
#define MSGSIZE 1024
服务器开始加上
WSADATA wsaData;
SOCKET sListen;
SOCKET sClient;
SOCKADDR_IN local;
SOCKADDR_IN client;
char szMessage[MSGSIZE];
int ret;
int iaddrSize = sizeof(SOCKADDR_IN);
WSAStartup(0x0202, &wsaData);
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));
listen(sListen, 1);
sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize);
ntohs(client.sin_port);
和
#define PORT 5150
#define MSGSIZE 1024
#pragma comment(lib,"ws2_32.lib")
然后在下子的地方加上(发送玩家下子的坐标)
szMessage[0]=i;
szMessage[2]=j;
send(sClient,szMessage,strlen(szMessage), 0);
后面加个等待的代码(接受敌方下子的坐标)
ret=recv(sClient, szMessage,MSGSIZE,0);
themap[szMessage[0]][szMessage[2]]=2;
(6)加工和更新界面花缀
setcaption("联机五子棋 BY-Zhoumy");
setbkcolor_f(EGERGB(30,60,130));
cleardevice();
setfont(45,0,"宋体");
outtextxy(40,25,"Zhoumy游戏");
setfont(19,0,"宋体");
outtextxy(80,95,"游戏健康忠告");
outtextxy(20,115,"抵制不良游戏,拒绝盗版游戏。");
outtextxy(20,135,"注意自我保护,谨防受骗上当。");
outtextxy(20,155,"适度游戏益脑,沉迷游戏伤身。");
outtextxy(20,175,"合理安排时间,享受健康生活。");
比如可以加个健康游戏忠告、改个名字什么的,好的,本次的讲解就到这里了