C語(yǔ)言代碼實(shí)現(xiàn)三子棋小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)思路
三子棋的C語(yǔ)言設(shè)計(jì)的思路:
1.設(shè)計(jì)一個(gè)界面:讓玩家運(yùn)行后即可以看到一個(gè)界面,而此時(shí)界面需要一個(gè)讓玩家選擇的語(yǔ)句,即可以選擇玩游戲或者退出操作。界面設(shè)計(jì)需要swich語(yǔ)句的實(shí)現(xiàn),退出游戲設(shè)計(jì)選項(xiàng)為0,即可以當(dāng)選擇退出游戲時(shí)直接退出while(循環(huán)),即結(jié)束游戲。
2.游戲?qū)崿F(xiàn):當(dāng)玩家選擇玩游戲時(shí),調(diào)用啟動(dòng)游戲的函數(shù),而在游戲中,應(yīng)當(dāng)有的內(nèi)容有:
(1)游戲內(nèi)的棋盤設(shè)計(jì):三子棋應(yīng)當(dāng)是三行三列的一個(gè)棋盤,通過(guò)函數(shù)打印出來(lái)。
(2)玩家的移動(dòng):玩家輸入相應(yīng)的坐標(biāo)然后將屬于玩家的標(biāo)記打印在棋盤上,且電腦不能在同一位置打印。
(3)電腦的移動(dòng):電腦應(yīng)隨即控制,即調(diào)用rand函數(shù),使用time和時(shí)間隨機(jī)。
(4)輸贏的處理:這里需要給出判斷輸贏的條件:即任意一行或一列或?qū)蔷€相同即為贏,通過(guò)標(biāo)記的符號(hào)來(lái)判斷玩家贏還是電腦贏,如果棋盤放滿且仍未判斷出輸贏,則為平局。
(5)函數(shù)的調(diào)用處理:在函數(shù)調(diào)用時(shí),每走一步,應(yīng)打印出相對(duì)應(yīng)的棋盤供玩家觀看,定義一個(gè)頭文件直接將所需函數(shù)的頭文件以及所需要的定義的行列常量,函數(shù)聲明放在里面,在代碼中只需用COL和ROW表示即可,需要修改棋盤的時(shí)候,只需修改頭文件中的define所定義的COL以及ROW。
代碼實(shí)現(xiàn):
首先是游戲的界面代碼:直接用printf打印出來(lái)即可
void meun() { printf("****************\n"); printf("*****0.Exit*****\n"); printf("*****1.Play*****\n"); printf("****************\n"); }
然后設(shè)計(jì)出三子棋的棋盤
void ShowBoard(char board[][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ",board[i][j]); if (j < col-1) { printf("|"); } } printf("\n"); if (i < row - 1) { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } }
玩家的移動(dòng)實(shí)現(xiàn),特別提到的是,實(shí)現(xiàn)時(shí)注意玩家輸入的坐標(biāo)與數(shù)組對(duì)應(yīng)下標(biāo)的關(guān)系:玩家輸入的坐標(biāo)對(duì)應(yīng)的數(shù)組下標(biāo)應(yīng)該減一。
void PlayerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("請(qǐng)輸入你的坐標(biāo):\n"); scanf("%d%d",&x,&y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'X'; break; } } else { printf("坐標(biāo)有誤,請(qǐng)重新輸入\n"); } } }
電腦下棋的功能實(shí)現(xiàn):(用time讓rand函數(shù)變成隨機(jī)值而不固定隨機(jī))
void ComputerMove(char board[][COL], int row, int col) { while (1) { srand((unsigned)time(NULL)); int x = rand() % ROW; int y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = 'O'; break; } } }
輸贏的處理(代碼與思路一致,有IsWin函數(shù)(判斷輸贏),IsFull(判斷平局))
char IsWin(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]!=' ') { return board[i][0]; } if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[0][2]; } if (IsFull(board, row, col) == 1) { return 'Q'; } } return ' '; } static int IsFull(char board[][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0; } } } return 1; }
最后就是函數(shù)調(diào)用問(wèn)題,設(shè)計(jì)一個(gè)函數(shù)game()來(lái)調(diào)用設(shè)計(jì)好的代碼功能,進(jìn)行游戲功能的實(shí)現(xiàn)
void game() { char board[ROW][COL] = {0}; InitBoard(board, ROW, COL); ShowBoard(board, ROW, COL); int ret = 0; while (1) { PlayerMove(board, ROW, COL); ComputerMove(board, ROW, COL); ShowBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } } if (ret == 'X') { printf("玩家贏\n"); } if (ret == 'O') { printf("電腦贏\n"); } if (ret == 'Q') { printf("平局\n"); } }
主函數(shù)作為入口,讓玩家自由選擇進(jìn)入游戲或者退出
int main() { int input = 0; do { meun(); printf("請(qǐng)選擇是否進(jìn)入游戲:"); scanf("%d",&input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇有誤,請(qǐng)重新輸入\n"); break; } } while (input); return 0; }
一些需要調(diào)用的庫(kù)函數(shù)以及定義,函數(shù)聲明放在自定義頭文件中調(diào)用即可
#ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include<stdlib.h> #pragma once #define ROW 3 #define COL 3 void InitBoard(char board[][COL],int row,int cow); void ShowBoard(char board[][COL], int row, int col); void PlayerMove(char board[][COL], int row, int col); void ComputerMove(char board[][COL], int row, int col); char IsWin(char board[][COL], int row, int col); #endif
運(yùn)行結(jié)果
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++?二叉樹的實(shí)現(xiàn)超詳細(xì)解析
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-03-03利用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單三子棋游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言動(dòng)態(tài)內(nèi)存分配知識(shí)點(diǎn)及實(shí)例,需要的朋友們可以學(xué)習(xí)下。2020-03-03C++紅黑樹的底層實(shí)現(xiàn)機(jī)制詳解
紅黑樹與AVL樹一樣,也是一種自平衡的二叉搜索樹,它在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,本文介紹了C++紅黑樹的底層實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2024-08-08