小游戏案例之联机五子棋制作教程

· · 个人记录

背景:有人说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,"合理安排时间,享受健康生活。");

比如可以加个健康游戏忠告、改个名字什么的,好的,本次的讲解就到这里了

你们都学会了吗???呵呵!(非常简单对不对)