php socket開發斗地主,基于狀態機模型的斗地主游戲(NodeJsSocketIO)

1. 系統結構

系統考慮使用Nodejs和SocketIo實現服務器端邏輯,前端使用HTML5。

1460000007643089

2. 邏輯流程

1 . 主要邏輯包括用戶進入游戲、等待對家進入游戲、游戲過程、結束統計這4個過程。

1460000007643090

2 . 游戲過程的邏輯具體如下

1460000007643091

3 . 服務器-客戶端通訊邏輯如下

1460000007643092

3. 客戶端界面設計

1 . 登錄界面

1460000007643093

2 . 發牌界面

1460000007643120?w=1074&h=791

4. 數據結構

4.1 牌型

為了便于計算,使用一維數組定義每張撲克的index,根據圖中順序,按從左到右以及從上到下遞增(即左上角的紅桃A為0,右上角的紅桃K為12,方塊A為13,以此類推)

1460000007643121>

4.2 出牌規則

牌的大小順序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3。

牌形分為:單張、 一對、 三張、姐妹對(兩張三張都可以連接,且連接數量無限)、順子(數量無限制)、炸彈(不能4帶1):

除了炸彈以外,普通牌形不允許對壓,相同牌形只有比它大的才能出。

炸彈任何牌形都能出,炸彈的大小為:天王炸,2,A,K,Q,J,10,9,8,7,6,5,4,3。

4.3 比較大小

根據牌型用整數定義撲克的數值大小

從3到K對應的value為2到12

A對應13

2對應14

大小王對應16與15

5. 系統模塊設計

5.1 出牌對象

var MODAL;

$(init);

function init() {

new modal();

//綁定頁面上的出牌按鈕,根據當前不同的狀態運行不同的函數

$("body").on("click","#sendCards",statusMachine);

}

function statusMachine() {}

var modal = function () {

var ptrThis;

var modalBox = {

//出牌對象的數據

default:{

//cards存儲服務器發送過來的撲克數組

cards:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,

38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],

//當前游戲的狀態,有DISCARD(發牌),WATING(等待),GAMEOVER(游戲結束)三個狀態

status:"",

//myIndex為玩家所處于的座位的座位號

myIndex:0,

//leftIndex為位于進行游戲的玩家左邊的玩家的座位號

leftIndex:0,

rightIndex:0,

//turn與座位號對應,turn表示由對應的座位號玩家進行操作(例如發牌,放棄)

turn:0,

//若有兩位玩家放棄出牌,則第三位玩家必須出牌,用于標志新的出牌回合的開始

disCardTrue:false,

//記錄前一位玩家所處的牌,用于實現壓牌邏輯

formercardsType:{}

},

//$goal為待插入撲克的jquery對象,cardArray為撲克數組,isDelay為true則延遲插入(隔0.3s插入一張牌)

placeCards:function ($goal,cardArray,isDelay) {},

//sort函數所用到的比較函數,a,b都為撲克的index,將撲克按照value從大到小降序排列,value相同則按照花色排序

comp:function (a,b) {},

//變換當前撲克牌的狀態,未選取->選取,選取->未選取

toggleCard:function ($this) {},

//將服務器發送的無序數組按照一定規則進行排序

cardsSort:function (cards) {},

//將已被選中并發送的撲克牌從手牌中刪除

removeCards:function () {},

//判斷從服務器發送撲克牌數組是由誰發出的,調用placeCards函數插入撲克

//turn設置為下一位玩家,根據turn設置status

//如果撲克牌已被出完,則根據最后一位出牌人來判斷當前玩家是勝利還是失敗

justifyWhich:function (obj) {},

//收到來自服務器轉發的某一位玩家發送的投降信息

someOneTouXiang:function (seats) {},

//清空玩家發送的撲克

clearCards:function () {},

//繪制左右兩位玩家的界面,objLeft為左邊的玩家的信息,objRight同上

drawothers:function (objLeft,objRight) {},

//繪制玩家的界面,包含手牌,obj為相關信息

drawuser:function (obj) {},

//向目標jquery對象插入圖片,$this為目標jquery對象,obj為相關信息(例如圖片路徑)

insertImg:function ($this,obj) {},

//移除目標jquery對象的圖片,$this為目標jquery對象

removeImg:function ($this) {},

//開始游戲,seats為服務器發送過來的座位對應著的用戶的信息,turn指定座位下標為turn的用戶先出牌(turn由服務器的隨機數產生)

//存儲服務器發送過來的撲克牌數組,調用cardsSort,drawothers,drawuser,placeCards,initPlay

startGame:function (seats,turn) {},

//出牌前的邏輯判斷,判斷牌是否能壓過上家或者是否符合邏輯

preSend:function () {},

//在status為WATING時點擊出牌調用的函數

notYourTurn:function () {},

//壓牌邏輯的實現,temp存儲著牌型,牌的值和牌的數量

compWhichLarger:function (temp) {},

//綁定座位點擊坐下事件

init:function () {},

//游戲結束正常調用end函數,isWin為true則該玩家勝利

end:function (isWin) {},

//重開一局,array為來自服務器的撲克牌數組,turn為先出牌的人

reStart:function (array,turn) {},

//切換準備按鈕的狀態,準備->取消,取消->準備

readyGame:function () {},

//游戲結束

gameover:function (isWin) {},

//放棄出牌

giveUp:function () {},

//放棄出牌得到服務器回應

giveUpReply:function (giupCount) {},

//綁定一系列點擊事件

initPlay:function () {}

}

MODAL = modalBox;

return modalBox.init();

}

5.2 出牌流程

//出牌按鈕綁定狀態機,根據當前狀態運行對應的函數,只有在處于DISCARD狀態才能正常發牌

$("body").on("click","#sendCards",statusMachine);

function statusMachine() {

switch(MODAL.default.status){

case "DISCARD":

//運行至preSend函數

MODAL.preSend();

break;

case "WAITNG":

MODAL.notYourTurn();

break;

case "GAMEOVER":

MODAL.readyGame();

default:

break;

}

}

var modalBox = {

preSend:function () {

var array = new Array();

//將被選擇(用select來標識)的撲克牌的下標取出,插入數組array中

$(".cardsLine .card").each(function () {

if($(this).hasClass("select")){

array.push($(this).attr("index"));

}

});

//compCards函數參數為排過序的array,因為用戶手牌已經按照一定順序排過序,所以按照一個方向取出來的牌也是具有一定是有序列的

var temp = compCards(array);

//console.log(compCards(array));

//console.log(temp);

//disCardTrue為true標識之前已經有兩個人放棄出牌,所以不需要考慮壓牌,只需要牌型符合一定規則即可出牌

if(MODAL.default.disCardTrue){

if(temp.type!="ERR"){

socketFun.sendCards(array);

}else{

alert("無法出牌");

}

}else{

//temp為儲存array牌型以及大小等數據的對象,compWhichLarger函數則是將temp與上一位玩家發的牌進行比較,如果大于則flag為true

var flag = ptrThis.compWhichLarger(temp);

if(flag){

//將array發送至服務器,如果服務器將接受成功的消息發回,則調用 justifyWhich函數

socketFun.sendCards(array);

}else{

alert("無法出牌");

}

}

//ptrThis.sendCards();

},

justifyWhich:function (obj) {//ojb為服務器發送的消息,包含發牌人,發的牌的信息

if(obj.posterIndex!=MODAL.default.myIndex){

//如果是別人出的牌,則儲存該牌型

MODAL.default.formercardsType=compCards(obj.array);

}

MODAL.default.disCardTrue = false;

var $goal;//$goal為待渲染的部位

switch(obj.posterIndex){

case MODAL.default.myIndex:

ptrThis.removeCards();

$goal = $(".showCardLine");

break;

case MODAL.default.leftIndex:

$goal = $(".leftPlayer").children(".otherCards");

break;

case MODAL.default.rightIndex:

$goal = $(".rightPlayer").children(".otherCards");

break;

default:

break;

}

ptrThis.placeCards($goal,obj.array,false);

//進入下一回合,輪次加一

MODAL.default.turn = (MODAL.default.turn+1)%3;

console.log("Now turn is"+MODAL.default.turn);

//設置下一回合該玩家是出牌還是等待

if(MODAL.default.turn==MODAL.default.myIndex){

MODAL.default.status = "DISCARD";

}else{

MODAL.default.status = "WAITNG"

}

//如果某一位玩家出完牌,則游戲結束

if(obj.sendOut){

if(obj.posterIndex==MODAL.default.myIndex){

ptrThis.end(true);

}else{

ptrThis.end(false);

}

}

}

}

5.3 客戶端SocketIO消息模型

var socket = io.connect('http://localhost:3000');

var X = window.scriptData; //截取服務器發送過來的數據

//收到服務器發送的不同的消息類型,調用對應的出牌模型中的函數

socket.on("connect",function () {

socket.emit("addUser",X._id); //添加用戶

})

socket.on("playerSit",function (obj) {

MODAL.insertImg($(".seat").eq(obj.index).children(),obj);

})

socket.on("leave",function (index) {

MODAL.removeImg($(".seat").eq(index).children());

})

socket.on("seatsInfo",function (obj) {

console.log("seatsInfo"+obj);

for(var key in obj){

console.log(key);

MODAL.insertImg($(".seat").eq(obj[key].index).children(),obj[key]);

}

})

socket.on("gameStart",function (obj,turn) {//服務器通知玩家游戲開始

MODAL.startGame(obj,turn);

})

socket.on("postCards",function (obj) {//服務器返回出牌人以及出牌信息

MODAL.justifyWhich(obj);

})

socket.on("reStart",function (array,turn) {//服務器返回重新開始游戲的信息

MODAL.reStart(array,turn);

})

socket.on("giveup",function (giupCount) {//服務器返回放棄信息

MODAL.giveUpReply(giupCount);

})

socket.on("renshu",function (seats) {

MODAL.someOneTouXiang(seats);

})

var socketFun = {

//出牌對象通過socketFun調用相關函數與服務器通信

sit:function ($this) {

var obj = {

id:X._id,

index:$this.parent().index()

}

socket.emit("sitSeat",obj);

},

sendCards:function (array) {

var sendOut;

if(($(".cardsLine .cards").children().length-array.length)==0){

sendOut = true;

}else{

sendOut = false;

}

var obj = {

array:array,

posterIndex:MODAL.default.myIndex,

sendOut:sendOut

}

socket.emit("postCards",obj);

},

readyMsg:function (obj) {//告知服務器該玩家準備

socket.emit("readyMsg",obj);

},

giveUp:function () {//告知服務器放棄出牌

socket.emit("giveup");

},

touxiang:function (index) {//告知服務器該玩家投降

socket.emit("touxiang",index)

}

}

5.4 壓牌邏輯

根據牌型數組判斷牌型的邏輯使用狀態機實現,其狀態遷移圖如下:

1460000007643094

function compCards(array) {

if(array.length==2&&data[array[0]].value==16&&data[array[1]].value==15){//天王炸

var cardsType={

count:array.length,

type:"KINGBOMB",

value:data[array[0]].value

};

return cardsType;

}

//ptr指向array的下標

var ptr;

//end標志狀態機是否結束

var end = false;

//data存儲著每一張撲克的value,避免多次運算value

var box = {

cardsType:{

count:array.length,

type:"ONE",

value:data[array[0]].value

},

setType:function (type) {

this.cardsType.type = type;

},

statusOne:function () {

if(this.cardsType.count==1){

end = true;

return ;

}

if(data[array[0]].value==data[array[1]].value){ //如果第一個和第二個數字相同

this.setType("TWO");

return ;

}

if(data[array[0]].value==data[array[1]].value+1){

this.setType("STRAIGHT");

}else{

this.setType("ERR");

}

return ;

},

statusTwo:function () {

if(this.cardsType.count==2){

end = true;

return ;

}

if(data[array[1]].value==data[array[2]].value){

this.setType("THREE");

return ;

}

if(data[array[1]].value==data[array[2]].value+1){

this.setType("TWO-ONE");

}else{

this.setType("ERR");

}

},

statusThree:function () {

if(this.cardsType.count==3){

end = true;

return ;

}

if(data[array[2]].value==data[array[3]].value){

this.setType("BOMB");

return ;

}

if(data[array[2]].value==data[array[3]].value+1){

this.setType("THREE-ONE");

}else{

this.setType("ERR");

}

return ;

},

statusStraight:function () {

if(this.cardsType.count< 5){

this.setType("ERR");

end = true;

return ;

}

if(ptr< this.cardsType.count-1){

if(data[array[ptr]].value!=data[array[ptr+1]].value+1){

this.setType("ERR");

end = true;

return ;

}

}else{

end = true;

return ;

}

},

statusTwoOne:function () {

if(ptr==this.cardsType.count-1){ //TwoOne處于中間狀態,結束則出錯

this.setType("ERR");

return ;

}

if(data[array[ptr]].value==data[array[ptr+1]].value){

this.setType("TWO-TWO");

}else{

this.setType("ERR");

}

return ;

},

statusTwoTwo:function () {

if(ptr==this.cardsType.count-1){

end = true;

return ;

}

if(data[array[ptr]].value==data[array[ptr]].value+1){

this.setType("TWO-ONE");

}else{

this.setType("ERR");

}

return ;

},

statusThreeOne:function () {

if(ptr==this.cardsType.count-1){

this.setType("ERR");

return ;

}

if(data[array[ptr]].value==data[array[ptr+1]].value){

this.setType("THREE-TWO");

}else{

this.setType("ERR");

}

return ;

},

statusThreeTwo:function () {

if(ptr==this.cardsType.count-1){

this.setType("ERR");

return ;

}

if(data[array[ptr]].value==data[array[ptr+1]].value){

this.setType("THREE-THREE");

}else{

this.setType("ERR");

}

return ;

},

statusThreeThree:function () {

if(ptr==this.cardsType.count-1){

end = true;

return ;

}

if(data[array[ptr]].value==data[array[ptr+1]].value+1){

this.setType("THREE-ONE");

}else{

this.setType("ERR");

}

return ;

},

statusBomb:function () {

if(ptr==this.cardsType.count-1){

end = true;

return ;

}

if(data[array[ptr]].value!=data[array[ptr+1]].value){

this.setType("ERR");

}

},

ERR:function () {

end = true;

return ;

}

};

for(ptr = 0;ptr< box.cardsType.count;++ptr){

console.log("END:"+end);

console.log(box.cardsType);

if(end){

break;

}

switch(box.cardsType.type){

//ONE表示單張牌,這個ONE狀態結束有效

case "ONE":

box.statusOne();

break;

//TWO表示一對,結束有效

case "TWO":

box.statusTwo();

break;

//THREE表示三張一樣的牌,結束有效

case "THREE":

box.statusThree();

break;

//STRAIGHT表示順子,根據array長度判斷是否有效

case "STRAIGHT":

box.statusStraight();

break;

//TWO-ONE表示形如xx(x+1)(x+1)(x+2)的牌型,結束無效,返回類型ERR

case "TWO-ONE":

box.statusTwoOne();

break;

case "TWO-TWO":

//TWO-TWO表示形如xx(x+1)(x+1)(x+2)(x+2)的牌型,結束有效

box.statusTwoTwo();

break;

//THREE-ONE表示形如xxx(x+1)(x+1)(x+1)(x+2)的牌型,結束無效,返回類型ERR

case "THREE-ONE":

box.statusThreeOne();

break;

//THREE-TWO表示形如xxx(x+1)(x+1)(x+1)(x+2)(x+2)的牌型,結束無效,返回類型ERR

case "THREE-TWO":

box.statusThreeTwo();

break;

//THREE-THREE表示形如xxx(x+1)(x+1)(x+1)(x+2)(x+2)(x+2)的牌型,結束有效

case "THREE-THREE":

box.statusThreeThree();

break;

//BOMB表示炸彈,返回有效

case "BOMB":

box.statusBomb();

break;

//ERR表示牌型不合邏輯,無效

case "ERR":

box.ERR();

break;

}

}

return box.cardsType;

}

詳細代碼見GITHUB的pokepoke項目

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534798.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python幾何拼貼畫_圖形幾何圖形拼貼畫

四邊形教學內容:教材第34頁?——36頁教學目標:1.直觀感知四邊形,能區分和辨認四邊形,知道四邊形的特征.進一步認識長方形和正方形,知道它們的角都是直角.2.通過畫一畫、找一找、拼一拼等活動,培養學生[此文轉于斐斐課件園?FFKJ.Net]的觀察比較和概括抽象的能力,發展空間想象能…

wgs84轉經緯度_wgs84經緯度轉為cgcs2000平面坐標

航拍測繪中,pos數據多數是wgs84&#xff0c;而GCP坐標是2000或者80坐標。有如下2情況需要轉換坐標&#xff0c;1.不同坐標系刺點時&#xff0c;位置相差較遠&#xff0c;影響工作效率。2.該軟件不支持wgs84轉國家2000&#xff0c;比如photoscan。所以需要把pos數據轉為跟像控點…

php system 255,GitHub - dwg255/OA-SYS: OA辦公系統開源項目

OA-SYSOA辦公系統開源項目這是一套主要用于演示、學習為目的OA辦公自動化系統。該系統具備基本的自動化辦公功能。在使用前請確保您已閱讀本系統協議部分內容。主要功能列表用戶和用戶組、權限管理個人網盤和分享文件生產計劃任務和業績考評通訊錄和內部短消息公告系統個人工作…

wpcomments post.php,WordPress移動wp-comments-post文件防垃圾評論

將wp-comments-post文件移動到主題目錄中達到阻止垃圾評論。需要修改程序文件&#xff1a;一、首先打開Wordpress程序根目錄的wp-comments-pos.php文件&#xff0c;用&#xff1a;require( dirname(__FILE__) . /../../../wp-load.php );替換第16行的&#xff1a;require( dirn…

人工蜂群算法python_改進的人工蜂群算法解決聚類問題(在Python中的分步實現)...

在之前的文章中&#xff0c;我介紹了如何通過實施名為Artificial Bee Colony(ABC)的群集智能(SI)算法來解決現實世界中的優化問題。現在是時候讓我們掌握一些真實的數據并解釋我們如何使用我們的ABC算法的Python實現來執行群集任務。但在此之前&#xff0c;讓我們深入了解一下聚…

python涉及到的邏輯_涉及邏輯運算的python表達式的運算順序

以下代碼并不報錯&#xff0c;而我理解在”point 1″處如果先運算小括號里面的表達式&#xff0c;而y并不存在&#xff0c;不應該報錯嗎&#xff1f;難道發現x 10的短路運算優先于小括號里面的表達式運算&#xff1f;將這一行中x 10改為x 100后報錯了&#xff0c;這個理解沒…

oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関數

指定したソートキーでの、最初の行の値を求めるのが、First_Value関數。指定したソートキーでの、最後の行の値を求めるのが、Last_Value関數。指定したソートキーでの、(Row_Numberな順位が)n番目の行の値を求めるのが、nth_Value関數となります。Oracle11gR2でnth_Value関數が…

python讀取字典元素筆記_Python 學習筆記 - 字典

Python 字典字典是一種無序的、可修改的、可索引的容器。字典使用花括號聲明&#xff0c;具有鍵和值。mydic {name:孫悟空,origin:猴子}print(mydic)結果&#xff1a;{name: 孫悟空, origin: 猴子}訪問字典mydic {name:孫悟空,origin:猴子}print(mydic[name])結果&#xff1a…

oracle =1,oracle中的 where 1=1 和where 1 !=1

11 永真&#xff0c; 1<>1 永假。1<>1 的用處&#xff1a; 用于只取結構不取數據的場合例如&#xff1a;create table table_ly_temp tablespace ly_temp asselect * from table_ly where 1<>112建成一個與table_ly 結構相同的表table_ly_temp &#xff0c;但…

企業信息化投入中咨詢服務_全過程工程咨詢服務核心價值是什么

建筑行業服務現狀傳統建設工程的目標、計劃、控制都以參與單位個體為主要對象&#xff0c;項目管理的階段性和局部性割裂了項目的內在聯系&#xff0c;導致項目管理存在明顯的管理弊端&#xff0c;這種模式已經與國際主流的建設管理模式脫軌。“專而不全”、“多小散”企業的參…

sp_addlinkedserver oracle,sp_addlinkedserver使用方法

Exec sp_droplinkedsrvlogin DBVIP,Null --刪除映射(錄與鏈接服務器上遠程登錄之間的映射)Exec sp_dropserver DBVIP --刪除遠程服務器鏈接EXEC sp_addlinkedserverserverDBVIP,--被訪問的服務器別名srvproduct,providerSQLOLEDB,datasrc"…

oracle的undo表空間不足,undo表空間不足,ORA-30036 unable to extend segment by ...

一、一次更新或者刪除大量數據&#xff0c;這些數據需要保存在undo表空間中(直到提交或回滾后這些undo表空間中的數據才允許被覆蓋)&#xff0c;如果undo表空間不足&#xff0c;就會報ORA-30036錯誤。下面是兩種解決辦法&#xff1a;1、增加undo表空間大小&#xff0c;或將undo…

交流信號疊加直流偏置_放大器偏置電流Ib需要完整的直流回路

多數工程師對于放大器偏置電流參數并不陌生&#xff0c;它是導致放大器電路產生直流噪聲的又一重要影響因素。因為偏置電流經過輸入端電阻網絡會形成一個失調電壓源&#xff0c;再通過電路的噪聲增益影響輸出直流噪聲。所以工程師會注重電阻網絡的匹配&#xff0c;降低偏置電流…

teamviewer類似軟件_TeamViewer系統后臺被黑客組織APT攻破,請注意防范

TeamViewer事件10月11日&#xff0c;深圳市網絡與信息安全信息通報中心發布了一份編號為“2019029”的名為《關于TeamViewer客戶端被遠程控制的緊急通報》文件&#xff0c;文件指出目前知名遠程辦公工具TeamViewer已經被境外黑客組織APT41攻破&#xff0c;提醒企業組織做好防護…

linux上dig命令,Linux dig命令(示例代碼)

dig(Domain Information Groper)&#xff0c;和nslookup作用有些類似&#xff0c;都是DNS查詢工具1、dig命令格式dig dnsserver name querytype如果你設置的dnsserver是一個域名&#xff0c;首先通過默認的上連DNS服務器去查詢對應的IP地址&#xff0c;然后再以設置的dnsserver…

python實現表格線性回歸_Python實現線性回歸

一、線性回歸原理二、python實現線性回歸1.基本矩陣運算pratice1.py:# Author:WYCimport numpy as npfrom numpy.linalg import invfrom numpy import dotfrom numpy import matprint(-------------給定矩陣A,B----------)A np.mat([1,1])print (A:\n,A)B mat([[1,2],[2,3]])…

linux后臺啟動腳本nohup,linux下后臺執行shell腳本nohup

【GSM】GTM900C的應用——短信雖說GSM已經很老舊,但其低廉的價格,非常適合一些需要小數據上網傳輸和短信等功能的應用場合. 不知道GSM能否像51單片機一樣,在低端應用中長久不衰.GTM900C發送短信,支持兩種模式,TXT和PD ...iOS UITabBarController的使用UITabBarController 和 UI…

華為4g模塊 linux驅動程序,定制Android之4G-LTE模塊驅動

定制Android之4G-LTE模塊驅動一&#xff0e; 簡介本文講述在Android內核中&#xff0c;添加中國移動4G-LTE制式華為MU909模塊驅動&#xff0c;實現通過4G上網業務&#xff0c;電話業務&#xff0c;短信業務。CPU&#xff1a;Samsung 6410Kernel&#xff1a;linux 2.6.36…

軟件測試用例_軟件測試用例設計實戰場景法

不點藍字&#xff0c;我們哪來故事&#xff1f; 目錄場景法擴展例子場景法介紹影子場景法用例設計舉例場景法設計用例步驟和表示場景法舉例 總結 場景法的注意點場景法影子本來想直接跳過場景法的&#xff0c;今天群友提出問題&#xff1a;1、面試官問&#xff1a;場景…

linux下printf語句執行時間,linux下printf中\n刷新緩沖區的疑問(已解決)

#include #include int main(void){ printf("hello world");close(STDOUT_FILENO); return 0;}//什么都不輸出12345678910111234567891011#include #include int main(void){ printf("hello world\n");close(STDOUT_FILENO); …