สาธิต: http://cnwander.com/demo/billiards/
ที่อยู่เดิม: http://cnwander.com/blog/?p=11
ซีรีส์มินิเกม JS:
[JS mini-game] งู + คอมเมนท์แบบละเอียด
วางรหัสก่อน:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<หัว>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>บิลเลียดโดย CNwander</title>
<style type="text/css">
* {ระยะขอบ:0; ช่องว่างภายใน:0}
เนื้อความ {พื้นหลัง:สีดำ; จัดข้อความ:ศูนย์;
h1 {font-size:12px; color:gray; แบบอักษร-น้ำหนัก:ปกติ;
h1 .sub {แนวตั้ง: super;
.info {ตำแหน่ง: สัมบูรณ์; ขวา: 0;
#table {ตำแหน่ง: ญาติ; ระยะขอบ: 20px อัตโนมัติ 10px; พื้นหลัง: url ( ); _พื้นหลัง: ไม่มี; _filter: progid: DXImageTransform.Microsoft.AlphaImageLoader มาตราส่วน', src = " ); _พื้นหลัง: ไม่มี; _filter: progid: DXImageTransform.Microsoft.AlphaImageLoader (เปิดใช้งาน = 'true', sizingMethod = 'มาตราส่วน', src = " ); _พื้นหลัง: ไม่มี .AlphaImageLoader(enabled='true', sizingMethod='scale', src=" ) no-repeat}
#force {position:absolute; left:0; top:18px; width:75px; ความสูง:20px ;
#scoreBoard {position:absolute; z-index:3; top:230px; ซ้าย:346px; }
#tips {padding:15px 0 0 20px; text-align:left;
</สไตล์>
<script type="text/javascript">
// ทั่วไป
ฟังก์ชั่น $(str) {
กลับ document.getElementById(str);
-
ฟังก์ชั่น $tag(str,เป้าหมาย) {
เป้าหมาย = เป้าหมาย ||. เอกสาร;
กลับ target.getElementsByTagName(str);
-
ฟังก์ชั่น addEventHandler (obj, eType, fuc) {
ถ้า (obj.addEventListener){
obj.addEventListener(eType,fuc,false);
} อื่นถ้า (obj.attachEvent){
obj.attachEvent("เปิด" + eType,fuc);
}อื่น{
obj["on" + eType] = fuc;
-
-
ฟังก์ชั่น RemoveEventHandler (obj, eType, fuc) {
ถ้า (obj.removeEventListener){
obj.removeEventListener(eType,fuc,false);
} อื่นถ้า (obj.attachEvent){
obj.detachEvent("เปิด" + eType,fuc);
-
-
ฟังก์ชั่น randowNum (เริ่มต้นสิ้นสุด) {
กลับ Math.floor(Math.random()*(end - start)) + start;
-
Array.prototype.remove=function(dx) {
if(isNaN(dx)||dx>this.length){ส่งคืนเท็จ;}
สำหรับ (var i=0,n=0;i<this.length;i++)
-
ถ้า(นี่[i]!=นี่[dx])
-
นี่[n++]=นี่[i]
-
-
นี้.ความยาว-=1
-
//const
var TOTALR = 15, //รัศมีของลูกบอล (รวมเงา)
R = 12, // รัศมีที่แท้จริงของลูกบอล
โป๊กเกอร์ = 20,
W = 736, // ความกว้างของตัวพิมพ์
H = 480, // ความสูงตัวพิมพ์
ความหนา = 32, // ความหนาของขอบ
RATE = 100 // ความถี่ในการรีเฟรช
F = 0.01, //แรงเสียดทาน
LOSS = 0.2, // การสูญเสียความเร็วการชน
TIPS = ["เคล็ดลับ 1: บอลอ้างอิง บอลเป้า กระเป๋าเป้า 3 แต้มและ 1 เส้น นี่เป็นวิธีพื้นฐานที่สุดในการทำประตู"เคล็ดลับ 2: แถบสีน้ำเงินที่มุมขวาล่างแสดงถึงแรงตี แรงเล็กน้อย ควบคุมตำแหน่งลูกคิวได้ง่ายกว่า"เคล็ดลับที่ 3: จุดสีน้ำเงินบนลูกบอลสีขาวที่มุมขวาล่างควบคุมจุดตี ซึ่งมักจะอยู่ตรงนี้ ","เคล็ดลับ 4: ในเทเบิลเทนนิส ลูกเป้าหมายไม่ได้เล่นจริง แต่เป็นลูกคิวบอล"];
ตาราง var, //case
คิวบอล //คิวบอล
guideBall //บอลอ้างอิง
dotWrap, //บรรทัดอ้างอิง
ความเร็ว = 12,
โรลอัพ = 0,
ม้วนขวา = 0,
จับเวลา,
บังคับจับเวลา,
ลูกบอล = [],
ย้ายบอล = [],
โผล่ = [[0,0],[W/2,-5],[W,0],[0,H],[W/2,H+5],[W,H]],
hasShot = เท็จ;
ช็อต = 0; // จำนวนช็อตคอมโบ
window.onload = ฟังก์ชั่น () {
initTable();
initShootPos();
showTips();
เริ่มเกม();
-
ฟังก์ชั่น startGame() {
initBall();
addEventHandler(ตาราง,"เมาส์มูฟ",dragCueBall);
addEventHandler(ตาราง,"เมาส์อัพ",setCueBall);
-
ฟังก์ชัน initTable() {
ตาราง = $("ตาราง");
var dotWrapDiv = document.createElement("div"),
guideBallDiv = document.createElement("div");
dotWrapDiv.id = "dotWrap";
guideBallDiv.className = "บอลนำทาง";
setStyle(guideBallDiv,"display", "ไม่มี");
dotWrap = table.appendChild(dotWrapDiv);
guideBall = table.appendChild(guideBallDiv);
-
ฟังก์ชั่น initBall() {
//เพิ่มคิวบอล
คิวบอล = บอลใหม่("คิว",170,H/2);
ball.push(คิวบอล);
//เพิ่มบอลเป้าหมาย
สำหรับ (var i = 0; i < 5; i ++) {
สำหรับ (var j = 0; j <= i; j++) {
var ball = บอลใหม่ ("เป้าหมาย",520 + i*2*R, H/2 - R*i + j*2*R);
ลูกดัน(บอล);
-
-
-
ฟังก์ชั่น initShootPos() {
var wrap = $("shootPos"),
ตัวจัดการ = $("จุด"),
ลูกศรR = 18;
addEventHandler(wrap,"mousedown",selectDot);
ฟังก์ชั่น selectDot (e) {
e = e ||. เหตุการณ์;
var pos = getElemPos(ห่อ)
x = e.clientX - pos[0] - handler.offsetWidth/2,
y = e.clientY - pos[1] - handler.offsetHeight/2;
if(Math.sqrt((x-22)*(x-22) + (y-22)*(y-22)) > ลูกศรR) {
มุม var = Math.atan2(x-22,y-22);
x = arrowR*Math.sin(มุม) + 22;
y = arrowR*Math.cos(มุม) + 22;
-
setPos(ตัวจัดการ,x,y);
-
-
ฟังก์ชั่น getElemPos (เป้าหมาย, การอ้างอิง) {
อ้างอิง = อ้างอิง ||. เอกสาร;
var ซ้าย = 0, บน = 0;
กลับ getPos (เป้าหมาย);
ฟังก์ชั่น getPos (เป้าหมาย) {
ถ้า (เป้าหมาย != อ้างอิง) {
ซ้าย += target.offsetLeft;
ด้านบน += target.offsetTop;
กลับ getPos (target.parentNode);
} อื่น {
กลับ [ซ้าย,บน];
-
-
-
//คลาสบอล
ฟังก์ชั่นบอล (ประเภท, x, y) {
var div = document.createElement("div");
div.className = พิมพ์ + "บอล";
this.elem = table.appendChild(div);
this.type=ประเภท;
this.x = x; //ตำแหน่ง
นี่.y = y;
this.angle = 0; //มุม
this.v = 0; //ความเร็ว (ไม่รวมทิศทาง)
setBallPos(this.elem,x,y);
คืนสิ่งนี้;
-
ฟังก์ชั่น setCueBall() {
RemoveEventHandler(ตาราง,"mousemove",dragCueBall);
RemoveEventHandler(ตาราง,"เมาส์อัพ",setCueBall);
startShot();
-
ฟังก์ชั่น startShot() {
แสดง (cueBall.elem);
addEventHandler(ตาราง,"เมาส์มูฟ",showGuide);
addEventHandler(ตาราง,"เมาส์ดาวน์",updateForce);
addEventHandler(ตาราง,"เมาส์อัพ",shotCueBall);
-
ฟังก์ชั่น DragCueBall(e) {
var toX,toY;
e = e ||. เหตุการณ์;
toX = e.clientX - table.offsetLeft - ความหนา
toY = e.clientY - table.offsetTop - ความหนา;
toX = toX >= R ? toX : R;
toX = toX <= 170 ? toX : 170;
toY = toY >= R ? toY : R;
toY = toY <= H - R ? toY : H - R;
setBallPos(คิวบอล,toX,toY);
-
ฟังก์ชั่น shotCueBall() {
RemoveEventHandler(ตาราง,"mousemove",showGuide);
RemoveEventHandler(ตาราง,"เมาส์ดาวน์",updateForce);
RemoveEventHandler(ตาราง,"เมาส์อัพ",shotCueBall);
window.clearInterval (forceTimer);
ความเร็ว = $("แรง").offsetWidth * 0.15;
var dotDisX = $("จุด").offsetLeft-22,
dotDisY = $("จุด").offsetTop-22,
dotDis = Math.sqrt(dotDisX*dotDisX + dotDisY*dotDisY)
dotAngle = Math.atan2(dotDisX,dotDisY);
rollRight = Math.round(dotDis*Math.sin(dotAngle))/5;
rollUp = -Math.round(dotDis*Math.cos(dotAngle))/5;
var formPos = getBallPos(cueBall.elem)
toPos = getBallPos(ไกด์บอล)
มุม = Math.atan2(toPos[0] - formPos[0],toPos[1] - formPos[1]);
ซ่อน(dotWrap);
ซ่อน(ไกด์บอล);
cueBall.v = ความเร็ว;
cueBall.angle = มุม;
movingBalls.push(คิวบอล);
จับเวลา = window.setInterval (ม้วน, 1,000 / อัตรา);
-
ฟังก์ชั่น showGuide(e) {
มาจาก X, fromY, toX, toY;
e = e ||. เหตุการณ์;
toX = e.clientX - table.offsetLeft - ความหนา
toY = e.clientY - table.offsetTop - ความหนา;
setBallPos (ไกด์บอล, toX, toY);
แสดง (dotWrap);
แสดง (ไกด์บอล);
วาดเส้น();
//บรรทัดอ้างอิง
ฟังก์ชั่น DrawLine() {
var dotNum = 16,
pos = getBallPos(คิวบอล.เอเลม);
dotWrap.innerHTML = "";
จากX = ตำแหน่ง[0];
จาก Y = ตำแหน่ง [1];
var partX = (toX - fromX) / dotNum,
ปาร์ตี้ = (toY - fromY) / dotNum;
สำหรับ (var i = 1; i < dotNum; i++) {
var x = จากX + partX * i,
y = จาก Y + ปาร์ตี้ Y * i;
DrawDot(dotWrap, x, y);
-
-
-
ฟังก์ชั่นม้วน () {
ถ้า (movingBalls.length <= 0) {
ถ้า (! hasShot) ช็อต = 0;
ช็อตอื่น ++; // คอมโบสะสม
hasShot = เท็จ;
setStyle($("แรง"),"ความกว้าง",80+"px");
setPos($("จุด"),22,22);
window.clearInterval (จับเวลา);
if(shots > 1) showScore(shots); //แสดงจำนวนคอมโบ
startShot();
-
สำหรับ (var i = 0; i <movingBalls.length; i++) {
var ball = ค่าเฉลี่ยบอล[i]
บาป = Math.sin (ball.angle)
cos = Math.cos(บอล.มุม);
บอล.v -= F;
// ถอดลูกบอลที่อยู่นิ่งออก
ถ้า (Math.round (ball.v) == 0) {
บอล.v = 0;
movingBalls.remove(ผม);
ดำเนินการต่อ;
-
var vx = ball.v * บาป
vy = ball.v * cos;
ball.x += vx;
ball.y += วี;
//เอามันใส่กระเป๋า.
ถ้า (isPocket (ball.x, ball.y)) {
ซ่อน(ball.elem);
ถ้า (ball.type == "คิว") {
ถ้า (! hasShot) ช็อต = 0;
hasShot = เท็จ;
window.setTimeout(ฟังก์ชั่น(){
บอล.v = 0;
setBallPos(บอล,170,250);
},500);
}อื่น {
//เอาลูกบอลที่บรรจุถุงออก
hasShot = จริง;
บอล.v = 0;
สำหรับ (var k = 0, l =0; k < ball.length; k++) {
ถ้า (ลูก [k] != ลูก) {
ลูกบอล[l++] = ลูกบอล[k];
-
-
ลูกบอลความยาว -= 1;
-
กลับ;
-
//การชนกันของขอบ
ถ้า (ball.x < R || ball.x > W - R) {
บอล.มุม *= -1;
ball.angle %= Math.PI;
ball.v = ball.v * (1 - สูญเสีย);
vx = ball.v*Math.sin(บอล.มุม);
vy = ball.v*Math.cos(บอล.มุม);
ถ้า(ball.x < R) ball.x = R;
ถ้า (ball.x > W - R) ball.x = W - R;
//ยัดลูกคิว
ถ้า (ball.type == "คิว") {
ถ้า (ball.angle > 0) vy -= rollRight;
อย่างอื่น vy += rollRight;
vx += โรลอัพ;
สะสม *= 0.2;
ม้วนขวา *= 0.2;
ball.v = Math.sqrt(vx*vx + vy*vy);
ball.angle = Math.atan2(vx,vy);
-
-
ถ้า (ball.y < R || ball.y > H - R) {
ball.angle = ball.angle > 0 ? Math.PI - ball.angle : - Math.PI - ball.angle ;
ball.angle %= Math.PI;
ball.v = ball.v * (1 - สูญเสีย);
vx = ball.v*Math.sin(บอล.มุม);
vy = ball.v*Math.cos(บอล.มุม);
ถ้า(ball.y < R) ball.y = R;
ถ้า (ball.y > H - R) ball.y = H - R;
//ยัดลูกคิว
ถ้า (ball.type == "คิว") {
if(Math.abs(ball.angle) < Math.PI/2) vx += rollRight;
อื่น vx -= rollRight;
vy += โรลอัพ;
สะสม *= 0.2;
ม้วนขวา *= 0.2;
ball.v = Math.sqrt(vx*vx + vy*vy);
ball.angle = Math.atan2(vx,vy);
-
-
//ลูกบอลชนกัน
สำหรับ (var j = 0; j < Balls.length; j ++) {
var obj = ลูกบอล[j];
ถ้า (obj == ball) ดำเนินการต่อ;
var disX = obj.x - ball.x,
disY = obj.y - ball.y,
ช่องว่าง = 2 * R;
ถ้า (disX <= ช่องว่าง && disY <= ช่องว่าง) {
var dis = Math.sqrt(Math.pow(disX,2)+Math.pow(disY,2));
ถ้า (dis <= ช่องว่าง) {
//ถ้ามันอยู่กับที่ ให้เพิ่มเข้าไปในอาเรย์ movingBalls
ถ้า (Math.round (obj.v) == 0)
movingBalls.push(obj);
//หมุนพิกัดไปที่แกน x เพื่อคำนวณการชนกัน
// คำนวณค่ามุมและไซน์และโคไซน์ - ค่าที่แน่นอน
//var c = (obj.x*ball.y - obj.y*ball.x)/(2*R)
// d = Math.sqrt(ball.x*ball.x + ball.y*ball.y)
// มุม = Math.asin(ball.y/d) - Math.asin(c/d) - ball.angle%(Math.PI/2)
//มุม = Math.asin(oy / (2 * R)),
//คืนสถานะแทนเจนต์ของลูกบอลทั้งสองลูก - ค่าโดยประมาณ
ball.x -= (ช่องว่าง - dis) * บาป;
ball.y -= (ช่องว่าง - dis)*cos;
disX = obj.x - ball.x;
disY = obj.y - ball.y;
// คำนวณค่ามุมและไซน์และโคไซน์
มุม var = Math.atan2 (disY, disX)
hitsin = Math.sin (มุม)
hitcos = Math.cos (มุม)
objVx = obj.v * Math.sin (obj.angle)
objVy = obj.v * Math.cos (obj.angle);
//ติดตาม(มุม*180/Math.PI);
// หมุนพิกัด
วาร์ x1 = 0,
y1 = 0,
x2 = disX * hitcos + disY * hitsin
y2 = disY * hitcos - disX * hitsin
vx1 = vx * hitcos + vy * hitsin
vy1 = vy * hitcos - vx * ฮิตซิน
vx2 = objVx * hitcos + objVy * hitsin,
vy2 = objVy * hitcos - objVx * hitsin;
// ความเร็วและตำแหน่งหลังการชน
วาร์ plusVx = vx1 - vx2;
กx1 = กx2;
vx2 = plusVx + vx1;
//ยัดลูกคิว
ถ้า (ball.type == "คิว") {
vx1 += สะสม;
สะสม *= 0.2;
-
x1 += vx1;
x2 += vx2;
// หมุนตำแหน่งกลับ
var x1Final = x1 * hitcos - y1 * hitsin,
y1Final = y1 * hitcos + x1 * hitsin,
x2Final = x2 * hitcos - y2 * hitsin,
y2Final = y2 * hitcos + x2 * hitsin;
obj.x = ball.x + x2Final;
obj.y = ball.y + y2Final;
ball.x = ball.x + x1Final;
ball.y = ball.y + y1Final;
//หมุนความเร็วกลับ
vx = vx1 * hitcos - vy1 * hitsin;
vy = vy1 * hitcos + vx1 * ฮิตซิน;
objVx = vx2 * hitcos - vy2 * hitsin;
objVy = vy2 * hitcos + vx2 * hitsin;
//ความเร็วสุดท้าย
ball.v = Math.sqrt(vx*vx + vy*vy) * (1 - 0);
obj.v = Math.sqrt(objVx*objVx + objVy*objVy) * (1 - 0);
// คำนวณมุม
ball.angle = Math.atan2(vx, vy);
obj.angle = Math.atan2(objVx , objVy);
//หยุดพัก;
-
-
-
setBallPos (บอล, ball.x, ball.y);
-
-
ฟังก์ชั่น isPocket(x,y) {
if(y < POKER) ส่งคืนเช็ค (0,2);
อย่างอื่นถ้า (y > H - POKER) ส่งคืนเช็ค (3,5);
มิฉะนั้นจะส่งคืนเท็จ
ตรวจสอบฟังก์ชัน (m,n) {
สำหรับ (var i=m; i<=n; i++) {
ถ้า(x >= โผล่[i][0] - โป๊กเกอร์ && x <= โผล่[i][0] + โป๊กเกอร์) {
var dis = Math.sqrt(Math.pow(x - pokes[i][0],2) + Math.pow(y - pokes[i][1],2));
if(dis <= POKER) ให้คืนค่าเป็นจริง;
มิฉะนั้นจะส่งคืนเท็จ
-
-
-
-
ฟังก์ชั่น getBallPos (obj) {
var pos = [];
pos.push(obj.offsetLeft - ความหนา + TOTALR);
pos.push(obj.offsetTop - ความหนา + TOTALR);
ตำแหน่งส่งคืน;
-
ฟังก์ชั่น setPos (obj, x, y) {
obj.style.left = x + "px";
obj.style.top = y + "px";
-
ฟังก์ชั่น setBallPos (บอล, x, y) {
ถ้า (ball.constructor == บอล) {
บอล.x = x;
ball.y = y;
บอล = ball.elem;
-
setPos (บอล, x + ความหนา - TOTALR, y + ความหนา - TOTALR);
-
ฟังก์ชั่น DrawDot(ห่อ,x,y) {
องค์ประกอบ var = document.createElement("div");
setStyle(องค์ประกอบ,{
ตำแหน่ง: "สัมบูรณ์",
ความกว้าง: "1px",
ความสูง: "1px",
ขนาดตัวอักษร: "1px",
พื้นหลัง: "สีขาว"
-
setPos(องค์ประกอบ,x,y);
wrap.appendChild(องค์ประกอบ);
-
ฟังก์ชั่น updateForce() {
var obj = $("บังคับ"),
เลน = 80,
ขึ้น = จริง;
forceTimer = window.setInterval (อัพเดต, 10);
อัปเดตฟังก์ชัน () {
ถ้า (ขึ้น) setStyle (obj, "ความกว้าง", len +++ "px");
อย่างอื่น setStyle(obj,"width",len--+"px");
ถ้า (len > 136) ขึ้น = false;
ถ้า (เลน <= 0) ขึ้น = จริง;
-
-
ฟังก์ชั่น setStyle() {
ถ้า (arguments.length == 2 && ประเภทของข้อโต้แย้ง [1] == "วัตถุ") {
สำหรับ (คีย์ var ในข้อโต้แย้ง [1]) {
อาร์กิวเมนต์ [0] .style [คีย์] = อาร์กิวเมนต์ [1] [คีย์];
-
} อื่นถ้า (arguments.length > 2) {
อาร์กิวเมนต์[0].สไตล์[อาร์กิวเมนต์[1]] = อาร์กิวเมนต์[2];
-
-
ฟังก์ชั่นซ่อน (obj) {
setStyle(obj,"จอแสดงผล", "ไม่มี");
-
ฟังก์ชั่นแสดง (obj) {
setStyle(obj,"จอแสดงผล", "บล็อก");
-
//ข้อมูลที่ส่งออก
ติดตามฟังก์ชัน (sth ใคร) {
ใคร = ใคร ||. $("เคล็ดลับ");
ถ้า (document.all) who.innerText = sth;
อื่น who.textContent = sth;
ส่งกลับใคร;
-
ฟังก์ชั่น showScore (n) {
var wrap = $("กระดานคะแนน");
ติดตาม (n+ "ก้านสูบ", ห่อ);
จางหายไป(ห่อ);
-
ฟังก์ชั่น fadeIn (obj) {
มาจาก Y = 230,
posStep = [8,14,19,23,26,28,29,29,30,30,30],
โอปาสเต็ป = [0,0.05,0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.8],
จากโอปา = 0,
เสื้อ = 0,
ขั้นตอน = posStep.length,
inTimer = window.setInterval (showIn, 20)
ออกไทม์เมอร์;
ฟังก์ชั่น showIn() {
setOpacity(obj,opaStep[t]);
obj.style.top = fromY + posStep[t] + "px";
เสื้อ++;
ถ้า(t>=ขั้นตอน) {
window.clearInterval(inTimer);
outTimer = window.setInterval (เฟดเอาท์, 50);
-
-
ฟังก์ชั่น fadeOut() {
ที--;
setOpacity(obj,opaStep[t]);
obj.style.top = fromY + posStep[t] + "px";
ถ้า(t <= 0) {
window.clearInterval (หมดเวลา);
ซ่อน(obj);
-
-
-
ฟังก์ชั่น setOpacity (obj, n) {
obj.style.cssText = "filter:alpha(opacity="+ n*100 +"); -moz-opacity:"+ n +"; ความทึบ:"+ n;
-
ฟังก์ชั่น showTips() {
วาร์ i = 0;
เคล็ดลับ();
window.setInterval (ทิป 3000);
เคล็ดลับฟังก์ชัน () {
ติดตาม (เคล็ดลับ [i++]);
ถ้า(i >= เคล็ดลับ.ความยาว) i = 0;
-
-
</สคริปต์>
</หัว>
<ร่างกาย>
<div class="info">พูดคุย: <a href=" http://bbs.blueidea.com/thread-2951566-1-1.html"> Blueidea</a >   ; //cnwander.com/blog/?p=11"> พื้นที่ของ Wander</a></div>
<h1>คนจีนยืนขึ้น! <span class="sub">วันครบรอบ 60 ปี</span></h1>
<div id="ตาราง">
<div id="กระดานคะแนน"></div>
</div>
<div class="บอท">
<div id="เคล็ดลับ"></div>
<คลาส div = "ctrl">
<div id="บังคับ"></div>
<div id="shootPos">
<div id="จุด"></div>
</div>
</div>
</div>
</ร่างกาย>
</html>
แม้ว่าจะเป็นชื่อเทเบิลเทนนิสที่ไร้ยางอาย แต่จริง ๆ แล้วยังห่างไกลจากเทเบิลเทนนิสจริง ๆ และยังมีอีกหลายประเด็นที่ต้องปรับปรุง
ปัญหาเฉพาะที่ต้องแก้ไข:
จะมีปัญหาอื่นๆ อีกมากแน่นอน ฉันกังวลว่าจะฟุ้งซ่านเกินไปในช่วงวันหยุดและจะไม่สามารถดำเนินการต่อได้ในภายหลัง ฉันจะจัดการให้หมดภายในครั้งเดียว รีบหน่อยนะครับ ผมจะค่อย ๆ แก้ปัญหาทีหลังครับสำหรับนักศึกษาที่สนใจพูดคุยในหัวข้อนี้
คณิตศาสตร์ของวิทยาลัยโดยพื้นฐานแล้วเป็นเพียงพิธีการ และฉันลืมเรื่องฟิสิกส์และคณิตศาสตร์ในโรงเรียนมัธยมไปน้อยมาก เมื่อฉันเริ่มทำสิ่งต่างๆ ฉันจึงรู้ว่าฉันอ่อนแอเกินไปในด้านนี้ ฉันหวังว่านักเรียนที่มีประสบการณ์มากขึ้นในเรื่องนี้ พื้นที่จะให้คำแนะนำผมบ้าง