用C語(yǔ)言實(shí)現(xiàn)三子棋
本文實(shí)例為大家分享了用C語(yǔ)言實(shí)現(xiàn)三子棋的具體代碼,供大家參考,具體內(nèi)容如下
三子棋含義:
三子棋是黑白棋的一種。三子棋又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來,相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。但是,有很多時(shí)候會(huì)出現(xiàn)和棋的情況。圖例如下:
基本思路:
1.創(chuàng)建用戶交互菜單界面
2.初始化棋盤
3.顯示棋盤面板(為了不重復(fù)顯示棋盤,使用清屏操作)
4.用戶落子
5.判斷勝負(fù)
6.電腦隨機(jī)正確落子
7.判斷勝負(fù)
(在每次寫程序之前,可以向如下圖所示,寫出思路或偽代碼)
創(chuàng)建多文件項(xiàng)目:
寫代碼之前,首先建立三個(gè)文件,以方便后序代碼更加完整清晰地呈現(xiàn)。
1.創(chuàng)建用戶交互菜單界面
void Meau(){ printf("+------ meau ----------+\n"); printf("|---- 1.play --------|\n"); printf("|---- 0.quit --------|\n"); printf("+----------------------+\n"); }
2.初始化棋盤
使用宏定義,將棋盤中的內(nèi)容初始化為空。
static void InitBoard(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ board[i][j] = INIT; } } }
3.顯示棋盤面板
為了不重復(fù)顯示棋盤,使用清屏操作,使得每次現(xiàn)實(shí)的棋盤只有一張。
通過不斷調(diào)試,使得最終界面,與預(yù)期所需界面一致。
static void ShowBoard(char board[][COL],int row,int col){ system("cls");//清屏操作 printf(" "); for (int i = 0; i < col; i++){ printf(" %3d", i + 1); } printf("\n----------------\n"); for (int i = 0; i < row; i++){ printf("%-2d", i + 1); for (int j = 0; j < col; j++){ printf("| %c ", board[i][j]); } printf("\n----------------\n"); } }
4.用戶落子
落子只能落在為空的位置上,所以在落子前需要判空,若為空,則落子,否則提示重新落子。
static void PlayerMove(char board[][COL], int row, int col){ int x = 0; int y = 0; while (1){ printf("please enter your postion<x,y>: "); scanf("%d %d", &x, &y); if (x<1 || x>3 || y<1 || y>3){ printf("Postion Error!"); continue; } if (board[x - 1][y - 1] == INIT){ board[x - 1][y - 1] = WHITE; break; } else{ printf("Postion Is Not Empty!\n"); } } }
5.電腦隨機(jī)正確落子
使用隨機(jī)數(shù),在正確位置落子。
static void ComputerMove(char board[][COL], int row, int col){ while (1){ int x = rand() % row; int y = rand() % col; if (board[x][y] == INIT){ board[x][y] = BLACK; break; } } }
6.判斷勝負(fù)
static char IsEnd(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ if (board[i][0] == board[i][1] && \ board[i][1] == board[i][2] && \ board[i][0] != INIT){ return board[i][0]; } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && \ board[1][j] == board[2][j] && \ board[0][j] != INIT){ return board[0][j]; } } if (board[0][0] == board[1][1] && \ board[1][1] == board[2][2] && \ board[0][0] != INIT){ return board[0][0]; } if(board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != INIT){ return board[1][1]; } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == INIT); return NEXT; } } return DRAW; }
7.創(chuàng)建Game界面
void Game() { char board[ROW][COL]; InitBoard(board, ROW, COL); srand((unsigned long)time(NULL)); char result = 0; while (1){ ShowBoard(board, ROW, COL); PlayerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } ShowBoard(board, ROW, COL); ComputerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } } ShowBoard(board, ROW, COL); switch (result){ case WHITE: printf("You win!\n"); break; case BLACK: printf("you lose!\n"); break; case DRAW: printf("it ends in a draw\n"); break; defult: printf("bug\n"); break; } }
完整代碼
//main.c文件 #include"game.h" void Meau(){ printf("+------ meau ----------+\n"); printf("|---- 1.play --------|\n"); printf("|---- 0.quit --------|\n"); printf("+----------------------+\n"); } int main(){ int select = 0; int quit = 0; while (!quit) { Meau(); printf("please enter your choose: "); scanf("%d", &select); switch (select) { case 1: Game(); break; case 0: quit = 1; break; defult: printf("Select error!Try again!\n"); break; } } printf("byebye!\n"); system("pause"); return 0; } //game.c 文件 #include"game.h" static void InitBoard(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ board[i][j] = INIT; } } } static void ShowBoard(char board[][COL],int row,int col){ system("cls"); printf(" "); for (int i = 0; i < col; i++){ printf(" %3d", i + 1); } printf("\n----------------\n"); for (int i = 0; i < row; i++){ printf("%-2d", i + 1); for (int j = 0; j < col; j++){ printf("| %c ", board[i][j]); } printf("\n----------------\n"); } } static char IsEnd(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ if (board[i][0] == board[i][1] && \ board[i][1] == board[i][2] && \ board[i][0] != INIT){ return board[i][0]; } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && \ board[1][j] == board[2][j] && \ board[0][j] != INIT){ return board[0][j]; } } if (board[0][0] == board[1][1] && \ board[1][1] == board[2][2] && \ board[0][0] != INIT){ return board[0][0]; } if(board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != INIT){ return board[1][1]; } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == INIT); return NEXT; } } return DRAW; } static void PlayerMove(char board[][COL], int row, int col){ int x = 0; int y = 0; while (1){ printf("please enter your postion<x,y>: "); scanf("%d %d", &x, &y); if (x<1 || x>3 || y<1 || y>3){ printf("Postion Error!"); continue; } if (board[x - 1][y - 1] == INIT){ board[x - 1][y - 1] = WHITE; break; } else{ printf("Postion Is Not Empty!\n"); } } } static void ComputerMove(char board[][COL], int row, int col){ while (1){ int x = rand() % row; int y = rand() % col; if (board[x][y] == INIT){ board[x][y] = BLACK; break; } } } void Game() { char board[ROW][COL]; InitBoard(board, ROW, COL); srand((unsigned long)time(NULL)); char result = 0; while (1){ ShowBoard(board, ROW, COL); PlayerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } ShowBoard(board, ROW, COL); ComputerMove(board, ROW, COL); result = IsEnd(board, ROW, COL); if (result != NEXT){ break; } } ShowBoard(board, ROW, COL); switch (result){ case WHITE: printf("You win!\n"); break; case BLACK: printf("you lose!\n"); break; case DRAW: printf("it ends in a draw\n"); break; defult: printf("bug\n"); break; } } //game.h文件 #ifndef __GAME_H__ #define __GAME_H__ #include<stdio.h> #include <time.h> #include <stdlib.h> #include<windows.h> #pragma warning(disable:4996) #define ROW 3 #define COL 3 #define INIT ' ' #define WHITE 'X'//player #define BLACK 'O'//computer #define DRAW 'D' #define NEXT 'N' extern void Game(); #endif
代碼結(jié)果顯示
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用C語(yǔ)言實(shí)現(xiàn)字符串左旋和右旋問題
這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)字符串左旋和右旋問題,需要的朋友可以參考下2018-07-07C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,可以自動(dòng)展開,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)頁(yè)面置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C語(yǔ)言實(shí)現(xiàn)雙人貪吃蛇游戲?qū)嵗a
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)雙人貪吃蛇游戲?qū)嵗a,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C++ map與set封裝實(shí)現(xiàn)過程講解
set set是一種關(guān)聯(lián)式容器,下面這篇文章主要給大家介紹了關(guān)于C++中map和set使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03C語(yǔ)言動(dòng)態(tài)順序表實(shí)例代碼
大家好,本篇文章主要講的是C語(yǔ)言動(dòng)態(tài)順序表實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C語(yǔ)言實(shí)現(xiàn)停車場(chǎng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)停車場(chǎng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03