editor php Xinyi membawakan anda permainan simulasi Go yang ringkas tetapi menarik yang dipanggil "Masalah Concurrency". Permainan ini mengambil pengaturcaraan serentak sebagai temanya, membolehkan pemain mengalami daya tarikan pengaturcaraan serentak dalam dunia maya. Dalam permainan, pemain perlu menulis kod untuk mengendalikan pelaksanaan serentak pelbagai tugas dan menguji kebolehan pengaturcaraan serentak mereka. Antara muka permainan adalah ringkas dan jelas, dan operasinya mudah, sesuai untuk pemula untuk bermula, dan ia juga menyediakan pelbagai mod kesukaran dan cabaran untuk dipilih oleh pemain. Sama ada anda seorang pemula atau pembangun yang berpengalaman, anda boleh menikmati keseronokan pengaturcaraan serentak dalam permainan simulasi ini.
Saya seorang pelajar dari Poland dan semester ini saya memulakan kursus pengaturcaraan serentak (Go, Ada dan beberapa bahasa teori dan CSP pada masa hadapan). Sejujurnya, Golang kelihatan menarik tetapi saya agak keliru. Kesimpulannya ialah dalam pengalaman saya, saya akan memanggil diri saya seorang pengaturcara di bawah purata. Pada asasnya, tugas saya adalah untuk mencipta simulasi, yang akan saya huraikan seperti ini:
Terdapat grid n*m
Pengembara boleh dijana secara rawak, sehingga k pengembara, setiap pengembara mempunyai ID unik (1, 2, 3, dsb., sehingga k)
Secara rawak, jika ruang kosong (saya pasti ruang kosong ialah 0), pengembara boleh bergerak ke atas, kiri, kanan atau bawah pada grid
Juga mempunyai kamera yang kadangkala mencetak keadaan semasa mesh serta pergerakan terkini (belum dilaksanakan)
Secara tidak rasmi, saya pernah dengar saya patut menggunakan saluran, apa pun maksudnya
Idea saya adalah untuk mencipta struktur dengan id dan koordinat setiap pengembara dan menghantar id mereka ke saluran yang mewakili kesediaan untuk bergerak, dan kemudian saya akan memilih arah pergerakan secara rawak.
Saya agak keliru tentang concurrency - bukan sahaja jika dan di mana saya harus menggunakan wgs dan mutex, tetapi juga sebagai contoh jika saya pergi func(){} sekiranya gelung berada di dalam atau di luar. Saya amat berbesar hati untuk menghargai sebarang petua, bantuan atau pembetulan/idea untuk membetulkan kod saya kerana pada masa ini, seperti yang anda sangka, ia tidak berfungsi dengan betul (cth. apabila kamera mencetak grid, kadangkala terdapat lebih daripada k pengembara , di mana berbilang pengembara berkongsi nombor yang sama dan kadangkala mereka kelihatan hilang). Harap semua orang mempunyai hari yang hebat dan saya sangat menghargai sebarang bantuan :)
package main; import( "fmt" "os" "strconv" "math/rand" //"sync" "time" ) type traveler struct{ id int; x int; y int; } func main(){ //command line n, err := strconv.Atoi(os.Args[1]); m, err := strconv.Atoi(os.Args[2]); k, err := strconv.Atoi(os.Args[3]); if err != nil{ panic(err) return } //board var grid [][]int; grid = make([][]int, n) for i:=0; i<n; i++{ grid[i] = make([]int, m) } //array of travelers, channel for moves and id travelers := make([]traveler, k) no_of_travelers := 0; move := make(chan int, k); id := 1; //var wg sync.WaitGroup go camera(grid); go func() { for i:=0; i<len(travelers); i++ { if no_of_travelers<k{ travelers[i] = spawnTraveler(&id,grid); no_of_travelers++; } } }() go func() { for{ a:= rand.Intn(k); sendMoveTraveler(&travelers[a], move); } }() receiveMoveTraveler(travelers, move, grid); } func spawnTraveler(id *int, grid [][]int) traveler{ x:=-1; y:=-1; for{ x = rand.Intn(len(grid)); y = rand.Intn(len(grid)); if(grid[x][y]==0){ break; } } t := traveler{id: *id, x: x, y:y}; grid[x][y] = *id; *id++; return t; } func sendMoveTraveler(t *traveler, move chan int){ move <- t.id } func receiveMoveTraveler(travelers []traveler, move chan int, grid [][]int){ for{ id := <- move for i:=0; i<len(travelers); i++{ if travelers[i].id == id{ direction := rand.Intn(4); //1-left 2-up 3-right 4-down switch direction { case 0: if travelers[i].x>0 && grid[travelers[i].x-1][travelers[i].y] == 0{ grid[travelers[i].x-1][travelers[i].y] = grid[travelers[i].x][travelers[i].y]; grid[travelers[i].x][travelers[i].y] = 0; travelers[i].x = travelers[i].x-1; travelers[i].y = travelers[i].y; } case 1: if travelers[i].y>0 && grid[travelers[i].x][travelers[i].y-1] == 0{ grid[travelers[i].x][travelers[i].y-1] = grid[travelers[i].x][travelers[i].y]; grid[travelers[i].x][travelers[i].y] = 0; travelers[i].x = travelers[i].x; travelers[i].y = travelers[i].y-1; } case 2: if travelers[i].x<len(grid)-1 && grid[travelers[i].x+1][travelers[i].y] == 0{ grid[travelers[i].x+1][travelers[i].y] = grid[travelers[i].x][travelers[i].y]; grid[travelers[i].x][travelers[i].y] = 0; travelers[i].x = travelers[i].x+1; travelers[i].y = travelers[i].y; } case 3: if travelers[i].y<len(grid)-1 && grid[travelers[i].x][travelers[i].y+1] == 0{ grid[travelers[i].x][travelers[i].y+1] = grid[travelers[i].x][travelers[i].y]; grid[travelers[i].x][travelers[i].y] = 0; travelers[i].x = travelers[i].x; travelers[i].y = travelers[i].y+1; } } //fmt.Println("Ściagnalem ruch", travelers[i].id); } } } } func camera(grid [][]int){ for{ for i:=0; i<len(grid); i++{ for j:=0; j<len(grid); j++{ if grid[i][j]!= 0{ fmt.Printf("%02d ", grid[i][j]); } else{ fmt.Printf("-- "); } } fmt.Println(); } fmt.Println(); time.Sleep(time.Second * 3); } }
Saya agak terharu dengan semua idea - wg, mutex, atom, dll.
Bahawa dikatakan:
Atas ialah kandungan terperinci Simulasi Go yang mudah - isu konkurensi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!