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、接著對玩家做出的不同選擇進(jìn)行實現(xiàn)
選1就是開始游戲,所以我們進(jìn)入到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)建棋盤之后,我們要將棋盤里的元素進(jìn)行初始化
接著還要打印出來呈現(xiàn)給玩家
然后就是下棋的過程,因為我們得不斷下到一方贏或者棋盤滿
所以我們可以用while循環(huán)來實現(xiàn)
接著就是
玩家下棋,展示棋盤,判斷輸贏
電腦下棋,展示棋盤,判斷輸贏
......
我們可以把以上功能表達(dá)出來
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("請輸入坐標(biāo)\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("坐標(biāo)被占用,請重新輸入\n");
}
else
printf("坐標(biāo)非法,請重新輸入\n");
}
電腦下棋
這里的實現(xiàn)思路是:
1、生成隨機(jī)數(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("電腦走\(yùn)n");
while(1)
{
x = rand() % row;//生成隨機(jī)數(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ù)進(jìn)行聲明
#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é)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進(jìn)行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10
舉例分析private的作用(c/c++學(xué)習(xí))
我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來,但是還是搞不懂private該怎么用,或者說在一個具體程序中,private有什么用2020-08-08
JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解
這篇文章主要介紹了js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-08-08

