C語言版三子棋游戲?qū)崿F(xiàn)代碼
本文實例為大家分享了C語言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
實現(xiàn)一個三子棋小游戲
下面是實現(xiàn)步驟:
總共有需要三個文件
第一,test.c
我們要在這個文件里面實現(xiàn)游戲的主體流程
第二,game.c
在這個文件里我們可以實現(xiàn)各個游戲函數(shù)的分裝
第三,game.h
在這個文件里我們實現(xiàn)的是各個函數(shù)的聲明
test.c
1、首先要有一個菜單
讓玩家可以做出選擇
2、接著對玩家做出的不同選擇進行實現(xiàn)
選1就是開始游戲,所以我們進入到game函數(shù)里就好了
選0就是退出游戲,
其他選擇的話就是選擇錯誤,重新選擇
這個我們可以用switch語句來實現(xiàn)
這里我們要先用的是do,while循環(huán),條件里放入我們要輸入的數(shù)
這樣的話如果輸入的數(shù)為0,即為假,正好會跳出循環(huán),后面接上return 0的話程序就結(jié)束了
所以我們先把以上所描述的功能寫出來
#include<stdio.h> #include"game.h" void menu() { printf("***********\n"); printf("***1play***\n"); printf("***0exit***\n"); printf("***********\n"); } int main() { menu(); int input = 0; do { printf("請選擇\n"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤,請重新選擇\n"); } }while(input); return 0; }
3、實現(xiàn)游戲函數(shù)的各個功能
我們要做的是三子棋,應(yīng)該先有一個棋盤
所以我們就可以用二維數(shù)組來創(chuàng)建這樣一個 3 * 3的棋盤
鑒于以后可能會想要不同行和列的棋盤
所以我們可以定義宏來表示數(shù)組的行和列,以后想要修改行數(shù)和列數(shù)也很方便
創(chuàng)建棋盤之后,我們要將棋盤里的元素進行初始化
接著還要打印出來呈現(xiàn)給玩家
然后就是下棋的過程,因為我們得不斷下到一方贏或者棋盤滿
所以我們可以用while循環(huán)來實現(xiàn)
接著就是
玩家下棋,展示棋盤,判斷輸贏
電腦下棋,展示棋盤,判斷輸贏
......
我們可以把以上功能表達出來
void game() { char board[ROW][COL];//宏的定義放在game.h里面 char ret = 0;//我們用ret這個變量去接收判斷輸贏的函數(shù)所返回的值 IntBoard(board, ROW, COL);//這些具體的函數(shù)都會分裝到game.c上面 DisplayBoard(board, ROW, COL); //創(chuàng)建和展示棋盤之后,就是不斷 下棋,展示,判斷的過程了 while(1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if(ret != 'C')//也就是指要么一方贏,要么棋盤滿,就應(yīng)該跳出循環(huán),不再繼續(xù)下棋了 break; //這兩步的區(qū)別就只是第一行而已 ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if(ret != 'C') break; } if(ret == '*') printf("玩家贏\n"); else if(ret == '#') printf("電腦贏\n"); else printf("平局\n"); }
game函數(shù)放在menu函數(shù)后面就好了
game.c
所以我們所需要分裝到game.c里的函數(shù)有:
初始化棋盤,打印棋盤,玩家下棋,電腦下棋,判斷輸贏
那么接下來我們就在game.c里實現(xiàn)上述函數(shù)的功能
初識化棋盤
我們利用for循環(huán)把里面的元素都初始化為空格
#include"game.h" void IntBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { board[i][j] = ' '; } } }
打印棋盤
這里要特別注意分割行的問題
void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { printf(" %c ", board[i][j]); if(j < col-1) printf("|");//每一列的每一個元素中間打印 | } printf("\n");//每列打印完打印分割行 if(i < row - 1) { for(j = 0; j < col; j++) { printf("---"); if(j < col - 1) printf("|"); } } printf("\n");//棋盤全都打印好之后打印分割行 } }
玩家下棋
這里的實現(xiàn)思路是:
1、判斷輸入的位置有無越界
2、有則提示,沒有則判斷有無棋子
3、有則提示,沒有則將該位置放入元素*
(因為玩家可能要連續(xù)輸入幾次,所以我們要用到while循環(huán))
void PlayerMove(char board[ROW][COL], int row, int col) { int x; int y; //玩家要輸入的行和列 while (1) { printf("請輸入坐標\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷有無越界 { if (board[x-1][y-1] == ' ')//判斷有無棋子 { board[x-1][y-1] = '*'; break;//輸入成功之后跳出循環(huán) } else printf("坐標被占用,請重新輸入\n"); } else printf("坐標非法,請重新輸入\n"); }
電腦下棋
這里的實現(xiàn)思路是:
1、生成隨機數(shù)(這個數(shù)值不能越界)
2、將該位置放入元素#,這里不需要判斷,因為本身就不需要輸入
void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; srand((unsigned int)time(NULL)); printf("電腦走\n"); while(1) { x = rand() % row;//生成隨機數(shù),這里就需要用到時間戳了,我們還要做test.c里面包含一個<time.h> y = rand() % col; if(board[x][y] == ' ') { board[x][y] = '#'; break; } } }
判斷輸贏
這里還要分為棋盤是否滿子和一方贏
是否滿子
實現(xiàn)思路:
這個比較簡單,我們只要依次查看棋盤,若有一個元素為空格,即為滿
然后注意一下返回值就好了
int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { if(board[i][j] == ' ') return 0; } } return 1; }
哪一方贏
實現(xiàn)思路:
根據(jù)規(guī)則,我們要判斷是否有三個相同的棋子連成直線
所以,每一行,每一列判斷一次,然后對角線再判斷兩次就好了
使用for循環(huán)和if語句來實現(xiàn)
char IsWin(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i = 0; i < row; i++)//先判斷行 { if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') return board[i][0]; } for(j = 0; j < col; j++)//再判斷列 { if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board != ' ') return board[0][i]; } //接著是兩次對角線 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') return board[1][1]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') return board[1][1]; //然后我們再這里直接調(diào)用IsFull函數(shù),就不用在game函數(shù)里調(diào)用了,而且返回值都能統(tǒng)一管理 if(IsFull(board, row, col)) { return 'Q'; } return 'C'; }
到這里我們的game.c文件的任務(wù)就完成了
game.h
然后我們還需要一個game.h文件來對函數(shù)進行聲明
#define _CRT_SECURE_NO_WARNINGS #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void IntBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); int IsFull(char board[ROW][COL], int row, int col);
好了,到了這里我們的三子棋小游戲就完成了!快去試試吧!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解
這篇文章主要介紹了js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-08-08