C語言實(shí)現(xiàn)簡單的五子棋小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
我們需要一個二維數(shù)組去儲存當(dāng)前的棋盤狀態(tài),然后打印出來。
我們游戲的邏輯是初始化棋盤,打印棋盤,人下棋,打印棋盤,判斷是否游戲結(jié)束,電腦下棋,打印棋盤,判斷是否游戲結(jié)束,然后回到人下棋過程,結(jié)束游戲后,判斷誰贏誰輸還是平局。
判斷輸贏的邏輯是遍歷行,遍歷列,遍歷主對角線,遍歷反對角線,如果都判斷不出輸贏,那么就繼續(xù)游戲。
game.h
#include <stdio.h> #include <stdlib.h> #include <time.h> ? //棋盤大小 #define ROW 10 #define COL 10 ? //初始化 void InitBoard(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);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
?
#include "game.h"
?
void InitBoard(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;
?? ?for (i = 0; i < row; i++)
?? ?{
?? ??? ?//1.打印一行的數(shù)據(jù)?
?? ??? ?int j = 0;
?? ??? ?for (j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?printf(" %c ", board[i][j]);
?? ??? ??? ?if (j < col - 1)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("|");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?printf("\n");
?? ??? ?//2.打印分割行
?? ??? ?if (i < row - 1)
?? ??? ?{
?? ??? ??? ?for (j = 0; j < col; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?printf("---");
?? ??? ??? ??? ?if (j < col - 1)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?printf("|");
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?printf("\n");
?? ??? ?}
?? ?}
}
?
void PlayerMove(char board[ROW][COL], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?printf("玩家下棋:>\n");
?? ?while (1)
?? ?{
?? ??? ?printf("請輸入要下的坐標(biāo):>");
?? ??? ?scanf("%d%d", &x, &y);
?? ??? ?//判斷x,y坐標(biāo)的合法性
?? ??? ?if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
?? ??? ?{
?? ??? ??? ?if (board[x - 1][y - 1] == ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?board[x - 1][y - 1] = '*';
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?printf("該坐標(biāo)被占用\n");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("坐標(biāo)非法,請重新輸入:\n");
?? ??? ?} ? ? ??
?? ?}
}
?
void ComputerMove(char board[ROW][COL], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?printf("電腦下棋:>\n");
?? ?while (1)
?? ?{
?? ??? ?x = rand() % row;
?? ??? ?y = rand() % col;
?? ??? ?if (board[x][y] == ' ')
?? ??? ?{
?? ??? ??? ?board[x][y] = '#';
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?
?? ?}
}
?
//返回1表示棋盤滿了
//返回0表示棋盤沒滿
static 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;//滿了
}
?
char IsWin(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 - 4; j++)
?? ??? ?{
?? ??? ??? ?if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2]?
?? ??? ??? ??? ?&& board[i][j + 2] == board[i][j + 3] && board[i][j + 3] == board[i][j + 4]
?? ??? ??? ??? ?&& board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?
?? ?//豎
?? ?for (i = 0; i < row - 4; i++)
?? ?{
?? ??? ?for (j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j]
?? ??? ??? ??? ?&& board[i + 2][j] == board[i + 3][j] && board[i + 3][j] == board[i + 4][j]
?? ??? ??? ??? ?&& board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?
?? ?//兩個對角線
?? ?for (i = 0; i < row - 4; i++)
?? ?{
?? ??? ?for (j = 0; j < col - 4; j++)
?? ??? ?{
?? ??? ??? ?if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2]
?? ??? ??? ??? ?&& board[i + 2][j + 2] == board[i + 3][j + 3] && board[i + 3][j + 3] == board[i + 4][j + 4]
?? ??? ??? ??? ?&& board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?
?? ?for (i = 0; i < row - 4; i++)
?? ?{
?? ??? ?for (j = col-1; j >= 4; j--)
?? ??? ?{
?? ??? ??? ?if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2]
?? ??? ??? ??? ?&& board[i + 2][j - 2] == board[i + 3][j - 3] && board[i + 3][j - 3] == board[i + 4][j - 4]
?? ??? ??? ??? ?&& board[i][j] != ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return board[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?
?? ?//判斷是否平局
?? ?if (1 == IsFull(board, ROW, COL))
?? ?{
?? ??? ?return 'Q';
?? ?}
?? ?return 'C';
}test.c
#define _CRT_SECURE_NO_WARNINGS 1
?
#include "game.h"
?
void menu()
{
?? ?printf("***********************\n");
?? ?printf("*******五子棋游戲*******\n");
?? ?printf("**** 1.play ?0.exit ***\n");
?? ?printf("***********************\n");
}
?
// # | * |
//---|---|---
// * | ? |
//---|---|---
// ? | ? | ??
//?
//告訴我們四種游戲的狀態(tài)
//玩家贏-'*'
//電腦贏-'#'
//平局 ?-'Q'
//繼續(xù) ?-'C'
?
?
//游戲的整個算法實(shí)現(xiàn)
void game()
{
?? ?char ?ret = 0;//接收四種狀態(tài)的返回值
?? ?//數(shù)組-存放走出的棋盤信息
?? ?char board[ROW][COL] = { 0 };//全部空格
?? ?InitBoard(board, ROW, COL);//初始化棋盤
?? ?//打印棋盤
?? ?DisplayBoard(board, ROW, COL);
?? ?//下棋
?? ?while (1)
?? ?{
?? ??? ?//玩家下棋
?? ??? ?PlayerMove(board, ROW, COL);
?? ??? ?DisplayBoard(board, ROW, COL);
?? ??? ?//判斷玩家是否贏
?? ??? ?ret = IsWin(board, ROW, COL);
?? ??? ?if (ret != 'C')
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?//電腦下棋
?? ??? ?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");
?? ?}
}
?
void test()
{
?? ?int input = 0;
?? ?srand((unsigned int)time(NULL));
?? ?do
?? ?{
?? ??? ?menu();
?? ??? ?printf("請選擇:>");
?? ??? ?scanf("%d", &input);
?? ??? ?switch(input)
?? ??? ?{
?? ??? ??? ?case 1:
?? ??? ??? ??? ?game();
?? ??? ??? ??? ?break;
?? ??? ??? ?case 0:
?? ??? ??? ??? ?printf("退出游戲\n");
?? ??? ??? ??? ?break;
?? ??? ??? ?default:
?? ??? ??? ??? ?printf("選擇錯誤,請重新選擇!\n");
?? ??? ??? ??? ?break;
?? ??? ?}
?? ?} while (input);
}
?
int main()
{
?? ?test();
?? ?return 0;
}功能測試



以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的string庫函數(shù)常見函數(shù)的作用和使用方法
這篇文章主要介紹了C++中的string庫函數(shù)常見函數(shù)的作用和使用方法,庫函數(shù)的靈活應(yīng)用是程序員的一大重要技能,本文通過實(shí)例實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-04-04
如何利用C語言實(shí)現(xiàn)最簡單的HTTP服務(wù)器詳解
這篇文章主要給大家介紹了關(guān)于如何利用C語言實(shí)現(xiàn)最簡單的HTTP服務(wù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
利用C++11原子量如何實(shí)現(xiàn)自旋鎖詳解
當(dāng)自旋鎖嘗試獲取鎖時以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用,下面這篇文章主要給大家介紹了關(guān)于利用C++11原子量如何實(shí)現(xiàn)自旋鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-06-06
C++中char*轉(zhuǎn)換為LPCWSTR的解決方案
最近在學(xué)習(xí)C++,遇到了一個char*轉(zhuǎn)換為LPCWSTR的問題,通過查找資料終于解決了,所以下面這篇文章主要介紹了C++中char*轉(zhuǎn)LPCWSTR的解決方案,文中通過詳細(xì)的示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
c++中vector<int>和vector<int*>的用法及區(qū)別
這篇文章主要介紹了c++中vector<int>和vector<int*>的用法及區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2013-10-10

