<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現五子棋遊戲的具體程式碼,供大家參考,具體內容如下
1、鞏固和加深對c語言知識的理解
2、學會使用編譯器的各種偵錯
3、提高解決實際問題的能力
實現簡單的人人對戰五子棋,此設計用的是C語言去實現
採用二位陣列儲存棋盤資訊,棋盤上面的任何一個位置,裡頭可以放三個資訊:
1、空
2、使用者1的落子
3、使用者2的落子
下棋就是在二維陣列種找對應的空位置,進行落子,落完之後立即就要判斷落子位置是否有五字連珠,從而判斷誰數輸誰贏。每走一次棋會有四種情況:
*使用者1贏
*使用者2贏
*平局(這裡說的平局是棋盤被佔滿的情況)
*沒有出結果 意思就是時此使用者沒贏 下個用繼續去下棋
檔名 作用
five_chress.h 五子棋的函數宣告,標頭檔案宣告等
five_chress.c 五子棋函數介面的實現
main.c 五子棋函數測試功能
1、five_chress.h
#pragma once #include <stdio.h> #include <string.h> #include<Windows.h> #define ROW 10//陣列號行號 按需求調整 #define COL 10//陣列列數 按需求調整 #define PLAYER1 1//玩家編號,預設棋盤資料是0,玩家1落子,該位置被改成1 #define PLAYER2 2//玩家編號,預設棋盤資料是0,玩家2落子,該位置被改成2 #define NEXT 0//遊戲繼續 #define PLAYER1_WIN 1//玩家1贏 #define PLAYER2_WIN 2//玩家2贏 #define DRAW 3//平局 enum Dir{ LEFT, RIGHT, UP, DOWN, LEFT_UP, LEFT_DOWN, RIGHT_UP, RIGHT_DOWN };//用列舉去表示4個方向,上下,左右,左上右下,右上左下,統計使用者當前棋子四個方向的棋數是否為大於等於5 void Menu();//實現選單 void Game();//構建遊戲入口Game()函數
2、five_chress.c
#include "five_chress.h" int x = 0; int y = 0; void Menu() { printf("############################n"); printf("## 1. Play 0. Exit ##n"); printf("############################n"); printf("Please Select# "); } //按照x,y作為起點,按照特定的方向,求連續相對的最大格式 int ChessCount(int board[][COL], int row, int col, enum Dir d) { int _x = x - 1; //從1 int _y = y - 1; //從1 int count = 0; while (1){ switch (d){ case LEFT://從當前位置向左移動統計 橫座標不變 縱座標變了 所以是y-- _y--; break; case RIGHT://從當前位置向右移動統計 橫座標不變 縱座標變了 所以是_y++ _y++; break; case UP://從當前位置向上移動統計 縱座標不變 橫座標變了 所以是_x-- _x--; break; case DOWN://從當前位置向下移動統計 縱座標不變 橫座標變了 所以是_x++ _x++; break; case LEFT_UP://從當前位置向左上移動統計 縱,橫變都變了 所以是_x--,_y-- _x--, _y--; break; case LEFT_DOWN://從當前位置左下移動統計 縱,橫座標都變了 所以是_x++,_y-- _x++, _y--; break; case RIGHT_UP://從當前位置右上移動統計 縱,橫座標都變了 所以是_x--,_y++- _x--, _y++; break; case RIGHT_DOWN://從當前位置右下移動統計 縱,橫座標都變了 所以是_x++,_y++ _x++, _y++; break; default: //Do Nothing break; } if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1){ break;/表示越界了就停止 } //合法 if (board[x - 1][y - 1] == board[_x][_y]){ count++;//統計從舊位置出發統計和他一樣的個數 } else{ break;//如果碰到不一樣的就終止迴圈 } } return count;//返回統計個數 } //4種情況 //NEXT:表明要繼續 //PLAYER1_WIN: 使用者1贏了 //PLAYER2_WIN:使用者2贏了 //DRAW: 平局 int IsOver(int board[][COL], int row, int col) { int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1; //? int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1; //? int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1; //? int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP) + 1; //? if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5){ //有五子連珠 //一定有人贏 //x, y if (board[x - 1][y - 1] == PLAYER1){ return PLAYER1_WIN; } else{ return PLAYER2_WIN; } } int i = 0; for (; i < row; i++){ int j = 0; for (; j < col; j++){ if (board[i][j] == 0){ return NEXT;//當前位置還沒有被填寫棋盤不滿 當前使用者沒有贏返回next 讓下個使用者繼續下 } } } return DRAW;//最後一種情況棋盤滿了 為平局 } void ShowBoard(int board[][COL], int row, int col) { //printf("e[1;1He[2J");這是linux環境下用的清屏 //講陣列內容,進行視覺化 system("cls");//vs環境下用的清屏 int i = 0; for (i=1; i <= col; i++){ printf("%3d", i); } printf("n"); for (i = 0; i < row; i++){ int j = 0; printf("%2d",i + 1 ); for (; j < col; j++){ if (board[i][j] == 0){ printf(" . "); } else if (board[i][j] == PLAYER1){ printf(" x "); } else{ printf (" y "); } } printf("n"); } } void PlayerMove(int board[][COL], int row, int col, int who) { while (1){ printf("Player[%d] Please Enter Your Pos# ", who); scanf("%d %d", &x, &y); if (x < 1 || x > row || y < 1 || y > col){ printf("Pos Is Not Right!n"); continue; } else if (board[x - 1][y - 1] != 0){ printf("Pos Is Occupied!n"); continue; } else{ //合法性,去重 board[x - 1][y - 1] = who; break; } } } void Game() { int board[ROW][COL]; memset(board, 0, sizeof(board)); int result = NEXT; do{ ShowBoard(board, ROW, COL);//顯示棋盤 PlayerMove(board, ROW, COL, PLAYER1);//Player1先走 result = IsOver(board, ROW, COL);//判斷遊戲是否結束 if (NEXT != result){ break;//如果返回值不等於NEXT就跳出迴圈 說明當前使用者贏了或者平局 如果=NEXT 下個使用者繼續下 } ShowBoard(board, ROW, COL);//同上 PlayerMove(board, ROW, COL, PLAYER2); result = IsOver(board, ROW, COL); if (NEXT != result){ break; } } while (1); //p1 win, p2 win, draw switch (result){ case PLAYER1_WIN: ShowBoard(board, ROW, COL); printf("恭喜使用者1,你已經贏了!n"); break; case PLAYER2_WIN: printf("恭喜使用者2,你已經贏了!n"); break; case DRAW: printf("平局n"); break; default: //do nothing! break; } }
分析:
我們要先構建遊戲入口void game()函數在裡面構建上層本呼叫框架 例如一開始初始化陣列把每個位置都置為0,然後構建呼叫框架:
1、我們要儲存二位陣列並視覺化 就要構建ShowBoard函數;
2、之後 我們要讓使用者下棋 就要構建PlayerMove()函數
3、第一個使用者下完之後就要立馬判斷當前使用者是否贏,因為落子和判定是強相關的 這時候要構建 IsOver()函數
如果此使用者沒贏 那二個使用者繼續下。
當我們這些函數邏輯都明確好的時候 就用分而治之思想 ,實現他們的功能。
* 1、ShowBoard()函數裡面我用到了一個c語言裡面的清屏函數printf(“cls”);引上標頭檔案window.h,這個的作用是在固定地方重新整理檢視,把上次的檢視清理掉 ,顯示當前位置檢視。
後面就列印檢視的內容。使用者一和使用者二可以用字元表示,也可以用圓圈圖案表示這個圖案可以在網上找複製一下就可
*2、 Playermove()函數讓使用者下棋,裡面先考慮它的合法性 ,不能越界和重複,再然後用我們在five_chrsss.h檔案定義宏來賦值 ,賦完之後再終止迴圈。
*3、 Isover()函數裡面是讓我們判斷誰輸誰贏 換句話遊戲是否結束。遊戲結束標誌是分為四種情況。使用者一贏,使用者二贏,平局,繼續。前兩種情況則需要判斷從當前位置出發 沿四個方向當前使用者棋的個數是否為大於等於5,在判斷一下是哪個使用者的棋 就返回哪個使用者。 而這判斷需要在構建並呼叫ChressCount()函數去統計當前使用者的個數是否大於等於5,有4個方向,例如上和下為一個方向,左和右為一個方向,左上和右下為一個方向,右上和左下為一個方向,分別各自相加之後在加上1就是當前的棋,如果滿足這個4個方向大於等於5的一個條件,我們就能知道一定有人贏,否則在繼續判斷周圍是否有
空位置,有則返回NEXT讓下個使用者繼續下,沒有則返回平局*ChressCoun()函數具體分析請看程式碼塊
這些函數實現完之後再在Game()函數裡面來個Switch迴圈,來結收宏 去列印誰贏 還是平局。
3、main.c
#include "five_chress.h" int main() { int quit = 0; int select = 0; while (!quit){ Menu(); scanf("%d", &select); switch (select){ case 1: Game(); break; case 0: quit = 1; printf("ByeBye!n"); break; default: printf("Enter Error, Try Again!n"); break; } } return 0; }
main函數作為測試入口,相比較裡面的邏輯是很簡單的,建立一個選單函數和呼叫一個Game函數,再增添點其他的內容。
實現五子棋給我最大的體會是應用比理論學習難得多,首先要邏輯清楚,也會涉及到各種實際問題,但是加深了我對知識的理解和運用,也知道了只有多練習 多寫程式碼才能更好的提升程式設計技術。同時我也學到了實現一個複雜的專案時,先去構建一個框架,一個清晰的邏輯。再去逐個擊破每個問題,要學會用分而治之的思想去解決問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45