<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C語言實現井字棋遊戲的具體程式碼,供大家參考,具體內容如下
陣列是C語言中一種重要的資料型別,接下來我和大家分享用二維陣列完成一個井字棋遊戲。
井字棋,是一種在3*3格子上進行的連珠遊戲,和五子棋類似。遊戲需要的工具僅為紙和筆,然後由分別代表O和X的兩個遊戲者輪流在格子裡留下標記(一般來說先手者為X),任意三個標記形成一條直線,則為獲勝。
井字棋的規則想必大家都已非常清楚,下面來簡單梳理一下完成這個遊戲的主要思路
1、首先要定義棋盤變數為一個3*3的二維陣列
char board[3][3]。
2、用一個int型的變數來表示棋盤上棋子的個數,初始值為0
int numberOfPieces 。
3、用一個char型的變數來表示遊戲的贏家是誰(這是遊戲是否能夠繼續進行下去的關鍵),當該變數為' '時表示勝負未分,遊戲繼續;為' o '時表示電腦獲勝;為' x '時表示玩家獲勝;為' * '時表示玩家與電腦平手;初始值為' '
char winer
1、初始化棋盤,將棋盤上的每一個元素賦為' ';
2、列印棋盤;
3、玩家落子,棋盤上的棋子數加一;
需注意 (1)、判斷該位置是否已經有子;
(2)、判斷玩家落子位置是否出界;
4、列印棋盤;
5、判斷勝負,遊戲是否繼續;
需注意(1)、判斷所有行
(2)、判斷所有列
(3)、判斷所有對角線
6、判斷結果為勝負未分則繼續,否則告知玩家遊戲結果並結束遊戲;
7、電腦隨機落子(用亂數生成落子的座標)
需注意(1)、用亂數生成座標時棋子位置不能超界;
(2)、判斷該位置是否已經有子;
8、列印棋盤;
9、判斷勝負,同5;
10、判斷結果為勝負未分則回到步驟3,否則告知玩家遊戲結果並結束遊戲;
#define MAX_ROW 3 #define MAX_COLUMN 3 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> int menu(){ printf("----------------------------n"); printf("1.開始遊戲n"); printf("2.退出遊戲n"); printf("----------------------------n"); int choice = 0; scanf("%d", &choice); return choice; } //棋盤初始化,無落子 void initBoard(char newBoard[MAX_ROW][MAX_COLUMN]){ for (int row = 0; row < MAX_ROW; row++){ for (int col = 0; col < MAX_COLUMN; col++){ newBoard[row][col] = ' '; } } } void printBoard(char chessBoard[MAX_ROW][MAX_COLUMN]) { // 把棋盤列印出來. //for (int row = 0; row < MAX_ROW; row++) { // for (int col = 0; col < MAX_COL; col++) { // // 注意: 使用 %c 來列印字元 // printf("%c ", chessBoard[row][col]); // } // printf("n"); //} // 上面的程式碼雖然能夠列印出棋盤, 但是都是空格, 看不清. // 最好讓元素能有邊框 printf("+---+---+---+n"); for (int row = 0; row < MAX_ROW; row++) { printf("| %c | %c | %c |n", chessBoard[row][0], chessBoard[row][1], chessBoard[row][2]); printf("+---+---+---+n"); } } //玩家落子 void playerDo(char board[MAX_ROW][MAX_COLUMN], int* numberOfPieces){ int row = 0; int col = 0; while (1){ printf("請您落子(行 列) 注意:行列值均屬於[0,2]n"); scanf("%d %d", &row, &col); //判斷是否越界 if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COLUMN){ printf("您的子飛出棋盤,請重新落子n"); }//判斷玩家落子位置是否已經有子 else if (board[row][col] != ' '){ printf("您落子的位置已經有子,請重新落子n"); } else{ break; } } board[row][col] = 'x'; *numberOfPieces = *numberOfPieces + 1; printf("現在落子%d顆n", *numberOfPieces); } //電腦落子 void computerDo(char board[MAX_ROW][MAX_COLUMN], int* numberOfPieces){ printf("電腦落子n"); int row = 0; int col = 0; while (1){ row = rand() % 3; col = rand() % 3; if (board[row][col] == ' '){ //該位置無子 break; } } board[row][col] = 'o'; *numberOfPieces = *numberOfPieces + 1; } //判斷棋盤是否下滿,1表示下滿,0表示未下滿 int isfull(int numberOfPieces){ if (numberOfPieces == 9) return 1; else return 0; } //判斷勝負,返回值為'x'玩家贏,返回值為'o'電腦贏,返回值為'*'平手,返回值為' '繼續 char whoIsWiner(char board[MAX_ROW][MAX_COLUMN],int numberOfPieces){ //判斷所有行 for (int row = 0; row < MAX_ROW; row++){ if (board[row][0] != ' '&& board[row][0] == board[row][1] && board[row][1] == board[row][2]){ return board[row][0]; } } //判斷所有列 for (int col = 0; col < MAX_COLUMN; col++){ if (board[0][col] != ' '&& board[0][col] == board[1][col] && board[1][col] == board[2][col]){ return board[0][col]; } } //判斷所有對角線 if (board[1][1] != ' '&& board[1][1] == board[0][0] && board[2][2] == board[0][0]){ return board[0][0]; } if (board[1][1] != ' '&& board[0][2] == board[1][1] && board[1][1] == board[2][0]){ return board[1][1]; } //判斷棋盤是否下滿 if (isfull(numberOfPieces) == 0){ return ' '; } return '*'; } void game(){ char board[MAX_ROW][MAX_COLUMN]; char winer = ' '; 棋盤上棋子的個數,遊戲剛開始的時候棋盤上棋子的個數為0 int numberOfPieces = 0; printf("遊戲開始n"); //1.初始化棋盤 initBoard(board); //2.列印棋盤 printBoard(board); while (1){ //3.玩家落子(行,列),玩家的子用x表示 playerDo(board, &numberOfPieces); //4.列印棋盤 printBoard(board); //5.判斷勝負 //if (isFull(numberOfPieces) == 1){ // if (whoIsWiner(board) == 'o'){//電腦勝 // printf("你輸了n"); // return; // } // if (whoIsWiner(board) == 'x'){//玩家勝 // printf("你贏了n"); // return; // } // if (whoIsWiner(board) == '*'){//平手 // printf("你和電腦勢均力敵n"); // return; // } //} winer = whoIsWiner(board, numberOfPieces); if (winer != ' '){ break; } //6.電腦隨機落子,電腦的子用o表示 computerDo(board, &numberOfPieces); //7.列印棋盤 printBoard(board); //8.判斷勝負 winer = whoIsWiner(board, numberOfPieces); if (winer != ' '){ break; } //if (isFull(numberOfPieces) == 1){ // if (whoIsWiner(board) == 'o'){//電腦勝 // printf("你輸了n"); // return; // } // if (whoIsWiner(board) == 'x'){//玩家勝 // printf("你贏了n"); // return; // } // if (whoIsWiner(board) == '*'){//平手 // printf("你和電腦勢均力敵n"); // return; // } //} } if (winer == 'x'){ printf("你贏了n"); } if (winer == 'o'){ printf("你輸了n"); } if (winer == '*'){ printf("平手n"); } } int main(){ int chioce; srand((unsigned int)time(0)); while (1){ //選單,1.進行遊戲;2.退出遊戲 chioce = menu(); if (chioce == 1){ game(); break; } else if (chioce == 2){ printf("再見n"); break; } else{ printf("您的輸入有誤,請重新輸入n"); } } system("pause"); return 0; }
大家可以自己在電腦上敲一下這個程式碼,實現過程還是非常有意思的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援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